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
%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
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
....
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-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
....
....
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"
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%"
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.
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
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.
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
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-туннели.