Дата написания: май 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