======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 \\