UMGUM.COM 

MS Windows + L2TP + IPsec ( Попытка наладить подключение windows-системы к L2TP-серверу, с обязательным шифрованием VPN-трафика. )

17 сентября 2020  (обновлено 30 марта 2021)

OS: "Microsoft Windows 8/10/2008/2012/2016/2019".
Apps: "rasdial", "rasphone", "taskschd.msc".

Задача: наладить подключение windows-системы к L2TP-серверу, с обязательным шифрованием VPN-трафика.

К сожалению, сразу отмечу, что задача создания стабильного VPN-туннеля посредством L2TP+IPsec из операционных систем "MS Windows" оказалась для меня невыполнимой. Реализация протокола L2TP в современных "MS Windows" отвратительно нестабильна. Ежедневно соединение рвалось раз по десять, при том, что соседние (буквально стоящие бок о бок, с идентичным сетевым подключением) linux-серверы и маршрутизаторы "Cisco" или "Mikrotik" удерживали связь месяцами, без единого сбоя. Публикую это на память, а не как руководство к действию.


Об инструментарии.

Для управления PPP-соединениями (в том числе и L2TP) в windows-системах используются две утилиты: "rasdial.exe" и "rasphone.exe". Утилита "rasdial" появилась ещё в самых ранних версиях "MS Windows" и используется для непосредственного управления удалёнными подключениями. Утилита "rasphone" предназначается для конфигурирования параметров удалённых подключений и ведения своего рода "телефонной книги" таковых. Расположены они в системном каталоге "C:\Windows\system32".

Глобальные "телефонные книги" описания параметров удалённых подключений хранятся в директории по следующему адресу в файловой системе:

C:\ProgramData\Microsoft\Network\Connections\Pbk

В некоторых случаях глобальная "телефонная книга" может также оказаться в исторически более старом месте файловой системы:

%SYSTEMROOT%\System32\Ras\
%SYSTEMROOT%\System32\config\systemprofile\AppData\Roaming\Microsoft\Network\Connections\Pbk

Локальные "телефонные книги" размещаются в профиле пользователя, примерно по следующему адресу:

C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Network\Connections\Pbk

Кроме того, текстовый файл с описанием "телефонной книги" можно размещать в произвольном месте, указывая на него при запуске утилиты "rasdial" (параметр "/phonebook:C:\...") или "rasphone" (параметр "-f C:\...").

Конфигурирование удалённого подключения.

Вызов утилиты управления "телефонной книгой" покажет GUI-интерфейс для создания нового удалённого подключения и выбора из имеющихся, с возможностью запуска соединения или редактирования его параметров. Создаём новое удалённое L2TP-подключение:

C:\> rasphone

Set up a new connection -> Workplace network (VPN):
  Internet address: 100.200.250.21
  Destination name: gate.example.net
  Remember my credentials: true

Choose a network connection -> "l2tp-gate.example.net" -> Properties:
  General:
    Host name or IP of destination: gate.example.net
  Options:
    Remember my credentials: true
    Idle time before handing up: Never
    PPP Settings:
      Enable LCP extensions
  Security:
    Type of VPN: Layer 2 Tunneling Protocol with IPsec (L2TP/IPsec)
    Advanced Properties:
      Use preshared key for authentication: strongSecretKey
    Data encryption: Require encryption
    Authentication:
      Allow these protocols: MS-CHAPv2
  Networking:
    TCP/IPv6: false
    TCP/IPv4:
      Obtain an IP address automaticaly: true
      Obtain DNS server address automaticaly: true
      Advanced:
        IP Settings:
          Use default gateway on remote network: false
          Disable class based route addition: false
    File and Printer Sharing for Microsoft Network: false    
    Client for Microsoft Networks: false

При следующем вызове "телефонной книги" из перечня доступных удалённых подключений можно будет выбрать только что сконфигурированное выше и попробовать подключиться:

C:\> rasphone

Choose a network connection -> "l2tp-gate.example.net" -> Connect:
  User name: vpn-node0-tunnel
  Password: strongSecretPassword
  ....

Можно миновать этап выбора из перечня доступных соединений, запуская сразу целевое:

C:\> rasphone -d "l2tp-gate.example.net"

Просматриваем перечень работающих соединений:

C:\> rasdial

Connected to
  l2tp-gate.example.net
Command complited saccesfully.

Выключаем L2TP-туннель:

C:\> rasdial "l2tp-gate.example.net" /disconnect

По умолчанию при создании нового удалённого подключения его конфигурация сохраняется в файловой структуре профиля пользователя. Для общесистемных нужд желательно разместить эти настройки в "более системном" месте.

Элементарно вырезаем XML-структуру, описывающую удалённое подключение, из текстового файла "%APPDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk" и вставляем в файл "%PROGRAMDATA%\Microsoft\Network\Connections\Pbk\rasphone.pbk".

После успешного тестирования работоспособности VPN-соединения задаём в конфигурации недоступные для настройки через GUI параметры автоматического переподключения при разрыве сетевого соединения (по неведомой причине разработчики "MS Win 10/2012/2016/2019" убрали этот функционал из GUI):

C:\> notepad C:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk

