Содержание
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