Дата написания: май 2017 г.
Автор: Graf

L2TP/IPSec VPN



Сервер

В качестве сервера используется Slackware Linux 14.2 64-bit с ядром 4.4.38, без DE и всем, что с ними связанно.
Eth1 - смотрит в Интернет - 77.77.77.77 (vpn.mydom.ru)
Eth0 - смотрит в локальную сеть - 192.168.3.250
Клиентам VPN будут выдан диапазон IP адресов из этой же локальной сети - 192.168.3.0/24, хотя этого и не рекомендуют делать, но у меня нет DHCP и каждому клиенту я лично буду выдавать логин, пароль и ip-адрес. Это позволит осуществлять двусторонний обмен данными и ip-адреса не будут пересекаться.

Берем openswan_slackbuild.tar.gz, распаковываем и в этот же каталог скачиваем последнюю версию openswan, на сегодня это - 2.6.49.1

# wget https://download.openswan.org/openswan/openswan-2.6.49.1.tar.gz

правим openswan.SlackBuild в части версии и запускаем его. По окончании сборки устанавливаем полученный пакет.

# upgradepkg --install-new /tmp/openswan-2.6.49.1-x86_64-1_SBo.tgz
Package openswan-2.6.49.1-x86_64-1_SBo.tgz installed.

Берем xl2tpd_slackbuild.tar.gz, распаковываем и в этот же каталог скачиваем последнюю версию xl2tpd, на сегодня это - 1.3.8, переименовав под требуемый slackbuild'ом шаблон.

# wget -O xl2tpd-1.3.8.tar.gz https://github.com/xelerance/xl2tpd/archive/v1.3.8.tar.gz

Правим xl2tpd.SlackBuild в части версии и запускаем его. По окончании сборки устанавливаем полученный пакет.

# upgradepkg --install-new /tmp/xl2tpd-1.3.8-x86_64-1_SBo.tgz
Package xl2tpd-1.3.8-x86_64-1_SBo.tgz installed.

IPSec

Настраиваем IPSec.
Редактируем файл /etc/ipsec.conf, отступы в начале строк параметров, обязательны.

# Первая значимая строка файла должна указывать версию спецификации
version 2.0
 
# Eединственный конфигурационный раздел, который содержит информацию, используемую при запуске программы. 
config setup
  nat_traversal=yes                      # Разрешить поддержку NAT (NAPT, также известный как «IP Masquerade»). 
                                         # Допустимые значения: "yes" и "no" (по умолчанию).
 
  virtual_private=%v4:192.168.3.0/24     # Подсеть, в которую будут попадать клиенты VPN
 
  oe=off                                 # Включить(on) или нет(off) оппортунистическое шифрование. По умолчанию нет(off)
                                         # Оппортунистическое шифрование - это термин для описания использования туннелей 
                                         # IPsec без предварительного согласования. 
 
  protostack=netkey                      # Решить, какой стек протокола будет использоваться. 
                                         # Допустимыми значениями являются «auto», «klips», «netkey» и «mast».
 
  uniqueids=yes                          # Следует ли сохранить уникальный идентификатор участника с любым новым
                                         # (автоматически вводимым ключом) соединением с использованием идентификатора
                                         # с другого IP-адреса. Допустимые значения: "yes" (по умолчанию) и "no". 
 
# Раздел содержит спецификацию соединения по умолчанию
conn %default
  forceencaps=yes                        # Допустимые значения: "yes" или "no" (по умолчанию).
                                         # В некоторых случаях, например, когда пакеты ESP отфильтровываются 
                                         # или когда удаленный узел IPsec неправильно распознает NAT, может быть полезно 
                                         # принудительно инкапсулировать RFC-3948. Значение yes заставляет код обнаружения
                                         # NAT указывать удаленному узлу, что требуется инкапсуляция RFC-3948 
                                         # (ESP в пакетах UDP-порта 4500). Чтобы этот параметр имел какой-либо эффект, 
                                         # необходимо установить параметр nat_traversal = yes. 
 
  compress=yes                           # Предлагать сжатие. Допустимыми значениями являются "yes" и "no" (по умолчанию). 
 
# Раздел содержит спецификацию определенного соединения, название произвольное. 
conn l2tp-psk-nat
 
# Всё начинающееся с:
# left - означает локальный компьютер, на котором хранится текущий файл с настройками, т.е. наш сервер;
# right - означает удалённый компьютер, то есть тот, с которым будет произведена попытка установить удалённое подключение, 
# по сути, все остальные.
 
  rightsubnet=vhost:%priv                # Приватная подсеть за удаленным участником (right), выраженная как сеть/сетевая
                                         # маска. В настоящее время поддерживаются диапазоны IPv4 и IPv6. Если не указывать,
                                         # то предполагается, что это right/32, означающее, что right конец соединения идет
                                         # только к right участнику.
                                         # Поддерживает два волшебных сокращения vhost: и vnet:, которые могут перечислять
                                         # подсети в том же синтаксисе, что и virtual_private. 
                                         # Значение %priv расширяется до сетей, указанных в virtual_private. 
                                         # Значение %no означает отсутствие подсети.
                                         # При использовании vnet соединение создает экземпляр, позволяя использовать
                                         # несколько туннелей с разными подсетями.
                                         # Вышесказанное действительно и для leftsubnet.
 
 
  also=l2tp-psk-nonat                    # Значение является именем раздела, параметры которого добавляются так, как если бы
                                         # они являлись частью этого раздела. Указанный раздел должен существовать, следовать 
                                         # за текущим и иметь один и тот же тип раздела. (Вложенность разрешена, может быть
                                         # более одного в одном разделе, хотя запрещается добавлять один и тот же раздел более 
                                         # одного раза.)
 