[l2tp-gate.example.net]
....
RedialAttempts=3
RedialSeconds=60
IdleDisconnectSeconds=0
RedialOnLinkFailure=1
....

Подготовка скрипта для запуска L2TP-туннеля.

Я долго бился с малознакомыми мне системами "MS Windows 8/10/2016", пытаясь наладить посредством "rasphone" запуск соединения с вроде как сохранённым для него логином и паролем подключения, но безуспешно. Просто и надёжно у меня заработал только способ запуска соединения посредством утилиты "rasdial" с указанием в виде открытого текста логина и пароля подключения:

C:\> rasdial "l2tp-gate.example.net" "vpn-node0-tunnel" "strongSecretPassword"

Пришлось написать скрипт, в котором сохранить эти параметры:

C:\> mkdir "C:\Program Files\L2TP"
C:\> notepad "C:\Program Files\L2TP\vpn-gate.example.net-startup.bat"

@echo off
echo L2TP VPN-connection to IT Department in Example office...

set CONNPROF=l2tp-gate.example.net
set USERNAME=vpn-node0-tunnel
set PASSWORD=strongSecretPassword

rasdial "%CONNPROF%" "%USERNAME%" "%PASSWORD%"

Запускаем L2TP-туннель:

C:\> C:\Program Files\L2TP\vpn-gate.example.net-startup.bat

L2TP VPN-connection to IT Department in Example office...
Connecting to l2tp-gate.example.net...
Verifing username and password...
Registering your computer on the network...
Successfully connected to l2tp-gate.example.net.
Command completed successfully.

Автоматизация запуска и восстановления L2TP-туннеля.

К сожалению, несмотря на явное указание удерживать VPN-соединение, ОС "MS Windows 10/2012/2016/2019" этого не делает в реальности. Если разорвать соединение на стороне сервера или промежуточного сетевого узла, то со стороны клиентской системы никаких действий по восстановлению сессии не предпринимается.

На данный момент самый простой и рабочий способ добиться автоматически запускаемого вместе с операционной системой и восстанавливаемого после сбоя соединения - в создании регулярно исполняемой по расписанию задачи:

Win+R -> "taskschd.msc" -> Create Task:
  General:
    Name: gate.example.net VPN-connection persistent
    Security options:
      When running the task? use the following user account: Administrator
        Run whether user is logged or not: true
          Do not store password. The task will only have access to local computer resources.
  Triggers:
    Trigger:
      Begin the task: At startup (at system startup)
      Advanced settings:
        Delay task for: 30 seconds
    Trigger:
      Settings: One time
      Advanced settings:
        Repeat task every: 5 minutes
          for a duration of: Indefinitely
  Actions:
    Action: Start a program
    Program/script: "C:\Program Files\L2TP\vpn-gate.example.net-startup.bat"
  Settings:
    Allow task to be run on demand: true
    Run task as soon as posible after a scheduled start is missed: true
    Stop the task if it runs longer than... : false
    If the running task does not end when reqested, force it to stop: false

В описании задачи расписания есть пара неочевидных моментов. Во-первых, в процессе тестирования автоматический регулярный запуск BAT-скрипта срабатывал только в том случае, если это делалось от имени реально существующего пользователя, например "Administrator", а не встроенных системных вроде "SYSTEM" или "LOCAL_SERVICE". Во-вторых, "триггеры" автоматического запуска вместе со стартом операционной системы и регулярный перезапуск скрипта должны быть разделены, по не совсем логичной, на мой взгляд логике, но на практике работающей именно так.

Удобно то, что задачу переподключения можно запускать часто, не засоряя при этом журнал L2TP-сервера - клиент "rasdial" не будет разрывать сессию и подключаться заново, если соединение уже установлено, выводя в этом случае следующее уведомление:

....
You are already connected to l2tp-gate.example.net.
Command completed successfully.

Добавление сетевых маршрутов.

В производственной среде VPN-туннели чаще предназначены для передачи только выделенного трафика - к тем сервисам, что нуждаются в изоляции внутри корпоративной сети. Соответственно, после установления VPN-соединения, необходимо активировать дополнительные сетевые маршруты, направляющие выделенный трафик не через "шлюз по умолчанию", а через L2TP-сервер.

Пример добавления постоянных (активных только тогда, когда достижим узел пересылки) сетевых маршрутов:

C:\> route -p add 10.10.10.0 mask 255.255.255.0 10.172.255.1
C:\> route -p add 192.168.10.0 mask 255.255.255.0 10.172.255.1

Замечания по результатам эксплуатации.

Это не работает, в итоге. Реализация протокола L2TP в "MS Windows" совершенно нестабильна и соединение рвётся очень часто, не восстанавливаясь при этом автоматически. Проверка и перезапуск каждые пять минут (минимальный промежуток между перезапуском задачи встроенного "Task Scheduler") делу не сильно помогает, так как даже минутный разрыв связи на производстве критичен.

На практике мы полностью отказались от попыток сделать из "MS Windows" что-то сетевое, везде устанавливая перед группами windows-систем маршрутизаторы "Cisco" или "Mikrotik", уже на них терминируя VPN-туннели.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )