Предусловия

Список требуемого ПО, процедуру его (ПО) установки, а так же настройки ядра смотрите в соответствующих разделах страницы, посвящённой настройке VPN-сервера.

IPSec

Указываем openswan'у какой пароль использовать для подключения к серверу:

%any 111.222.33.22: PSK "superG00dParol"

Настраиваем IPSec соединение:

version 2.0 config setup nat_traversal=yes protostack=netkey conn vpn #Server description left=111.222.33.22 leftprotoport=17/1701 #Local-side descrioption right=%defaultroute rightprotoport=17/1701 #Other options authby=secret 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
При использовании на 64-битных архитектурах необходимо в описание конекта добавить опцию compress=no

L2TP

[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

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
# 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 для этого достаточно прописать такое:

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

Автоматизация

Для автоматической настройки таблицы маршрутизации создаём два файла:

#!/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
#!/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

Поднимаете вручную соединение и проверяете список маршрутов. Разумеется, всё должно быть хорошо :)

В зависимости от частоты использования, от интуитивного ощущения удобства можно завести либо пару скриптов а ля такое:

#!/bin/bash ipsec auto --up vpn echo "c L2TPserver" > /var/run/xl2tpd/l2tp-control
#!/bin/bash echo "d L2TPserver" > /var/run/xl2tpd/l2tp-control sleep 2 ipsec auto --down 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-07 00:22

Tracedump:

newBaseSize: 16pt
newBaseSizeInPt: 16