# Раздел содержит спецификацию определенного соединения, название произвольное, но в данном случае, 
# такое же как указанно в параметре also в разделе выше. 
conn l2tp-psk-nonat
  authby=secret                          # Как два шлюза безопасности должны аутентифицировать друг друга.
                                         # Допустимые значения являются "secret" для PSK и "rsasig" для цифровых подписей 
                                         # RSA (по умолчанию).
 
  pfs=yes                                # Необходима ли полная секретность ключей (Perfect Forward Secrecy) на канале связи
                                         # соединения (при использовании PFS, проникновение протокола обмена ключами не
                                         # компрометирует ключи, согласованные ранее).
                                         # Допустимые значения: "yes"(по умолчанию) и "no".
 
  auto=add                               # Операция выполняемая автоматически при запуске IPsec.
                                         # Допустимые значения:
                                         # "add" (автоматическое добавление ipsec);
                                         # "route" (auto-route ipsec);
                                         # "start" (автоматическое обновление ipsec);
                                         # "ignore" (по умолчанию) (отсутствие автоматического запуска).
 
  keyingtries=1                          # Сколько попыток (целое или %forever) должно быть принято для согласования 
                                         # соединения (по умолчанию %forever). Значение "%forever" означает «никогда не
                                         # сдаваться» (может быть записано как "0").
 
  rekey=no                               # Следует ли пересматривать соединение после истечения срока его действия.
                                         # Допустимые значения: "yes"(по умолчанию) и "no".
 
  ikelifetime=8h                         # Как долго должен сохраняться канал соединения (фраза: "ISAKMP SA") до 
                                         # повторного обсуждения. Допустимые значения "1h"(по умолчанию)-1 час, 
                                         # максимум "24h" - 24 часа.
 
  keylife=1h                             # То же, что и "salifetime".
                                         # Как долго должен длиться определенный экземпляр соединения, от успешных
                                         # переговоров до истечения срока действия. 
                                         # Допустимые значения - целое число "s"(секунды) или десятичное число, 
                                         # за которым следуют "m", "h" или "d"(минуты, часы или дни соответственно). 
                                         # По умолчанию "8h", максимум "24h".
 
  type=transport                         # Тип соединения. Допустимые значения:
                                         # "tunnel"(по умолчанию) - туннель "host-to-host", "host-to-subnet" 
                                         # или "subnet-to-subnet"; 
                                         # "transport" - транспортный режим "host-to-host"; 
                                         # "passthrough" - обработка IPsec вообще не требуется; 
                                         # "drop" - пакеты должны быть отброшены; 
                                         # "reject" - пакеты должны быть отброшены, а диагностический ICMP возвращен.
 
  left=77.77.77.77                       # Внешний IP адрес сервера.
 
  leftprotoport=17/1701                  # Разрешенные протоколы и порты. Может использоваться число или имя, которое будет
                                         # искаться в /etc/protocols, например, leftprotoport = icmp, или в виде 
                                         # протокол/порт, например, tcp/smtp. Порты могут быть определены как число
                                         # (например, 25) или как имя (например, smtp), которое будет искать в
                                         # /etc/services. Специальное ключевое слово %any может использоваться для 
                                         # разрешения всех портов определенного протокола. Чаще всего этот вариант
                                         # используется для соединений L2TP, разрешающих только пакеты l2tp (порт 1701 UDP),
                                         # например: leftprotoport = 17/1701.
 
  leftnexthop=%defaultroute              # IP-адрес шлюза next-hop для подключения left участника к общедоступной сети;
                                         # По умолчанию используется значение "%direct" (имеется в виду right). 
                                         # Если leftnexthop = %defaultroute и, указанные в секции config setup,
                                         # interfaces=%defaultroute, то для шлюза next-hop, будет использоваться адрес
                                         # интерфейса шлюза по умолчанию.
 
  right=%any
  rightprotoport=17/%any
  rightnexthop=%defaultroute
 
  dpddelay=60                            # Интервал между keep-alive пакетами, в секундах (по умолчанию 30 секунд).
                                         # Если используется dpddelay, то необходимо, также, установить dpdtimeout.
 
  dpdtimeout=180                         # Интервал времени бездействия, в секундах. По прошествии этого периода, если
                                         # не будет ответа и трафика, то будет считаться, что узел мертв и будет удален
                                         # SA (по умолчанию 120 секунд). Если используется dpdtimeout, то необходимо, 
                                         # также, установить dpdaction.
 
  dpdaction=clear                        # Какие действия следует предпринять, когда узел объявлен мертвым. 
                                         # "hold"(по умолчанию) - eroute будет переведен в состояние %hold,
                                         # "clear" - eroute и SA будут очищены. 
                                         # "restart" - SA будет немедленно перезаключен.
                                         # "restart_by_peer" - все SA для мертвого узла будут пересмотрены.
 
  aggrmode=no                            # Использовать Агрессивный режим вместо основного режима. 
                                         # Агрессивный режим менее безопасен и уязвим для атак типа «отказ в обслуживании».
                                         # Он также уязвим для атак с использованием таких программ, как ikecrack.
                                         # Он не должен использоваться, и его особенно не следует использовать с XAUTH и
                                         # групповыми секретами (PSK).

Создаем файл /etc/ipsec.secrets

# На самом деле вариантов много, см. "man ipsec.secrets",
# но в нашей реализации, это, примерно, следующее:
 
# где_ждать от_кого": ЧТО_ждать "Пароль или ключ" 
 
77.77.77.77 %any : PSK "my_super_password"

Подправим iptables добавив в соответствующие цепочки следующее:

L2TP_IFACE="ppp+"
IPTABLES="/usr/sbin/iptables"
 
# l2tp/ipsec INPUT
$IPTABLES -A INPUT -p udp --dport 1701 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 500 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 4500 -j ACCEPT
$IPTABLES -A INPUT -i $L2TP_IFACE -j ACCEPT
 
# l2tp/ipsec FORWARD
$IPTABLES -A FORWARD -i $L2TP_IFACE -j ACCEPT
 
# l2tp/ipsec  OUTPUT
$IPTABLES -A OUTPUT -p udp --sport 500 -j ACCEPT
$IPTABLES -A OUTPUT -p udp --sport 4500 -j ACCEPT
$IPTABLES -A OUTPUT -p udp --sport 1701 -j ACCEPT

Создадим файл /etc/sysctl.conf

net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1

Применим параметры ядра без перезагрузки.

# sysctl -p

Запустим IPSec и проверим работоспособность.

# /etc/rc.d/rc.ipsec start
ipsec_setup: Starting Openswan IPsec U2.6.49.1/K4.4.38...

# ipsec verify
Checking if IPsec got installed and started correctly:

Version check and ipsec on-path                         [OK]
Openswan U2.6.49/K4.4.38 (netkey)
See `ipsec --copyright' for copyright information.
Checking for IPsec support in kernel                    [OK]
 NETKEY: Testing XFRM related proc values
         ICMP default/send_redirects                    [OK]
         ICMP default/accept_redirects                  [OK]
         XFRM larval drop                               [OK]
Hardware random device check                            [N/A]
Two or more interfaces found, checking IP forwarding    [OK]
Checking rp_filter                                      [OK]
Checking that pluto is running                          [OK]
 Pluto listening for IKE on udp 500                     [OK]
 Pluto listening for IKE on tcp 500                     [NOT IMPLEMENTED]
 Pluto listening for IKE/NAT-T on udp 4500              [OK]
 Pluto listening for IKE/NAT-T on tcp 4500              [NOT IMPLEMENTED]
 Pluto listening for IKE on tcp 10000 (cisco)           [NOT IMPLEMENTED]
Checking NAT and MASQUERADEing                          [TEST INCOMPLETE]
Checking 'ip' command                                   [OK]
Checking 'iptables' command                             [OK]

Смотрим /var/log/syslog, видим что-то подобное:

ipsec_setup: ...Openswan IPsec started
ipsec__plutorun: adjusting ipsec.d to /etc/ipsec.d
pluto: adjusting ipsec.d to /etc/ipsec.d
ipsec__plutorun: Labelled IPsec not enabled; value 32001 ignored.
pluto: Labelled IPsec not enabled; value 32001 ignored.
ipsec__plutorun: 002 adding connection: "l2tp-psk-nat"
ipsec__plutorun: 002 adding connection: "l2tp-psk-nonat"
ipsec__plutorun: 002 listening for IKE messages
ipsec__plutorun: 002 adding interface eth0/eth0 192.168.3.250:500 (AF_INET)
ipsec__plutorun: 002 adding interface eth0/eth0 192.168.3.250:4500
ipsec__plutorun: 002 adding interface eth1/eth1 77.77.77.77:500 (AF_INET)
ipsec__plutorun: 002 adding interface eth1/eth1 77.77.77.77:4500
ipsec__plutorun: 002 adding interface lo/lo 127.0.0.1:500 (AF_INET)
ipsec__plutorun: 002 adding interface lo/lo 127.0.0.1:4500
ipsec__plutorun: 002 adding interface lo/lo ::1:500 (AF_INET6)
ipsec__plutorun: 002 loading secrets from "/etc/ipsec.secrets"

IPSec готов, останавливаем.

# /etc/rc.d/rc.ipsec stop
ipsec_setup: Stopping Openswan IPsec...

Переходим к настройке L2TP.

L2TP

Редактируем /etc/xl2tpd/xl2tpd.conf

[global]
 
; IP-адрес интерфейса на котором слушает демон. По умолчанию 0.0.0.0, означающее то, что он прослушивает все интерфейсы.
 
listen-addr = 77.77.77.77
 
; Использовать отслеживание IPsec Security Association. Допустимые значения "yes" или "no"(по умолчанию).
; Если разрешено, то пакеты, полученные xl2tpd, должны иметь дополнительные поля (refme и refhim), которые позволяют
; отслеживать несколько клиентов с использованием одного и того же внутреннего NAT-адреса или за одним и тем же
; маршрутизатором NAT. Должно поддерживаться ядром. В настоящее время работает только с Openswan KLIPS в режиме "mast".
               
ipsec saref = no
 
[lns default]
; Диапазон ip адресов, из которого клиентам при подключении будет назначен IP-адрес.
 
ip range = 192.168.3.50-192.168.3.150
 
; Адрес локального интерфейса VPN.
 
local ip = 192.168.3.251
 
; Требовать от удаленного узла производить аутентификацию по протоколу CHAP.
 
require chap = yes
 
; Запретить удаленному узлу производить аутентификацию по протоколу PAP.
 
refuse pap = yes
 
; Требовать от удаленного узла аутентификацию
 
require authentication = yes
 
; Запретить отладку pppd
 
ppp debug = no
 
; Путь к файлу в котором содержатся параметры конфигурации pppd.
 
pppoptfile = /etc/ppp/options.xl2tpd
 
; Использовать бит длины, указывающий полезную нагрузку пакета l2tp.
 
length bit = yes

Теперь отредактируем файл /etc/ppp/options.xl2tpd

# Принимать предложение удаленного узла о нашем локальном IP адресе, даже если локальный IP адрес был указан в опциях.
 
ipcp-accept-local
 
# Принимать предложение от удаленного узла о его IP-адресе, даже если удаленный IP адрес был указан в опциях. 
 
ipcp-accept-remote
 
# Разрешить аутентификацию по протоколу — MS CHAP v2.
 
require-mschap-v2
 
# Разрешить аутентификацию по протоколу — MS CHAP.
 
require-mschap
 
# Разрешить аутентификацию по протоколу — CHAP.
 
require-chap
 
# Запретить аутентификацию по протоколу — PAP
 
refuse-pap
 
# Первичный DNS сервера для L2TP-клиентов.
 
ms-dns 192.168.3.250
 
# Вторичный DNS сервера для L2TP-клиентов.
 
ms-dns 8.8.8.8
 
# async карта символов - 32-bit hex; каждый бит - символ, который надо представить в виде escape-последовательности,
# чтобы pppd мог его принять. 0x00000001 - это маска для '\x01', а 0x80000000 - маска для '\x1f'.
 
asyncmap 0
 
# Отключить согласование протокола управления сжатием (Compression Control Protocol). 
 
noccp
 
# Требование для удаленной стороны назвать себя перед тем как начнется обмен пакетами.
 
auth
 
# Использовать аппаратное управление потоком данных (напр., RTS/CTS)
 
crtscts
 
# Использовать lock в стиле UUCP на последовательное устройство, чтобы исключить одновременный доступ к устройству
 
lock
 
# При протоколировании содержимого пакетов PAP исключить строку пароля из журнала. 
 
hide-password
 
# Использовать линии управления модемом. 
 
modem
 
# Имя локальной системы для целей аутентификации. 
 
name l2tpd
 
# Отправлять кадр LCP echo-request удаленной стороне каждое указанное количество секунд.  
# Под Linux, echo-request отправляется тогда, когда пакеты не принимаются от удаленной стороны указанное количество секунд. 
# Обычно удаленная сторона должна отвечать на echo-request отправкой echo-reply.
 
lcp-echo-interval 30
 
# Завершить связь, если указанное количество LCP echo-requests отправлены без приема правильных LCP echo-reply.
# Требует ненулевого значения для параметра lcp-echo-interval.
 
lcp-echo-failure 4
 
# Отключиться, если соединение простаивает в течение указанных секунд.
 
idle 1800
 
# Значение MTU [Maximum Transmit Unit]. 
 
mtu 1400
 
# Значение MRU [Maximum Receive Unit].
 
mru 1400
 
# Добавить запись в таблицу ARP [Address Resolution Protocol] этой системы с IP-адресом удаленного узла и Ethernet-адресом 
# этой системы. Чтобы удаленный узел появился в локальной сети.
 
proxyarp

Отредактируем файл /etc/ppp/chap-secrets, внесём сюда логин, пароль и жёстко присвоим IP-адрес при подключении отдельно для каждого пользователя.

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
user1  *       password-1    192.168.3.50
user2  *       password-2    192.168.3.51
user3  *       password-3    192.168.3.52

Создадим файл /etc/rc.d/rc.xl2tpd

#!/bin/sh
#
# xl2tpd        This shell script takes care of starting and stopping l2tpd.
#
# description:  Layer 2 Tunnelling Protocol Daemon (RFC 2661)
#
 
CONFIG_FILE=/etc/xl2tpd/xl2tpd.conf
DAEMON=xl2tpd
 
[ -x /usr/sbin/$DAEMON ] || exit 0
 
RETVAL=0
 
start() {
        echo -n "Starting $DAEMON : "
        if [ ! -d /var/run/xl2tpd ]
        then
                mkdir /var/run/xl2tpd
        fi
        /usr/sbin/$DAEMON -c $CONFIG_FILE &
        RETVAL=$?
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$DAEMON
        echo ""
        return $RETVAL
}
 
stop() {
        echo -n "Stopping $DAEMON "
        kill -9 `cat /var/run/xl2tpd.pid`
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$DAEMON
        return $RETVAL
}
 
restart() {
        stop
        start
}
 
 
status() {
        PID=`ps ax | awk '{if (match($5, ".*/xl2tpd$") || $5 == "xl2tpd") print $1}'`
        if test "$PID" != ""; then
                echo "xl2tpd is running."
        else
                echo "xl2tpd is not running."
        fi
}
 
 
# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status
        ;;
  restart|reload)
        restart
        ;;
  condrestart)
        [ -f /var/lock/subsys/$DAEMON ] && restart || :
        ;;
  *)
        echo "Usage: $DAEMON {start|stop|status|restart|reload|condrestart}"
        exit 1
esac

Сделаем этот файл исполняемым.

# chmod +x /etc/rc.d/rc.xl2tpd

Всё готово! Запускаем IPSec и L2TP.

# /etc/rc.d/rc.ipsec start
ipsec_setup: Starting Openswan IPsec U2.6.49.1/K4.4.38...

# /etc/rc.d/rc.xl2tpd start
Starting xl2tpd : 

# /etc/rc.d/rc.ipsec status
IPsec running  - pluto pid: 28314
pluto pid 28314
No tunnels up

# /etc/rc.d/rc.xl2tpd status
xl2tpd is running.

Для автозапуска после перезагрузки пропишем в /etc/rc.d/rc.local

# L2TP/IPSEC
/etc/rc.d/rc.ipsec start
/etc/rc.d/rc.xl2tpd start

Клиенты

Покажу настройку Linux-клиентов для подключения к нескольким L2TP/IPSec серверам, настроенным по текущей статье. Конфигурационные файлы будут без комментариев к параметрам, так как, большинство из них описано при настройки сервера, остальные в «man xl2tpd.conf» и «man ipsec.conf».
В Windows, думаю, и так понятно как подключаться к нескольким серверам. Поэтому, для Windows-клиентов покажу пример для одного подключения, а так же, что делать при возникновении ошибок подключения.
Для примера буду использовать:
77.77.77.77 (vpn.mydom.ru)
88.88.88.88 (vpn.yourdom.ru) - сервер за NAT'ом, внутренний IP-адрес - 10.0.0.250

Linux

Версия, разрядность и битность Slackware Linux не имеет значения. Проверялось на версиях 14.1 и 14.2, как 32, так и 64 битных. В примере будет использоваться Slackware Linux 14.1 32-bit с ядром 3.10.104, IP - 192.168.10.44

Берем openswan_slackbuild.tar.gz, распаковываем и в этот же каталог скачиваем последнюю версию openswan, на сегодня это - 2.6.49.1

# wget https://download.openswan.org/openswan/openswan-2.6.49.1.tar.gz

правим openswan.SlackBuild в части версии и запускаем его. По окончании сборки устанавливаем полученный пакет.

# upgradepkg --install-new /tmp/openswan-2.6.49.1-i486-1_SBo.tgz
Package openswan-2.6.49.1-i486-1_SBo.tgz installed.

Берем xl2tpd_slackbuild.tar.gz, распаковываем и в этот же каталог скачиваем последнюю версию xl2tpd, на сегодня это - 1.3.8, переименовав под требуемый slackbuild'ом шаблон.

# wget -O xl2tpd-1.3.8.tar.gz https://github.com/xelerance/xl2tpd/archive/v1.3.8.tar.gz

Правим xl2tpd.SlackBuild в части версии и запускаем его. По окончании сборки устанавливаем полученный пакет.

# upgradepkg --install-new /tmp/xl2tpd-1.3.8-i486-1_SBo.tgz
Package xl2tpd-1.3.8-i486-1_SBo.tgz installed.

Переходим к настройке IPSec.

IPSec

Редактируем файл /etc/ipsec.conf, отступы в начале строк параметров, обязательны.

version 2.0
 
config setup
 
        plutodebug=all                         # Эти два параметра можно убрать после завершения отладки
        plutostderrlog=/var/log/openswan.log   # и стабильной работы IPSec
        nat_traversal=yes
        protostack=netkey
 
conn mydom-vpn
 
        authby=secret
        pfs=yes
        keyingtries=3
        rekey=yes
        type=transport
        left=%defaultroute
        leftnexthop=%defaultroute
        leftprotoport=17/1701
        right=77.77.77.77
        rightid="vpn.mydom.ru"                 # Можно указать IP-адрес, можно вообще не указывать, если сервер не за NAT'ом 
        rightprotoport=17/1701
        auto=add        
 
conn yourdom-vpn # Сервер за NAT'ом
 
        authby=secret
        pfs=yes
        keyingtries=3
        rekey=yes
        type=transport
        left=%defaultroute
        leftnexthop=%defaultroute
        leftprotoport=17/1701
        right=88.88.88.88
        rightid="10.0.0.250"
        rightprotoport=17/1701
        auto=add

Создадим 3 файла с правами 600, пустая строка в конце файла обязательна:

  • /etc/ipsec.mydom.secrets
%any 77.77.77.77: PSK "mydom_super_password"
 
  • /etc/ipsec.yourdom.secrets
# Обратите внимание, если сервер за NAT'ом, то указывать нужно его локальный IP-адрес
%any 10.0.0.250: PSK "yourdom_super_password"
 
  • /etc/ipsec.secrets
include ipsec.*.secrets
 

Необходимо открыть порты, если используется iptables, то добавим в соответствующие цепочки следующее:

L2TP_IFACE="ppp+"
IPTABLES="/usr/sbin/iptables"
 
# l2tp/ipsec INPUT
$IPTABLES -A INPUT -p udp --dport 1701 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 500 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 4500 -j ACCEPT
$IPTABLES -A INPUT -i $L2TP_IFACE -j ACCEPT
 
# l2tp/ipsec FORWARD
$IPTABLES -A FORWARD -i $L2TP_IFACE -j ACCEPT
 
# l2tp/ipsec  OUTPUT
$IPTABLES -A OUTPUT -p udp --sport 500 -j ACCEPT
$IPTABLES -A OUTPUT -p udp --sport 4500 -j ACCEPT
$IPTABLES -A OUTPUT -p udp --sport 1701 -j ACCEPT

Создадим файл /etc/sysctl.conf

net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1

Применим параметры ядра без перезагрузки.

# sysctl -p

Запустим IPSec и проверим работоспособность.

# /etc/rc.d/rc.ipsec start
ipsec_setup: Starting Openswan IPsec U2.6.49.1/K3.10.104-smp...

# /etc/rc.d/rc.ipsec status
IPsec running  - pluto pid: 14263
pluto pid 14263
No tunnels up

# ipsec verify
Checking if IPsec got installed and started correctly:

Version check and ipsec on-path                         [OK]
Openswan U2.6.49.1/K3.10.104-smp (netkey)
See `ipsec --copyright' for copyright information.
Checking for IPsec support in kernel                    [OK]
 NETKEY: Testing XFRM related proc values
         ICMP default/send_redirects                    [OK]
         ICMP default/accept_redirects                  [OK]
         XFRM larval drop                               [OK]
