Pull to refresh

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

Reading time 7 min
Views 73K
Добрых дел, уважаемые Хабравчане!

В данной статье я хотел бы увлечь вас рассказом о моих приключениях в поисках надежных и безопасных связей 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
defaultroute
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 # Туннель к циске
        
        forceencaps=yes 
        
        dpddelay=30 # Dead peer detection - 30 секунд - интервал между keep-alive пакетами
        dpdtimeout=120 # dpd таймаут 120 секунд, после которого хост будет объявлен недоступным
        dpdaction=restart_by_peer # перезапустить процесс подключения к хосту

        # 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 и терял соединение после недели стабильной работы.

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

Update:

Через 2 месяца все-таки упало, зараза…
Нашел на Openswan форумах, что настоятельно рекомендуется dpdaction=restart_by_peer. Поправил в конфигах.

Update 2:

Как признался мне админ на стороне циски, падение было вызвано проблемами со связью на их стороне.
Но мне от этого не легче, потому что туннель должен был подняться.
Нашел еще в одном хау-ту, что forceencaps=yes может помочь в таких случаях. Добавил в конфиг.

Update 3:

Добавил:
# /etc/ppp/options:
defaultroute

см комментарии
Tags:
Hubs:
+11
Comments 11
Comments Comments 11

Articles