IPSec: OpenBSD <--> Linux

Тестовый стенд: 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *