Инструменты пользователя

Инструменты сайта


unix:some-about-ipsec

IPsec на FreeBSD

(null@openbsd.ru)

ESP/TRANSPORT

Добавляем в ядро:

options		IPSEC,IPSEC_ESP,IPSEC_DEBUG

Пересобираем ядро:

cd /usr/src
make buildkernel KERNCONF=WILD
make installkernel KERNCONF=WILD

Перезагружаем машину:

shutdown -r now

Задача: Есть две машины: 192.168.0.173 и 192.168.0.159. Нужно организовать шифрованный трафик между этими машинами.

Правим /etc/rc.conf:

ipsec_enable="YES"

Добавляем ключи в SAD (Security Association Database) и policy в SPD (Security Policy Database):

192.168.0.173:

Теперь /etc/ipsec.conf:

flush;
spdflush;
add 192.168.0.173 192.168.0.159 esp 1582 -E blowfish-cbc "Gfhkfvtyn";
add 192.168.0.159 192.168.0.173 esp 8213 -E blowfish-cbc "Gfhkfvtyn";
spdadd 192.168.0.173/32 192.168.0.159/32 any -P out ipsec
      esp/transport/192.168.0.173-192.168.0.159/require;
spdadd 192.168.0.159/32 192.168.0.173/32 any -P in ipsec
      esp/transport/192.168.0.159-192.168.0.173/require;

Теперь при загрузке сервера policy и ключи будут читаться из ipsec.conf. Загрузим policy без перезагруки: setkey -f /etc/ipsec.conf

Краткое пояснение:

Добавление ключа:

add 192.168.0.173 192.168.0.159 esp 1582 -E blowfish-cbc "Gfhkfvtyn";

192.168.0.173 - источник
192.168.0.159 - получатель (peer)
ESP - протокол
1582 - SPI (Security Parameter Index, уникальный идентификатор)
-E blowfish - алгоритм шифрования
Gfhkfvtyn - секретный ключ (мы использовали слово «Парламент», введя его англ.буквами)

Ключи можно сгенерировать следующим образом, к примеру, для blowfish-cbc: (пример создания 448 битного ключа, (56 байт)):

openssl rand 56 | hexdump -e '56/1 "%02x"'

Ключ blowfish может быть размером в диапазоне от 40 бит (5 байт) до 448 бит (56 байт). Таким образом, представить ключ в шестнадцатеричном виде можно добавив к началу строки 0x. Пример:

add x.x.x.x x.x.x.x esp xxxx 
-E blowfish-cbc 0xb70d21aac198343627e55c0bd42cb5cf1bf3d2c3b3608bd20f30146c977a31aeab8d5e0a8c531c09d47f8fc4d684ac5399c73f2dde35a7b9;

Policy:

spdadd 192.168.0.173/32 192.168.0.159/32 any -P out ipsec
      esp/transport/192.168.0.173-192.168.0.159/require;

192.168.0.173/32 - источник
192.168.0.159/32 - получатель (peer)
any - любой протокол
-P out - исходящий трафик

Т.е. шифровать исходящий пакет, если он идет с 192.168.0.173 на 192.168.0.159, подразумевается любой протокол, используется протокол ESP/transport

(тоже самое на другой машине делаем)

192.168.0.159:

flush;
spdflush;
add 192.168.0.159 192.168.0.173 esp 8213 -E blowfish-cbc "Gfhkfvtyn";
add 192.168.0.173 192.168.0.159 esp 1582 -E blowfish-cbc "Gfhkfvtyn";
spdadd 192.168.0.159/32 192.168.0.173/32 any -P out ipsec
      esp/transport/192.168.0.159-192.168.0.173/require;
spdadd 192.168.0.173/32 192.168.0.159/32 any -P in ipsec
      esp/transport/192.168.0.173-192.168.0.159/require;

Проверяем нашу работу:
setkey -D - для просмотра содержимого SA (keys)
setkey -DP - просмотр содержимого SP (policy)
tcpdump -i rl1 -x -X -s 14400

ESP/TUNNEL

Задача: Организовать защищенный тунель между двумя сетями: 192.168.0.0/24 (A) и 192.168.36.0/26 (B), т.к. эти две точки («A» и «B») соединены по радио, что позволяет кому-либо «подсматривать» трафик. В случае с защищенным тунелем это будет невозможным.

(A):
внутренний адрес: 192.168.0.1/24
внешний адрес: 10.0.6.17

(B): внутренний адрес: 192.168.36.1/26
внешний адрес: 10.0.13.2

Для использования тунеля, нам надо перекомпилировать ядро с поддержкой gif: FreeBSD < 4.4 достаточно добавить:

pseudo-device   gif 4

FreeBSD >= 4.4:

pseudo-device gif

Также убедитесь, что у вас в ядре стоит:

options         IPSEC,IPSEC_ESP,IPSEC_DEBUG

Итак, сами скрипты на двух точках:

10.0.6.17 (192.168.0.0/24)

#!/bin/sh
 
gifconfig gif0 10.0.6.17 10.0.13.2
ifconfig gif0 inet 10.100.0.1 10.100.0.2 netmask 255.255.255.252
route -q add -net 192.168.36.0 -netmask 255.255.255.192 -gateway 10.100.0.2
route -q add 10.100.0.2 10.100.0.1
 
setkey -FP
setkey -F
setkey -c << EOF
add 10.0.6.17 10.0.13.2 esp 5213 -E blowfish-cbc ":jgf c hexrfvb";
add 10.0.13.2 10.0.6.17 esp 6199 -E blowfish-cbc "D gbple!";
spdadd 192.168.0.0/24 192.168.36.0/26 any -P out ipsec
        esp/tunnel/10.0.6.17-10.0.13.2/require;
spdadd 192.168.36.0/26 192.168.0.0/24 any -P in ipsec
        esp/tunnel/10.0.13.2-10.0.6.17/require;
EOF

10.0.13.2 (192.168.36.0/26)

#!/bin/sh
 
gifconfig gif0 10.0.13.2 10.0.6.17
ifconfig gif0 inet 10.100.0.2 10.100.0.1 netmask 255.255.255.252
route -q add -net 192.168.0 10.100.0.1 
route -q add 10.100.0.1 10.100.0.2
 
setkey -FP
setkey -F
setkey -c << EOF
add 10.0.6.17 10.0.13.2 esp 5213 -E blowfish-cbc ":jgf c hexrfvb";
add 10.0.13.2 10.0.6.17 esp 6199 -E blowfish-cbc "D gbple!";
spdadd 192.168.36.0/26 192.168.0.0/24 any -P out ipsec
        esp/tunnel/10.0.13.2-10.0.6.17/require;
spdadd 192.168.0.0/24 192.168.36.0/26 any -P in ipsec
        esp/tunnel/10.0.6.17-10.0.13.2/require;
EOF

Проверяем:

tcpdump -i rl1 -x -X -s 14400 'host 10.0.13.2 and host 10.0.6.17'

Обязательно почитайте:
man setkey - где можно найти описание, какие алогритмы шифрования можно использовать, какой длинны ключ может быть и т.п. RFC 2406

Также см.:
netstat -p ipsec
netstat -p pfkey

Полезные ссылки:

unix/some-about-ipsec.txt · Последнее изменение: 2014/07/19 11:03 (внешнее изменение)