Вопрос: Настройка IPSec тоннеля между межсетевым экраном DFL-100 и FreeBSD 4.10 + Racoon

Ответ: 

Версии используемых средств:

FreeBSD 4.10

Racoon 20040818a

OpenSSL 0.9.7d

www.openssl.org

Межсетевой экран DFL-100

Hardware Version: 4A1
Firmware Version: 2.29

И так, мы имеем сеть вида 192.168.0.х/24 с шлюзом DFL-100 с внутренним адресом 192.168.0.1.

Внешний адрес у DFL-100 - 200.168.135.100

Другая сеть вида 192.168.1.х/24 работает через шлюз FreeBSD с внутренним адресом 192.168.1.10

Внешний адрес у шлюза с FreeBSD - 200.168.135.220

Настройка FreeBSD

ШАГ 1

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

options IPSEC
options IPSEC_ESP


И пересобираем ядро.

ШАГ 2


В /etc/rc.conf добавляем:

ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"
ike_enable="YES"
ike_program="/usr/local/sbin/racoon" (как настроить Racoon - ниже)

ШАГ 3

Создаем файл /etc/ipsec.conf:

flush;
spdflush;
spdadd 192.168.1.0/24 192.168.0.0/24 any -P out ipsec esp/tunnel/200.168.134.220-200.168.134.100/require;
spdadd 192.168.0.0/24 192.168.1.0/24 any -P in ipsec esp/tunnel/200.168.134.100-200.168.134.220/require;

ШАГ 4

Ставим и настраиваем Racoon:

В моем случае я его ставил с пакетов : pkg_add racoon-20040818a.tgz

Настраиваем /usr/local/etc/racoon/racoon.conf:

path include "/usr/local/etc/racoon";
path pre_shared_key "/usr/local/etc/racoon/psk.txt";
path certificate "/usr/local/etc/cert";

#log debug

padding

{
maximum_length 20; # maximum padding length.
randomize off; # enable randomize length.
strict_check off; # enable strict check. e
exclusive_tail off; # extract last one octet.
}

listen
{
isakmp 200.168.134.220 [500];
}

timer
{
# These value can be changed per remote node.
counter 5; # maximum trying count to send.
interval 20 sec; # maximum interval to resend
persend 1; # the number of packets per a send.
# timer for waiting to complete each phase.
phase1 30 sec;
phase2 15 sec;
}

remote anonymous
{
exchange_mode main,aggressive;
#exchange_mode aggressive,main;
doi ipsec_doi;
situation identity_only;

nonce_size 16;
lifetime time 3600 sec; # sec,min,hour
initial_contact on;
support_mip6 on;
proposal_check obey; # obey, strict or claim

proposal {
encryption_algorithm 3des;
hash_algorithm md5;
authentication_method pre_shared_key;
dh_group 2;
}
}

sainfo anonymous
{
pfs_group 1;
lifetime time 3600 sec;
encryption_algorithm 3des;
authentication_algorithm hmac_md5;
compression_algorithm deflate;
}

Настраиваем файл ключей /usr/local/etc/racoon/psk.txt :

200.168.134.100 qwerty

Также следует установить права на psk.txt:

chmod 0600 /usr/local/etc/racoon/psk.txt

Без этого Racoon будет считать права на файл psk.txt слабыми, и не будет читать его читать.

ШАГ 5

В файл с правилами файервола IPFW /etc/rc.firewall необходимы, как минимум эти строки:

${fw} add pass UDP from any 500 to any 500 ${fw} add pass ESP from any to any

где, fw="sbin/ipfw"

Конечно, с точки зрения безопасности очень желательно, чтобы все было описано более явно и четко, но это дело вкуса. =)

Настройка DFL-100

В первую очередь, на вкладке Advanced Settings / VPN Settings /IPSec Status настраиваем статус IPSec. По умолчанию, IPSec включен.

Важно! Настраиваем параметр Negotiation ID - этот параметр, заданный на DFL-100, служит для организации тоннеля и указывается на удаленном устройстве в привязке к ключу шифрации. Т.к. на BSD машине ключ шифрации мы привязываем к IP адресу, то в данной схеме мы должны на DFL-100 указать в поле Negotiation ID IP - адрес wan интерфейса DFL-100. Иначе тоннель не будет установлен!
Т.о. в данной схеме Negotiation ID = 200.168.134.100

