======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 ===== Полезные ссылки: ===== http://www.onlamp.com/lpt/a//bsd/2001/12/10/ipsec.html \\ http://www.netbsd.org/Documentation/network/ipsec \\ http://www.kame.net/newsletter/19991007 \\