vpn:ipsec-linux-pki-manual

Предусловия

Список требуемого ПО, процедуру его (ПО) установки, а так же настройки ядра смотрите в соответствующих разделах страницы, посвящённой настройке 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
При использовании на 64-битных архитектурах необходимо в описание конекта добавить опцию
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

Если всё настроено правильно, то:

  1. появится интерфейс ppp0
  2. в таблице маршрутизации появится запись для маршрута к 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

  • vpn/ipsec-linux-pki-manual.txt
  • Последнее изменение: 2013-08-24 21:15
  • Andrew A. Sabitov