Racoon vs. OpenSWAN: Настройка IPSEC VPN туннеля HOST-TO-SITE с Cisco и L2TP over IPSEC для Windows, iOS и Android

от автора

Добрых дел, уважаемые Хабравчане!

В данной статье я хотел бы увлечь вас рассказом о моих приключениях в поисках надежных и безопасных связей IPSec, где поджидает множество удивительных открытий и разочарований, загадок и ответов, историй верной службы и вероломных предательств. Итак, мой дорогой читатель, приготовься, начинаем повествование.

Читателю, которому требуется срочная помощь, а не рассказы о моих несчастьях, приведших к написанию данного топика, рекомендую пролистать до заголовка «Собственно сабж»

Где-то с полгода назад мне понадобилось поднять сервер для платежных терминалов с подключением к платежной системе по IPSec. Мой выбор пал на Debian Squeeze и KAME ipsec-tools, в простонародье racoon. Ох, и не знаю, почему моя душа прикипела к данному приложению. Сначала, поверхностно изучив теорию IPSec, я взялся за практику:

apt-get install racoon 

Ракун успешно скачался, установился, утянув за собой еще кучу пакетов и радостно известил меня о том, что он тут.

На другой стороне ждала его возлюбленная CISCO, которая, правда, стабильно поддерживала еще пару десятков защищенных связей, но с нетерпением ждала, что наш герой к ней постучится, назовет PreShared Key и заключит ее в объятия своего надежного IPSec канала.

Но перед этим нужно было пройти трудное испытание, ведь строгий, но справедливый отец CISCO — сисадмин на той стороне, не давал доступа к своей подопечной без успешного прохождения испытания. Условия прохождения были следующими:

IKE 3DES  	HASH SHA-1  	Diffie Hellman Grupo 2  	Life Time 86400 seconds  	Authentication by Preshared Key   IPSec	 3DES  	Integrity : ESP/SHA1  	Mode: Tunel  	Perfect Forward Secrecy (Active)  	Lifetime 3600 seconds   x.x.x.x - IP адрес моего сервера, он же сервер приложений y.y.y.y - IP Cisco z.z.z.z - IP сервера приложений за Cisco 

Чтобы помочь влюбленным, еще примерно пару дней ушло на создание более или менее работающего конфига. И наконец, любовь восторжествовала. Одной из проблем было переделывание конфигов из существующих site-to-site, пришлось немного напрячь мозг и вспомнить, что один хост — это та же сеть, только с маской подсети 255.255.255.255, то есть /32.

Но счастье было не долгим. Возникла задача подключить и клиентские хосты по L2TP over IPSec, и здесь Ракун не смог справится. Сначала потребовалась операция по пересборке ipsec-tools, чтобы он мог поддерживать wildcard (*) для preshared key, так как IP-адреса клиентских машин неизвестны. Выглядело сие безобразие как-то так:

diff -ur a/ipsec-tools-0.7.1/src/racoon/localconf.c b/ipsec-tools-0.7.1/src/racoon/localconf.c --- a/ipsec-tools-0.7.1/src/racoon/localconf.c	2006-09-09 11:22:09.000000000 -0500 +++ b/ipsec-tools-0.7.1/src/racoon/localconf.c	2010-08-06 16:35:18.000000000 -0500  <at>  <at>  -211,7 +211,8  <at>  <at>   		if (*p == '\0')  			continue;	/* no 2nd parameter */  		p--; -		if (strncmp(buf, str, len) == 0 && buf[len] == '\0') { +		if (strncmp(buf, "*", 2) == 0 || +		    (strncmp(buf, str, len) == 0 && buf[len] == '\0')) {  			p++;  			keylen = 0; 

Банальное разрешение зависимостей при сборке потребовало еще недели кропотливого курения мана, потому что не мог пройти дальше ./configure. В итоге, я наткнулся на статью BenV, которая многозначительно вещала: And you trust your security to these clowns (И вы доверяете свою безопасность этим клоунам). Не придав большого значения этим словам, ведь статья мою проблему решила, я успешно собрал, подключил и заставил Ракун работать теперь и в конфигурации Road Warrior.

Настройки L2TP

C L2TP проблем не было:

Установил xl2tp и ppp

apt-get install xl2tp ppp 

Настроил согласно множеству How-to:

# /etc/xl2tpd/xl2tpd.conf [global] ipsec saref = yes force userspace = yes [lns default] local ip = 10.1.2.1 ip range = 10.1.2.10-10.1.2.254 # пул адресов для клиентов refuse pap = yes require authentication = yes ppp debug = yes length bit = yes pppoptfile = /etc/ppp/options    # /etc/ppp/options:  ms-dns  10.1.2.1 ms-dns  8.8.8.8 require-mschap-v2 asyncmap 0 auth crtscts lock hide-password modem debug name l2tpd proxyarp lcp-echo-interval 10 lcp-echo-failure 100    #/etc/ppp/chap-secrets:  # Secrets for authentication using CHAP # client        server  secret                  IP addresses username        *       userpass                *  # имя пользователя и пароль в подключении. Вместо звездочки в колонке IP addresses можно вставить адрес, который вы хотите присвоить определенному логину. У меня например для пользователя alvelig задается адрес 10.1.2.7 alvelig               *        alvelig                 10.1.2.7 

А вот с ipsec-tools пришлось повозиться. Приведу рабочий конфиг ракуна:

# /etc/racoon/racoon.conf: path include "/etc/racoon"; path pre_shared_key "/etc/racoon/psk.txt"; # путь до PreShared Keys файла (см. чуть ниже) path certificate "/etc/racoon/certs";  # конфиг IKE для Road Warrior remote anonymous {         exchange_mode aggressive,main;         passive on;         proposal_check obey;         support_proxy on;         nat_traversal on;         ike_frag on;         dpd_delay 20;         proposal         {                 encryption_algorithm aes;                 hash_algorithm sha1;                 authentication_method pre_shared_key;                 dh_group modp1024;         }         proposal         {                 encryption_algorithm 3des;                 hash_algorithm sha1;                 authentication_method pre_shared_key;                 dh_group modp1024;         } }  # IPSEC для Road Warrior и CISCO sainfo anonymous {         pfs_group 2;         lifetime time 3600 sec;         encryption_algorithm 3des;         authentication_algorithm hmac_sha1;         compression_algorithm deflate ; }  # IKE для CISCO remote y.y.y.y {         exchange_mode main, aggressive;         my_identifier address;         lifetime time 86400 sec;         nat_traversal on;         dpd_delay     20;         proposal {                 encryption_algorithm 3des;                 hash_algorithm sha1;                 authentication_method pre_shared_key;                 dh_group 2;         } }  
# /etc/racoon/psk.txt:  # PSK для Cisco 200.68.5.131            CiscoPSK  # PSK для клиентов за NAT *                       RoadWarrior  
# /etc/ipsec-tools.conf #!/usr/sbin/setkey -f # # Flush SAD and SPD flush; spdflush; # Create policies for racoon  spdadd x.x.x.x/32 z.z.z.z/32 any -P out ipsec esp/tunnel/x.x.x.x-y.y.y.y/require; spdadd z.z.z.z/32 x.x.x.x/32 any -P in ipsec esp/tunnel/y.y.y.y-x.x.x.x/require;  ########################## ##      XL2TP           ## ##########################  spdadd 0.0.0.0/0[0] 0.0.0.0/0[1701] udp -P in ipsec esp/transport//require; spdadd 0.0.0.0/0[1701] 0.0.0.0/0[0] udp -P out ipsec esp/transport//require;   

Но через неделю успешной работы туннель оказался вдруг неактивным, и единственное средство, которое помогало, — это restart racoon или reboot.

Проект был пилотным, туча других дел, и, в общем, на костылях и заплатках протянул пару месяцев.

Наконец, у меня дошли руки до того, чтобы разобраться досконально в вопросе, и в надежде на bug-fixes и прочие неуловимые вещи я собрал свежую версию ipsec-tools 0.8.1. И сразу же после старта racoon сообщил мне о тяжелой болезни — segmentation fault.

Такого удара я вынести не смог. Не спал ночь: думал, как же так…

Проснувшись утром, выпил чаю, закусил бутербродом и сел за компьютер. Внезапно в голове загорелась мысль: OpenSWAN! Ай да, попробуем!

Собственно сабж

apt-get install openswan 

Aptitude ругнулся на то, что OpenSWAN не дружит с racoon, и с былым другом нам придется попрощаться. Ну, была не была, подумал я и подтвердил установку OpenSWAN.

После долгих мучений настройки racoon настройка OpenSWAN оказалась легче легкого (или, может, я опыта уже набрался):

# /etc/ipsec.conf  config setup # Общий раздел для всех подключений         nat_traversal=yes # для клиентов за NAT          conn cisco # Туннель к циске         dpddelay=30 # Dead peer detection - 30 секунд - интервал между keep-alive пакетами         dpdtimeout=120 # dpd таймаут 120 секунд, после которого хост будет объявлен недоступным         dpdaction=restart # перезапустить процесс подключения к хосту          # IKE alg 3DES - HASH sha1 - DH group 2 (1024)          ike=3des-sha1-modp1024          # IKE lifetime 86400 seconds (24 hours)         ikelifetime=86400s          # IKE auth method Pre-Shared Key (PSK secret)         authby=secret          # IPSEC params         # Закомментированные настройки уже по умолчанию установлены в OpenSWAN         # phase2=esp # by default         # phase2=3des-sha1 # by default the same as IKE         # IPSec type tunnel         type=tunnel # режим - туннель         # IPSEC (key) lifetime         salifetime=3600s         # Perfect Forward Secrecy PFS group the same as IKE (1024)         pfs=yes # включить Perfect Forward Secrecy          #left side (myside)         left=x.x.x.x # OpenSWAN side         # в моем случае хост был один, и он же был и шлюзом IPSec, поэтому netmask x.x.x.x/32         leftsubnet=x.x.x.x/32 #net subnet on left side to assign to right side         leftnexthop=y.y.y.y # CISCO side          #right security gateway (CISCO side)         right=y.y.y.y #CISCO side         rightsubnet=z.z.z.z/32 #net on right side         rightnexthop=x.x.x.x # OpenSWAN side         auto=start  # Road Warrior conn L2TP         authby=secret         pfs=no         auto=add         keyingtries=3         rekey=no         ikelifetime=8h         keylife=1h         type=transport         left=x.x.x.x         leftprotoport=17/%any # до этого стояло 1701, но iOS не подключался. Поменял на %any и, о чудо: теперь мой iPad тоже был в сети для мониторинга терминалов!         right=%any         rightprotoport=17/%any         compress=no         dpddelay=30         dpdtimeout=120         dpdaction=clear  # dpdaction=clear это важное замечание, т.к. ipsec здесь восстанавливается  #только по инициации со стороны клиента, то есть, если обнаружили "мертвый peer",  #то все записи по нему надо очистить, чтобы успешно подключить его снова  

Настройки L2TP даже менять не пришлось: все заработало сразу. Настройки L2TP.

ipsec setup start  ping z.z.z.z  64 bytes from z.z.z.z: icmp_req=1 ttl=254 time=7.53 ms 64 bytes from z.z.z.z: icmp_req=2 ttl=254 time=6.59 ms 64 bytes from z.z.z.z: icmp_req=3 ttl=254 time=6.41 ms 64 bytes from z.z.z.z: icmp_req=4 ttl=254 time=6.77 ms 

И это заняло у меня порядка получаса против полутора недель мучений с racoon.

Заключение

К сожалению, как это часто бывает, капризная Циска часто ссорилась и рвала отношения с Ракуном, а вот с OpenSWAN (интересно, какого пола это приложение? может, женского, тогда это многое объясняет) уже третью неделю стабильно и без конфликтов и скандалов.

Постскриптум

Если VPN-соединения с клиентами подключаются, но хосты внутри сети недоступны друг для друга, то вам не хватает:

echo 1 > /proc/sys/net/ipv4/ip_forward 

Или смотрите ваш iptables

Здесь можно взять настройки для клиентов iOS и Windows

Буду благодарен за комментарии, почему racoon выпадал в segfault и терял соединение после недели стабильной работы.

Отдельное спасибо НЛО за инвайт.

ссылка на оригинал статьи http://habrahabr.ru/post/177223/


Комментарии

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

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