Добрых дел, уважаемые читатели!
В данной статье я хотел бы увлечь вас рассказом о моих приключениях в поисках надежных и безопасных связей 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, пришлось немного напрячь
Но счастье было не долгим. Возникла задача подключить и клиентские хосты по 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 == '')
continue; /* no 2nd parameter */
p--;
- if (strncmp(buf, str, len) == 0 && buf[len] == '') {
+ if (strncmp(buf, "*", 2) == 0 ||
+ (strncmp(buf, str, len) == 0 && buf[len] == '')) {
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 и терял соединение после недели стабильной работы.
Отдельное спасибо НЛО за инвайт.
Автор: Alvelig