Hardware random device check                            [N/A]
Two or more interfaces found, checking IP forwarding    [OK]
Checking rp_filter                                      [OK]
Checking that pluto is running                          [OK]
 Pluto listening for IKE on udp 500                     [OK]
 Pluto listening for IKE on tcp 500                     [NOT IMPLEMENTED]
 Pluto listening for IKE/NAT-T on udp 4500              [OK]
 Pluto listening for IKE/NAT-T on tcp 4500              [NOT IMPLEMENTED]
 Pluto listening for IKE on tcp 10000 (cisco)           [NOT IMPLEMENTED]
Checking NAT and MASQUERADEing                          [TEST INCOMPLETE]
Checking 'ip' command                                   [OK]
Checking 'iptables' command                             [OK]

# ipsec auto --status
000 using kernel interface: netkey
000 interface lo/lo ::1 (AF_INET6)
000 interface lo/lo 127.0.0.1 (AF_INET)
000 interface lo/lo 127.0.0.1 (AF_INET)
000 interface eth0/eth0 192.168.10.44 (AF_INET)
000 interface eth0/eth0 192.168.10.44 (AF_INET)
000 %myid = (none)
000 debug raw+crypt+parsing+emitting+control+lifecycle+klips+dns+oppo+controlmore+pfkey+nattraversal+x509+dpd+oppoinfo
000 
000 virtual_private (%priv):
000 - allowed 0 subnets: 
000 - disallowed 0 subnets: 
...
...
000 algorithm ESP encrypt: id=2, name=ESP_DES, ivlen=8, keysizemin=64, keysizemax=64
000 algorithm ESP encrypt: id=3, name=ESP_3DES, ivlen=8, keysizemin=192, keysizemax=192
...
...
000 algorithm IKE encrypt: id=0, name=(null), blocksize=16, keydeflen=131
000 algorithm IKE encrypt: id=5, name=OAKLEY_3DES_CBC, blocksize=8, keydeflen=192
...
...
000 
000 "mydom-vpn": 192.168.10.44:17/1701...77.77.77.77:17/1701; unrouted; eroute owner: #0
000 "mydom-vpn":     myip=unset; hisip=unset;
000 "mydom-vpn":   ike_life: 3600s; ipsec_life: 28800s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 3 
000 "mydom-vpn":   policy: PSK+ENCRYPT+PFS+IKEv2ALLOW+SAREFTRACK+lKOD+rKOD; prio: 32,32; interface: eth0; kind=CK_PERMANENT
000 "mydom-vpn":   dpd: action:clear; delay:30; timeout:120;  
000 "mydom-vpn":   newest ISAKMP SA: #0; newest IPsec SA: #0; eroute owner: #0;
000 "yourdom-vpn": 192.168.10.44:17/1701...88.88.88.88[10.0.0.250]:17/1701; unrouted; eroute owner: #0
000 "yourdom-vpn":     myip=unset; hisip=unset;
000 "yourdom-vpn":   ike_life: 28800s; ipsec_life: 3600s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 3 
000 "yourdom-vpn":   policy: PSK+ENCRYPT+PFS+IKEv2ALLOW+SAREFTRACK+lKOD+rKOD; prio: 32,32; interface: eth0; kind=CK_PERMANENT
000 "yourdom-vpn":   dpd: action:clear; delay:30; timeout:120;  
000 "yourdom-vpn":   newest ISAKMP SA: #0; newest IPsec SA: #0; eroute owner: #0;

