Тестовый стенд: OpenBSD 5.4, Debian Linux 6 (kernel 3.2), ipsec transport mode with preshared keys
Настройка IPSec состоит из 2-х частей: настройка IPSec’a и непосредственно настройка обмена ключами (ike).
Имеем самую обычную схему OpenBSD (10.5.5.76) <—> (10.5.5.78) Linux
В данной статье подразумевается настройка полностью с нуля.
OpenBSD
Тут немного проще, чем в Linux/Solaris.
Настраиваем ike. Для этого пишем в файл /etc/ipsec.conf такие строки:
ike active esp transport from 10.5.5.76 to 10.5.5.78 \ peer 10.5.5.78 \ main auth hmac-md5 enc 3des \ quick auth hmac-md5 enc 3des \ psk "Very-Very-Secret-Key-1234567890" ike active esp transport from 10.5.5.78 to 10.5.5.76 \ peer 10.5.5.78 \ main auth hmac-md5 enc 3des \ quick auth hmac-md5 enc 3des \ psk "Very-Very-Secret-Key-1234567890"
В общем случае, формат добавления записей в /etc/ipsec.conf такой:
ike [mode] [encap] [tmode] \ from src to dst \ local localip peer remoteip \ main auth algorithm enc algorithm \ quick auth algorithm enc algorithm \ psk key
Описание опций:
– mode
Defines whether isakmpd will attempt to initiate the IPsec connection or whether it will wait for a connection request from the remote peer. Possible values are:
- active – Tells isakmpd to initiate the IPsec connection. This is the default.
- passive – Tells isakmpd to wait for a connection request.
- dynamic – Tells isakmpd to initiate the IPsec connection and to enable Dead Peer Detection. This mode should be used when the remote peer has a dynamic IP address.
– encap
The transport protocol to use, either “esp” or “ah“.
– tmode
Either “tunnel” or “transport” and indicates whether to enable tunnel mode or transport mode. The default is “tunnel“.
– src
The IP address or subnet where the traffic to be protected is coming from. For a transport mode connection this will be the IP address of the local host. For a tunnel mode connection this will be the subnet and mask of the local network that should have its traffic sent through the IPsec tunnel.
– dest
The IP address or subnet where the protected traffic is being sent to. For a transport mode connection this will be the IP address of the remote host. For a tunnel mode connection this will be the subnet and mask of the remote network that will be reachable through the IPsec tunnel.
– localip
The IP address on the local machine where isakmpd should source the connection from. This option is generally not needed since isakmpd will choose the correct IP address automatically.
– remoteip
The IP address of the remote IPsec gateway.
– algorithm
The authentication or encryption algorithm to use during main mode and quick mode. The possible algorithms are documented in the ipsec.conf(5) man page under the “CRYPTO TRANSFORMS” section.
– key
The pre-shared key.
Для автозапуска при загрузке, добавляем такие строки в /etc/rc.conf.local:
isakmpd_flags="-K" # Avoid keynote(4) policy checking
ipsec=YES
Так же потребуется изменить несколько переменных sysctl:
net.inet.esp.enable=1 # Enable the ESP IPsec protocol
net.inet.ah.enable=1 # Enable the AH IPsec protocol
net.inet.ip.forwarding=1 # Enable IP forwarding for the host. Set it to '2' to forward only IPsec traffic
net.inet.ipcomp.enable=1 # Optional: compress IP datagrams
Запускаем с консоли:
# isakmpd -K
# ipsecctl -f /etc/ipsec.conf
Настройки очень простые. Для продвинутых настроек (время обмена ключами и прочие параметры) можно использовать файл /etc/isakmpd/isakmpd.policy
Linux
Ставим racoon:
# apt-get install racoon
После установки будет задан вопрос о том, что использовать: direct или ipsec-tools:
Configuration mode for racoon IKE daemon.
Выбираем direct
После это можно переопределить, выполнив команду:
# dpkg-reconfigure racoon
После установки приводим файл /etc/ipsec-tools.conf к такому виду (это исполняемый скрипт)
#!/usr/sbin/setkey -f
flush;
spdflush;
spdadd 10.5.5.78 10.5.5.76 any -P out ipsec esp/transport//require;
spdadd 10.5.5.76 10.5.5.78 any -P in ipsec esp/transport//require;
Вписываем парольную фразу в файл /etc/racoon/psk.txt:
10.5.5.76 Very-Very-Secret-Key-1234567890
Обязательно ставим права на файл psk.txt 0600 и владельца root. Без этого соединение не установиться, а racoon будет ругаться.
Приводим главный файл /etc/raccon.conf к такому виду:
path include "/etc/racoon"; path pre_shared_key "/etc/racoon/psk.txt"; log debug; remote 10.5.5.76 { exchange_mode main; proposal { encryption_algorithm 3des; hash_algorithm md5; authentication_method pre_shared_key; dh_group 2; lifetime time 8 hour; } } sainfo anonymous{ pfs_group 5; lifetime time 8 hour; encryption_algorithm 3des; authentication_algorithm hmac_md5; compression_algorithm deflate; }
Почему-то у меня не стартовал racoon через стартовые скрипты, поэтому пришлось добавлять в /etc/rc.local такие строки.
/etc/init.d/setkey start
/etc/init.d/racoon start
После успешного поднятия IPSec’a посмотрим статистику обмена:
# setkey -D 10.5.5.78 10.5.5.76 esp mode=transport spi=1830646201(0x6d1d71b9) reqid=0(0x00000000) E: 3des-cbc 2be2465b 17de93fc 36a4bbd7 80701c3d 014a708f d7fa83b4 A: hmac-md5 20ad897e 2a9fd760 f194405f 5a7b5b5f seq=0x00000000 replay=4 flags=0x00000000 state=mature created: Dec 16 10:49:30 2013 current: Dec 16 10:54:35 2013 diff: 305(s) hard: 28800(s) soft: 23040(s) last: Dec 16 10:49:30 2013 hard: 0(s) soft: 0(s) current: 38912(bytes) hard: 0(bytes) soft: 0(bytes) allocated: 608 hard: 0 soft: 0 sadb_seq=1 pid=2337 refcnt=0 10.5.5.76 10.5.5.78 esp mode=transport spi=1123026(0x001122d2) reqid=0(0x00000000) E: 3des-cbc 8033551c 2a437bca a7f49840 6b4c9297 3599ec3f 66c3a897 A: hmac-md5 54f4f442 de9b2a0d ede65369 9657885d seq=0x00000000 replay=4 flags=0x00000000 state=mature created: Dec 16 10:49:30 2013 current: Dec 16 10:54:35 2013 diff: 305(s) hard: 28800(s) soft: 23040(s) last: Dec 16 10:49:30 2013 hard: 0(s) soft: 0(s) current: 38912(bytes) hard: 0(bytes) soft: 0(bytes) allocated: 608 hard: 0 soft: 0 sadb_seq=2 pid=2337 refcnt=0
И традиционно проверить через tcpdump, что всё шифруется:
# tcpdump -i eth0 host 10.5.5.76 10:49:30.763461 IP 10.5.5.76 > 10.5.5.78: ESP(spi=0x001122d2,seq=0x2), length 100 10:49:30.763594 IP 10.5.5.78 > 10.5.5.76: ESP(spi=0x6d1d71b9,seq=0x1), length 100 10:49:31.025071 IP 10.5.5.78 > 10.5.5.76: ESP(spi=0x6d1d71b9,seq=0x2), length 100 10:49:31.025586 IP 10.5.5.76 > 10.5.5.78: ESP(spi=0x001122d2,seq=0x3), length 100