Далее, на вкладке Advanced Settings / VPN Settings / IPSec Tunnel Mode задаем настройки для конкретного тоннеля. За подробностями понимания всех этих настроек можно обратится к документации по IPSec - она широко представлена в Интернет.
В данном случае на этой вкладке, при работе с маршрутизатором BSD, поле Negotiation ID носит информативный характер - можно указать любое значение.
Далее, параметр Remote Gateway IP - это IP-адрес WAN-интерфейса устройства, стоящего на другом конце тоннеля, т.е. 200.168.134.220
Параметр Remote IP Network - это внутренняя сеть LAN, подключенная к устройству, стоящему на другом конце тоннеля, т.е. 192.168.1.0
Параметр Remote IP Netmask - маска подсети для предыдущего пункта, т.е. 255.255.255.0
Все остальные параметры должны быть одинаковые на обоих устройствах, организующих IPSec соединение.

Примечание: Здесь выбор настроек определяется пользователем исходя из требований производительности или надежности. Приведенные ниже настройки даны в качестве примера. Вы также можете использовать другие комбинации - необходимое требование при этом одно: настройки должны быть идентичны на обоих устройствах, организующих IPSec тоннель!

Все, на этом конфигурирование устройств закончено

Для отладки со стороны BSD

я использовал вышеописанные правила IPFW с параметром log:

${fw} add pass log UDP from any 500 to any 500
${fw} add pass log ESP from any to any

в файле /var/log/security должно быть примерно следующее:

FreeBSD-Main /kernel: ipfw: 350 Accept ICMP:8.0 192.168.1.1 192.168.0.10 in via …..
FreeBSD-Main /kernel: ipfw: limit 1 reached on entry 350
FreeBSD-Main /kernel: ipfw: 1100 Accept UDP 192.168.134.220:500 192.168.134.100:500 out via ….
FreeBSD-Main /kernel: ipfw: limit 1 reached on entry 1100
FreeBSD-Main /kernel: ipfw: 1150 Accept P:50 192.168.134.220 192.168.134.100 out via ….
FreeBSD-Main /kernel: ipfw: limit 1 reached on entry 1200

для отладки Racoon'а можно использовать такой запуск:
/usr/local/sbin/racoon -F -v -а /usr/local/etc/racoon/racoon.conf
На экране, в случае удачного соединения должно быть примерно следующее:

2000-00-09 12:32:55: INFO: main.c:172:main(): @(#)package version freebsd-20040818a
2000-00-09 12:32:55: INFO: main.c:174:main(): @(#)internal version 20001216 sakane@kame.net
2000-00-09 12:32:55: INFO: main.c:175:main(): @(#)This product linked OpenSSL 0.9.7d 17 Mar 2004 (http://www.openssl.org/)
2000-00-09 12:32:55: INFO: isakmp.c:1368:isakmp_open(): 200.168.134.220[500] used as isakmp port (fd=5)
2000-00-09 12:33:24: INFO: isakmp.c:904:isakmp_ph1begin_r(): respond new phase 1 negotiation:
200.168.134.220[500]<=>200.168.134.100[500]
2000-00-09 12:33:24: INFO: isakmp.c:909:isakmp_ph1begin_r(): begin Identity Protection mode.
2000-00-09 12:33:26: INFO: isakmp.c:2459:log_ph1established(): ISAKMP-SA established
200.168.134.220[500]-200.168.134.100[500] spi:021b5ee9640d1f:4f24008f5c15ee
2000-00-09 12:33:26: INFO: isakmp.c:1059:isakmp_ph2begin_r(): respond new phase 2 negotiation:
200.168.134.220[0]<=>200.168.134.100[0]
2000-00-09 12:33:27: INFO: pfkey.c:1197:pk_recvupdate(): IPsec-SA established: ESP/Tunnel 200.168.134.100->200.168.134.220
spi=15535903(0x949761)
2000-00-09 12:33:27: INFO: pfkey.c:1420:pk_recvadd(): IPsec-SA established: ESP/Tunnel 200.168.134.220->200.168.134.100
spi=237052007(0x8d4b4d1)

Проверка

Теперь для поднятия тоннеля между устройствами посылаем icmp-запрос из одной подсети в другую:

Контролируем процесс на DFL-100 :

Компания D-link выражает свою благодарность Вадиму Рыбакову за составление данного материала. С ним Вы можете связаться по e-mail: vadimnot at yandex.ru