Поднимем оба тоннеля.

# ipsec auto --up mydom-vpn
002 "mydom-vpn" #10: initiating Main Mode
105 "mydom-vpn" #10: STATE_MAIN_I1: initiate
003 "mydom-vpn" #10: ignoring unknown Vendor ID payload [4f53576d77657d7c497e6c7c]
003 "mydom-vpn" #10: received Vendor ID payload [Dead Peer Detection]
003 "mydom-vpn" #10: received Vendor ID payload [RFC 3947] method set to=115 
002 "mydom-vpn" #10: enabling possible NAT-traversal with method RFC 3947 (NAT-Traversal)
002 "mydom-vpn" #10: transition from state STATE_MAIN_I1 to state STATE_MAIN_I2
107 "mydom-vpn" #10: STATE_MAIN_I2: sent MI2, expecting MR2
003 "mydom-vpn" #10: NAT-Traversal: Result using draft-ietf-ipsec-nat-t-ike (MacOS X): both are NATed
002 "mydom-vpn" #10: transition from state STATE_MAIN_I2 to state STATE_MAIN_I3
109 "mydom-vpn" #10: STATE_MAIN_I3: sent MI3, expecting MR3
003 "mydom-vpn" #10: received Vendor ID payload [CAN-IKEv2]
002 "mydom-vpn" #10: Main mode peer ID is ID_IPV4_ADDR: '77.77.77.77'
002 "mydom-vpn" #10: transition from state STATE_MAIN_I3 to state STATE_MAIN_I4
004 "mydom-vpn" #10: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_PRESHARED_KEY cipher=aes_128 prf=oakley_sha group=modp2048}
002 "mydom-vpn" #11: initiating Quick Mode PSK+ENCRYPT+PFS+UP+IKEv2ALLOW+SAREFTRACK {using isakmp#10 msgid:461ff689 proposal=defaults pfsgroup=OAKLEY_GROUP_MODP2048}
118 "mydom-vpn" #11: STATE_QUICK_I1: initiate
000 "mydom-vpn" #11: add inbound eroute 77.77.77.77/32:0 --17-> 192.168.10.44/32:1701 => tun.10000@192.168.10.44 succeeded
000 "mydom-vpn" #11: eroute_connection replace eroute 192.168.10.44/32:1701 --17-> 77.77.77.77/32:0 => esp.f07b394f@77.77.77.77 succeeded
002 "mydom-vpn" #11: transition from state STATE_QUICK_I1 to state STATE_QUICK_I2
004 "mydom-vpn" #11: STATE_QUICK_I2: sent QI2, IPsec SA established transport mode {ESP=>0xf07b394f <0xa4fe8efe xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=77.77.77.77:4500 DPD=none}

