Предусловия
Список требуемого ПО, процедуру его (ПО) установки, а так же настройки ядра смотрите в соответствующих разделах страницы, посвящённой настройке VPN-сервера.
Сертификаты
После установки ПО необходимо получить пару сертификат-ключ. Желательно сразу получить .pem и .key файлы, чтобы не заниматься извлечением данных из .p12. Дополнительно к этой паре необходимо получить сертификат центра авторизации cacert.pem и сертификат VPN-сервера vpnServer.pem.
Снимаем пароль с ключа и раскладываем файлы по местам:
openssl rsa -in vpnClient.key -out vpnClient.key.unenc mv vpnClient.key{.unenc,} cp cacert.pem /etc/ipsec.d/cacerts/ cp vpnServer.pem /etc/ipsec.d/certs/ cp vpnClient.pem /etc/ipsec.d/certs/ cp vpnClient.key /etc/ipsec.d/private/ chown -R root:root /etc/ipsec.d/ chmod 400 /etc/ipsec.d/private/*
IPSec
Указываем openswan'у какой ключ использовать:
- /etc/ipsec.secrets
: RSA /etc/ipsec.d/private/vpnClient.key
Настраиваем IPSec соединение:
- /etc/ipsec.conf
version 2.0 config setup nat_traversal=yes protostack=netkey conn vpn #server description left=111.222.33.2 leftprotoport=17/1701 leftcert=vpnServer.pem leftca=%same #Local-side description right=%defaultroute rightprotoport=17/1701 rightcert=vpnClient.pem rightrsasigkey=%cert #Other options authby=rsasig type=transport pfs=no auto=add conn block auto=ignore conn private auto=ignore conn private-or-clear auto=ignore conn clear-or-private auto=ignore conn clear auto=ignore conn packetdefault auto=ignore
compress=no
L2TP
- /etc/xl2tpd/xl2tpd.conf
[global] port = 1701 access control = no debug avp = yes debug network = yes debug state = yes debug tunnel = yes rand source = dev [lac L2TPserver] lns = 111.222.33.2 require chap = yes refuse pap = yes require authentication = yes redial = yes redial timeout = 15 max redials = 5 length bit = yes ppp debug = yes pppoptfile = /etc/ppp/options.l2tpd.client
PPP
- /etc/ppp/options.l2tpd.client
ipcp-accept-local ipcp-accept-remote require-mschap-v2 usepeerdns refuse-pap refuse-eap noccp noauth crtscts idle 1800 mtu 1410 mru 1410 nodefaultroute debug lock connect-delay 500
- /etc/ppp/chap-secrets
# Secrets for authentication using CHAP # client server secret IP addresses ################################################################# # Andrew A. Sabitov sabitov * "vpn_pwd" * * sabitov "vpn_pwd" * #################################################################
Ручной запуск соединения
После всех настроек можно попробовать запустить наше соединение:
noter ~ # ipsec auto --up vpn 104 "vpn" #1: STATE_MAIN_I1: initiate 003 "vpn" #1: received Vendor ID payload [Openswan (this version) 2.6.31 ] 003 "vpn" #1: received Vendor ID payload [Dead Peer Detection] 003 "vpn" #1: received Vendor ID payload [RFC 3947] method set to=109 106 "vpn" #1: STATE_MAIN_I2: sent MI2, expecting MR2 003 "vpn" #1: NAT-Traversal: Result using RFC 3947 (NAT-Traversal): no NAT detected 108 "vpn" #1: STATE_MAIN_I3: sent MI3, expecting MR3 003 "vpn" #1: received Vendor ID payload [CAN-IKEv2] 004 "vpn" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_RSA_SIG cipher=aes_128 prf=oakley_sha group=modp2048} 117 "vpn" #2: STATE_QUICK_I1: initiate 004 "vpn" #2: STATE_QUICK_I2: sent QI2, IPsec SA established transport mode {ESP=>0x96d6d919 <0xe3eae6b4 xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=none DPD=none} noter ~ # echo "c L2TPserver" > /var/run/xl2tpd/l2tp-control
Если всё настроено правильно, то:
- появится интерфейс ppp0
- в таблице маршрутизации появится запись для маршрута к vpn-серверу через интерфейс ppp0:
noter ~ # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.17.33.2 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
Дальнейшие шаги зависят от того, что требуется получить в результате. Если достаточно иметь только маршрут до vpn-сервера достигнутого будет достаточно, но обычно хочется иметь доступ к удалённой ЛВС, либо, как более общий случай, вообще направить дефолтовый раут на vpn-сервер. И тут есть нюансы…
Первое, что надо сделать в любом случае – настроить метрику для маршрутов через основной интерфейс. В gentoo для этого достаточно прописать такое:
- /etc/conf.d/net
metric_eth0="20"
Далее, даём 2 команды, которые настраивают таблицу маршрутизации:
route add -host 111.222.33.2 gw 109.174.70.1 dev eth0 route add -net 0.0.0.0 dev ppp0
Первая обеспечит нам связь с vpn-сервером при изменении маршрута по умолчанию, а вторая добавляет новый дефолтовый раут на vpn-сервер. Т.к. метрика новых маршрутов будет меньше, чем у имеющихся, то эти два маршрута будут иметь приоритет. При отключении ppp0 новый дефолтовый раут будет удалён из таблицы автоматически, и в силу вступит, тот, что был указан в настройках системы (или получен по DHCP)
Ручной останов соединения
echo "d L2TPserver" > /var/run/xl2tpd/l2tp-control ipsec auto --down vpn
Автоматизация
Для автоматической настройки таблицы маршрутизации создаём два файла:
- /etc/ppp/ip-up.d/99-vpn.sh
#!/bin/sh vpn_server='111.222.33.2' default_router=$( route -n | gawk '/^0.0.0.0/ && !/ppp/ {print $2}' ) default_device=$( route -n | gawk '/^0.0.0.0/ && !/ppp/ {print $8}' ) route add -host ${vpn_server} gw ${default_router} dev ${default_device} route add -net 0.0.0.0 dev ppp0
- /etc/ppp/ip-down.d/99-vpn.sh
#!/bin/sh vpn_server='111.222.33.2' default_router=$( route -n | gawk '/^0.0.0.0/ && !/ppp/ {print $2}' ) default_device=$( route -n | gawk '/^0.0.0.0/ && !/ppp/ {print $8}' ) route del -net 0.0.0.0 dev ppp0 route del -host ${vpn_server} gw ${default_router} dev ${default_device}
Не забываем сделать исполняемыми:
chmod +x /etc/ppp/ip-{up,down}.d/99-vpn.sh
Поднимаете вручную соединение и проверяете список маршрутов. Разумеется, всё должно быть хорошо :)
В зависимости от частоты использования и интуитивного ощущения удобства, можно завести либо пару скриптов а ля такое:
- /usr/local/bin/vpn-up
#!/bin/bash ipsec auto --up vpn echo "c L2TPserver" > /var/run/xl2tpd/l2tp-control
- /usr/local/bin/vpn-down
#!/bin/bash echo "d L2TPserver" > /var/run/xl2tpd/l2tp-control sleep 2 ipsec auto --down vpn
Либо, что в определённой степени лучше, завести инитовый скрипт наподобии такого:
- /etc/init.d/vpn
#!/sbin/runscript opts="depend start stop status restart" PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin NAME=vpn DESC="VPN connection" depend () { need ipsec xl2tpd } start () { echo "Starting $DESC" echo ipsec auto --up vpn sleep 3 echo "c L2TPserver" > /var/run/xl2tpd/l2tp-control } stop () { echo "Cleaning $DESC" echo "d L2TPserver" > /var/run/xl2tpd/l2tp-control sleep 2 ipsec auto --down vpn } restart () { echo "Restarting $DESC" svc_stop sleep 1 svc_start }
— Andrew A. Sabitov 2011-01-04 20:29