Alvelig
В данной статье я хотел бы увлечь вас рассказом о моих приключениях в поисках надежных и безопасных связей 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