# ipsec auto --up yourdom-vpn
002 "yourdom-vpn" #12: initiating Main Mode
105 "yourdom-vpn" #12: STATE_MAIN_I1: initiate
003 "yourdom-vpn" #12: received Vendor ID payload [Openswan (this version) 2.6.49.1 ]
003 "yourdom-vpn" #12: received Vendor ID payload [Dead Peer Detection]
003 "yourdom-vpn" #12: received Vendor ID payload [RFC 3947] method set to=115 
002 "yourdom-vpn" #12: enabling possible NAT-traversal with method RFC 3947 (NAT-Traversal)
002 "yourdom-vpn" #12: transition from state STATE_MAIN_I1 to state STATE_MAIN_I2
107 "yourdom-vpn" #12: STATE_MAIN_I2: sent MI2, expecting MR2
003 "yourdom-vpn" #12: NAT-Traversal: Result using draft-ietf-ipsec-nat-t-ike (MacOS X): both are NATed
002 "yourdom-vpn" #12: transition from state STATE_MAIN_I2 to state STATE_MAIN_I3
109 "yourdom-vpn" #12: STATE_MAIN_I3: sent MI3, expecting MR3
003 "yourdom-vpn" #12: received Vendor ID payload [CAN-IKEv2]
002 "yourdom-vpn" #12: Main mode peer ID is ID_IPV4_ADDR: '10.0.0.250'
002 "yourdom-vpn" #12: transition from state STATE_MAIN_I3 to state STATE_MAIN_I4
004 "yourdom-vpn" #12: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_PRESHARED_KEY cipher=aes_128 prf=oakley_sha group=modp2048}
002 "yourdom-vpn" #12: Dead Peer Detection (RFC 3706): enabled
002 "yourdom-vpn" #13: initiating Quick Mode PSK+ENCRYPT+PFS+UP+IKEv2ALLOW+SAREFTRACK {using isakmp#12 msgid:c567bba6 proposal=defaults pfsgroup=OAKLEY_GROUP_MODP2048}
118 "yourdom-vpn" #13: STATE_QUICK_I1: initiate
000 "yourdom-vpn" #13: add inbound eroute 88.88.88.88/32:0 --17-> 192.168.10.44/32:1701 => tun.10000@192.168.10.44 succeeded
000 "yourdom-vpn" #13: eroute_connection replace eroute 192.168.10.44/32:1701 --17-> 88.88.88.88/32:0 => esp.461bbf8d@88.88.88.88 succeeded
002 "yourdom-vpn" #13: Dead Peer Detection (RFC 3706): enabled
002 "yourdom-vpn" #13: transition from state STATE_QUICK_I1 to state STATE_QUICK_I2
004 "yourdom-vpn" #13: STATE_QUICK_I2: sent QI2, IPsec SA established transport mode {ESP=>0x461bbf8d <0xa189d098 xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=88.88.88.88:4500 DPD=enabled}

# /etc/rc.d/rc.ipsec status
IPsec running  - pluto pid: 14263
pluto pid 14263
2 tunnels up
some eroutes exist

Всё хорошо, оба тоннеля поднялись.
Остановим ipsec и настроим xl2tpd.

# ipsec auto --down yourdom-vpn
002 "yourdom-vpn": terminating SAs using this connection
002 "yourdom-vpn" #15: deleting state #15 (STATE_QUICK_I2)
000 "yourdom-vpn" #15: delete (half) inbound eroute 88.88.88.88/32:1701 --17-> 192.168.10.44/32:1701 => unk255.10000@192.168.10.44 succeeded
002 "yourdom-vpn" #12: deleting state #12 (STATE_MAIN_I4)

# ipsec auto --down mydom-vpn
002 "mydom-vpn": terminating SAs using this connection
002 "mydom-vpn" #16: deleting state #16 (STATE_QUICK_I2)
000 "mydom-vpn" #16: delete (half) inbound eroute 77.77.77.77/32:1701 --17-> 192.168.10.44/32:1701 => unk255.10000@192.168.10.44 succeeded
002 "mydom-vpn" #14: deleting state #14 (STATE_MAIN_I4)

# /etc/rc.d/rc.ipsec stop
ipsec_setup: Stopping Openswan IPsec...

L2TP

Редактируем /etc/xl2tpd/xl2tpd.conf

[global]
debug tunnel = no                                   ; для настройки можно поставить в "yes"
 
[lac mydom-vpn]
lns = vpn.mydom.ru                                  ; можно указать IP-адрес
require chap = yes
refuse pap = yes
require authentication = no
name = user1                                        ; имя пользователя в /etc/ppp/chap-secrets на сервере
ppp debug = no                                      ; для настройки можно поставить в "yes"
pppoptfile = /etc/ppp/options.xl2tpd.mydom-vpn      ; Можно написать один для всех соединений 
length bit = yes
redial = yes
;autodial = yes                                     ; Убрать комментарий, если хотим чтобы запускалось во время 
                                                    ; старта xl2tpd
 
[lac yourdom-vpn]
lns = vpn.yourdom.ru                                ; можно указать IP-адрес
require chap = yes
refuse pap = yes
require authentication = no
name = user2                                        ; имя пользователя в /etc/ppp/chap-secrets на сервере
ppp debug = no                                      ; для настройки можно поставить в "yes"
pppoptfile = /etc/ppp/options.xl2tpd.yourdom-vpn    ; Можно написать один для всех соединений 
length bit = yes
redial = yes
;autodial = yes                                     ; Убрать комментарий, если хотим чтобы запускалось во время 
                                                    ; старта xl2tpd

Создадим файл /etc/ppp/options.xl2tpd.mydom-vpn

ipcp-accept-local
ipcp-accept-remote
refuse-eap
noccp
noauth
idle 3600
mtu 1400
mru 1400
nodefaultroute
connect-delay 5000
noipdefault
silent
linkname mydom-vpn       # имя соединения, можно использовать для контроля запуска. В /var/run 
                         # появится файл ppp-mydom-vpn.pid, внутри с номером процесса и номером ppp интерфейса.

Создадим файл /etc/ppp/options.xl2tpd.yourdom-vpn

ipcp-accept-local
ipcp-accept-remote
refuse-eap
noccp
noauth
idle 3600
mtu 1400
mru 1400
nodefaultroute
connect-delay 5000
noipdefault
silent
linkname yourdom-vpn     # имя соединения, можно использовать для контроля запуска. В /var/run 
                         # появится файл ppp-yourdom-vpn.pid, внутри с номером процесса и номером ppp интерфейса.

