Транспорт на IPSec
Решил задачку по построению IPSec транспорта между OS FreeBSD и CentOS (в примере 6 версия).
Есть 3 белых IP:
1.1.1.1 – FreeBSD 11.2 = A
2.2.2.2 – FreeBSD 11.2 = B
3.3.3.3 – CentOS 6 (6.10) = C
Задача – зашифровать трафик между серверами A-B, B-C, и авторизация по PSK.
Подготовка хостов FreeBSD
На обоих хостах нужно поставить пакет ipsec-tools и добавить в включить сервисы racoon и IPSec.
Через PKG
1 | pkg install ipsec-tools |
Через порты
1 2 | cd /usr/ports/security/ipsec-tools make install clean |
1 2 3 | sysrc ipsec_enable="YES" sysrc racoon_enable="YES" sysrc racoon_flags="-l /var/log/racoon.log" |
touch /usr/local/etc/racoon/psk.txt /usr/local/etc/racoon/racoon.conf chmod 600 /usr/local/etc/racoon/psk.txt /usr/local/etc/racoon/racoon.conf chown root:wheel /usr/local/etc/racoon/psk.txt /usr/local/etc/racoon/racoon.conf
Грузим IPSec в ядро
1 2 | kldload ipsec sysrc -f /boot/loader.conf ipsec_load="YES" |
… или пересобираем ядро со следующими параметрами
options IPSEC #IP security # options IPSEC_DEBUG #debug for IP security device crypto
Подготовка хоста CentOS
1 2 | yum install epel-release yum install ipsec-tools |
Настройка хостов FreeBSD
Host A 1.1.1.1
/etc/ipsec.conf
flush; spdflush; # A->B spdadd 1.1.1.1/32 2.2.2.2/32 any -P out ipsec esp/transport//require; spdadd 2.2.2.2/32 1.1.1.1/32 any -P in ipsec esp/transport//require;
/usr/local/etc/racoon/psk.txt
2.2.2.2 mySecureKey
/usr/local/etc/racoon/racoon.conf
path include "/usr/local/etc/racoon/racoon"; path pre_shared_key "/usr/local/etc/racoon/psk.txt"; path certificate "/usr/local/etc/racoon/cert"; padding { maximum_length 20; randomize off; strict_check off; exclusive_tail off; } listen { isakmp 1.1.1.1 [500]; strict_address; } timer { counter 5; interval 20 sec; persend 1; phase1 30 sec; phase2 15 sec; } remote 2.2.2.2 { my_identifier address 1.1.1.1; exchange_mode main; ike_frag on; proposal_check claim; doi ipsec_doi; situation identity_only; nonce_size 16; lifetime time 86400 sec; initial_contact on; support_proxy on; proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method pre_shared_key; dh_group 2; lifetime time 28800 sec; } } sainfo anonymous { pfs_group modp2048; encryption_algorithm 3des; authentication_algorithm hmac_sha1; compression_algorithm deflate; lifetime time 28800 sec; }
Host B 2.2.2.2
/etc/ipsec.conf
flush; spdflush; # A->B spdadd 2.2.2.2/32 1.1.1.1/32 any -P out ipsec esp/transport//require; spdadd 1.1.1.1/32 2.2.2.2/32 any -P in ipsec esp/transport//require; # B->C spdadd 2.2.2.2/32 3.3.3.3/32 any -P out ipsec esp/transport//require; spdadd 3.3.3.3/32 2.2.2.2/32 any -P in ipsec esp/transport//require;
/usr/local/etc/racoon/psk.txt
1.1.1.1 mySecureKey 3.3.3.3 mySecureKey
/usr/local/etc/racoon/racoon.conf
path include "/usr/local/etc/racoon/racoon"; path pre_shared_key "/usr/local/etc/racoon/psk.txt"; path certificate "/usr/local/etc/racoon/cert"; padding { maximum_length 20; randomize off; strict_check off; exclusive_tail off; } listen { isakmp 2.2.2.2 [500]; strict_address; } timer { counter 5; interval 20 sec; persend 1; phase1 30 sec; phase2 15 sec; } remote 1.1.1.1 { my_identifier address 2.2.2.2; exchange_mode main; ike_frag on; proposal_check claim; doi ipsec_doi; situation identity_only; nonce_size 16; lifetime time 86400 sec; initial_contact on; support_proxy on; proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method pre_shared_key; dh_group 2; lifetime time 28800 sec; } } remote 3.3.3.3 { my_identifier address 2.2.2.2; exchange_mode main; ike_frag on; proposal_check claim; doi ipsec_doi; situation identity_only; nonce_size 16; lifetime time 86400 sec; initial_contact on; support_proxy on; proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method pre_shared_key; dh_group modp2048; lifetime time 28800 sec; } } sainfo anonymous { pfs_group modp2048; encryption_algorithm 3des; authentication_algorithm hmac_sha1; compression_algorithm deflate; lifetime time 28800 sec; }
Host C 3.3.3.3
Файл /etc/ipsec.conf остается без изменений (листинг без комментариев)
# /etc/ipsec.conf - Libreswan IPsec configuration file config setup protostack=netkey logfile=/var/log/pluto.log dumpdir=/var/run/pluto/ virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10 include /etc/ipsec.d/*.conf
И /etc/ipsec.secrets тоже не меняю
include /etc/ipsec.d/*.secrets
Создаем /etc/ipsec.d/2.2.2.2.conf и /etc/ipsec.d/2.2.2.2.secrets
touch /etc/ipsec.d/2.2.2.2.{conf,secrets} chown root:root /etc/ipsec.d/2.2.2.2.{conf,secrets} chmod 600 /etc/ipsec.d/2.2.2.2.{conf,secrets}
/etc/ipsec.d/2.2.2.2.conf
conn 2.2.2.2 fragmentation=yes authby=secret auto=start type=transport left=2.2.2.2 leftid=2.2.2.2 right=3.3.3.3 ike=3des-sha1;modp2048 phase2=esp phase2alg=3des-sha1;modp2048 salifetime = 28800s
/etc/ipsec.d/2.2.2.2.secrets
2.2.2.2 3.3.3.3: PSK "mySecureKey"
Стартуем IPSec
service ipsec start
Апендикс
Не забываем открыть 500/UDP между нашими серверами и поставить разные PSK на сервера
…пробуем отправить icmp с хоста B на C, tcpdump должен отловить ESP пакет
1 | B $ ping -c 5 3.3.3.3 |
PING 3.3.3.3 (3.3.3.3): 56 data bytes 64 bytes from 3.3.3.3: icmp_seq=0 ttl=55 time=57.147 ms 64 bytes from 3.3.3.3: icmp_seq=1 ttl=55 time=57.156 ms 64 bytes from 3.3.3.3: icmp_seq=2 ttl=55 time=57.124 ms 64 bytes from 3.3.3.3: icmp_seq=3 ttl=55 time=57.185 ms 64 bytes from 3.3.3.3: icmp_seq=4 ttl=55 time=57.066 ms --- 3.3.3.3 ping statistics --- 5 packets transmitted, 5 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 57.066/57.136/57.185/0.040 ms
1 | C $ tcpdump -nnn -i any src or dst 2.2.2.2 |
14:10:28.869335 IP 2.2.2.2 > 3.3.3.3: ESP(spi=0x2d6544f5,seq=0x1e1), length 100 14:10:28.869408 IP 3.3.3.3 > 2.2.2.2: ESP(spi=0x0592c9c7,seq=0x1e0), length 100 14:10:29.895382 IP 2.2.2.2 > 3.3.3.3: ESP(spi=0x2d6544f5,seq=0x1e2), length 100 14:10:29.895450 IP 3.3.3.3 > 2.2.2.2: ESP(spi=0x0592c9c7,seq=0x1e1), length 100 14:10:30.915193 IP 2.2.2.2 > 3.3.3.3: ESP(spi=0x2d6544f5,seq=0x1e3), length 100 14:10:30.915252 IP 3.3.3.3 > 2.2.2.2: ESP(spi=0x0592c9c7,seq=0x1e2), length 100 14:10:31.965408 IP 2.2.2.2 > 3.3.3.3: ESP(spi=0x2d6544f5,seq=0x1e4), length 100 14:10:31.965466 IP 3.3.3.3 > 2.2.2.2: ESP(spi=0x0592c9c7,seq=0x1e3), length 100 14:10:32.995271 IP 2.2.2.2 > 3.3.3.3: ESP(spi=0x2d6544f5,seq=0x1e5), length 100 14:10:32.995344 IP 3.3.3.3 > 2.2.2.2: ESP(spi=0x0592c9c7,seq=0x1e4), length 100
Если ответа нет – смотрим логи FreeBSD /var/log/racoon.log и Linux /var/log/pluto.log,
Также пригодится setkey -D и setkey -DP.
Источники, которые помогли мне в решении задачи:
- Драфт RFC6071 на ietf.org
- FreeBSD handbook
- Ru Wikipedia
- lissyara.su
- opennet.ru
- unixadm.info
- opennet.ru
- opennet.ru
- opennet.ru
- kame.net
- dieg.info
- skeletor.org.ua
- ivorde.com
- meraki.com
- FreeBSD man racoon.conf
- Linux man ipsec.conf