Отредактируем файл /etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
user1 *       mydom_super_password      192.168.3.50      
user2 *       yourdom_super_password       *                   # если не знаем какой IP получим.

Создаем скрипт /etc/rc.d/rc.xl2tpd такой же как описан при настройке сервера и сделаем этот файл исполняемым.

# chmod +x /etc/rc.d/rc.xl2tpd

Для автозапуска после перезагрузки пропишем в /etc/rc.d/rc.local

# L2TP/IPSEC
/etc/rc.d/rc.ipsec start
/etc/rc.d/rc.xl2tpd start

Всё готово! Запускаем ipsec, xl2tpd и проверяем работу.

# /etc/rc.d/rc.ipsec start
ipsec_setup: Starting Openswan IPsec U2.6.49.1/K3.10.104-smp...

# /etc/rc.d/rc.ipsec status
IPsec running  - pluto pid: 23112
pluto pid 23112
No tunnels up

# /etc/rc.d/rc.xl2tpd start
Starting xl2tpd : 

# /etc/rc.d/rc.xl2tpd status
xl2tpd is running.

# ipsec auto --up mydom-vpn
002 "mydom-vpn" #1: initiating Main Mode
105 "mydom-vpn" #1: STATE_MAIN_I1: initiate
003 "mydom-vpn" #1: ignoring unknown Vendor ID payload [4f53576d77657d7c497e6c7c]
003 "mydom-vpn" #1: received Vendor ID payload [Dead Peer Detection]
003 "mydom-vpn" #1: received Vendor ID payload [RFC 3947] method set to=115 
...
...

# ipsec auto --up yourdom-vpn
002 "yourdom-vpn" #3: initiating Main Mode
105 "yourdom-vpn" #3: STATE_MAIN_I1: initiate
003 "yourdom-vpn" #3: received Vendor ID payload [Openswan (this version) 2.6.49.1 ]
003 "yourdom-vpn" #3: received Vendor ID payload [Dead Peer Detection]
003 "yourdom-vpn" #3: received Vendor ID payload [RFC 3947] method set to=115 
...
...

# /etc/rc.d/rc.ipsec status
IPsec running  - pluto pid: 23112
pluto pid 23112
2 tunnels up
some eroutes exist

# echo "c mydom-vpn" > /var/run/xl2tpd/l2tp-control
# echo "c yourdom-vpn" > /var/run/xl2tpd/l2tp-control
# ifconfig
...
...
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1400
        inet 192.168.3.50  netmask 255.255.255.255  destination 192.168.3.251
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 4  bytes 46 (46.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9  bytes 240 (240.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ppp1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1400
        inet 10.0.0.50  netmask 255.255.255.255  destination 10.0.0.251
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 4  bytes 46 (46.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 120 (120.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...
...

Всё, подняли VPN с двумя разными серверами. Но работать мы можешь только с самими серверами, а не с оборудованием и компьютерами в удалённой локальной сети. Чтобы получить такую возможность нужно пробросить маршрут до этих сетей.

# route add -net 192.168.3.0 netmask 255.255.255.0  gw 192.168.3.251
# route add -net 10.0.0.0 netmask 255.255.255.0  gw 10.0.0.251

Если тоннели больше не нужны, закрываем их.

# echo "d mydom-vpn" > /var/run/xl2tpd/l2tp-control
# echo "d yourdom-vpn" > /var/run/xl2tpd/l2tp-control
# ipsec auto --down mydom-vpn
# ipsec auto --down yourdom-vpn

Скрипт

Для автоматизации запуска и остановки ipsec и xl2tpd соединений, а так же записи маршрута в таблицу маршрутизации, я написал скрипт.
Для его корректной работы необходимо, чтобы значение lac в xl2tpd.conf, conn в ipsec.conf и linkname в options.xl2tpd.*, были одинаковыми!
Использование:

./rc.l2ipsec-vpn {connection name} {start|stop|restart}

Прежде, чем запускать данный скрипт, изучите его содержимое. Я не несу никакой ответственности, если что-то пойдет не так, как вам казалось или хотелось. :)
У меня он работает на множестве VPN соединений.

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

Windows

Как создавать новое VPN подключение, в Интернете описано во многих местах и очень подробно. Для каждой Windows системы отдельно и даже в картинках. Основной принцип сводится к:
«Панель Управления» → «Центр управления сетями и общим доступом» → «Настройка нового подключения или сети»
Я покажу как настроить VPN подключение к нашему L2TP/IPSec серверу и решение 2-х, часто возникающих ошибок при подключении.

Допустим, мы назвали наше подключение «my-vpn» которое настроим на подключение к серверу по адресу vpn.mydom.ru:





Все остальные параметры оставим по умолчанию. И пробуем подключиться, набрав имя пользователя и пароль указанный в /etc/ppp/chap-secrets


Иногда, возникает ошибка подключения (809), мне помог следующий рецепт:
Находим ветку реестра
HKLM\SYSTEM/CurrentControlSet/Services/PolicyAgent или HKLM\SYSTEM/CurrentControlSet/Services/IPSec
Создаем в нем параметр AssumeUDPEncapsulationContextOnSendRule DWORD (32 бита). Изменяем его значение на одно из следующих:
1 - настраивает Windows на возможность создания ассоциаций безопасности с серверами, которые расположены за NAT;
2 - настраивает Windows на возможность создания ассоциаций безопасности , когда и клиент и сервер находятся за устройствами NAT.
(чаще помогает - 2)
Перезагрузите компьютер.

Ошибка 789:
Находим ветку реестра и меняем значения, если нет, создаем:
HKLM/System/CurrentControlSet/Services/Rasman/Parameters
ProhibitIpSec=dword:00000001
AllowL2TPWeakCrypto=dword:00000001


Обсуждаем на форуме.

Навигация
Печать/экспорт
QR Code
QR Code wiki:articles:l2tp (generated for current page)