Powershell скрипт автоматического подключения к L2TP/IPsec VPN на Windows
PowerShell скрипт для подключения к L2TP VPN на Windows с полным логированием.
Скрипт создаёт VPN-подключение (если отсутствует), устанавливает соединение, настраивает статические маршруты к удалённым сетям и проверяет работоспособность подключения.
Поддерживает L2TP, включает расширенную диагностику при сбоях. Все конфиденциальные данные (IP-адреса, учётные данные) вынесены в переменные для простой настройки под любую инфраструктуру.
# ============================================
# КОНФИГУРАЦИЯ - измените под свои параметры
# ============================================
$VPN_NAME = "MikroTik-VPN"
$VPN_USERNAME = "vpnusername"
$VPN_PASSWORD = "passwordvpn!"
$TARGET_NETWORK = "10.10.10.0"
$NETWORK_MASK = "255.255.255.0"
$VPN_GATEWAY = "172.16.26.1"
$TEST_IP = "10.10.10.1"
$LOG_FILE = "C:\Scripts\VPN_Connection.log"
$NETWORK_LOAD_DELAY = 15
$CONNECTION_DELAY = 5
$PING_DELAY = 2
# ============================================
# ОСНОВНОЙ КОД
# ============================================
# Логирование
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Write-Output "[$timestamp] Запуск скрипта автоподключения VPN" | Out-File $LOG_FILE -Append
# Ждём загрузки сетевых служб
Start-Sleep -Seconds $NETWORK_LOAD_DELAY
Write-Output "[$timestamp] Ожидание завершено" | Out-File $LOG_FILE -Append
# Подключаемся к VPN
try {
$output = rasdial $VPN_NAME $VPN_USERNAME $VPN_PASSWORD 2>&1 | Out-String
Write-Output "[$timestamp] Результат подключения: $output" | Out-File $LOG_FILE -Append
Write-Output "[$timestamp] VPN подключен успешно" | Out-File $LOG_FILE -Append
} catch {
Write-Output "[$timestamp] Исключение при подключении: $_" | Out-File $LOG_FILE -Append
}
# Ждём установки соединения
Start-Sleep -Seconds $CONNECTION_DELAY
# Удаляем старый маршрут если есть (игнорируем ошибки)
try {
cmd /c "route DELETE $TARGET_NETWORK" 2>$null | Out-Null
Write-Output "[$timestamp] Старый маршрут удалён" | Out-File $LOG_FILE -Append
} catch {
Write-Output "[$timestamp] Старого маршрута не было" | Out-File $LOG_FILE -Append
}
# Добавляем маршрут
try {
$routeOutput = cmd /c "route ADD $TARGET_NETWORK MASK $NETWORK_MASK $VPN_GATEWAY -p" 2>&1 | Out-String
Write-Output "[$timestamp] Результат добавления маршрута: $routeOutput" | Out-File $LOG_FILE -Append
Write-Output "[$timestamp] Маршрут добавлен успешно" | Out-File $LOG_FILE -Append
} catch {
Write-Output "[$timestamp] Исключение при добавлении маршрута: $_" | Out-File $LOG_FILE -Append
}
# Проверяем маршрут
$routes = route PRINT | Select-String $TARGET_NETWORK
Write-Output "[$timestamp] Текущие маршруты к ${TARGET_NETWORK}:" | Out-File $LOG_FILE -Append
Write-Output "$routes" | Out-File $LOG_FILE -Append
# Проверяем связь
Start-Sleep -Seconds $PING_DELAY
if (Test-Connection -ComputerName $TEST_IP -Count 2 -Quiet) {
Write-Output "[$timestamp] Проверка связи: SUCCESS (ping $TEST_IP)" | Out-File $LOG_FILE -Append
} else {
Write-Output "[$timestamp] Проверка связи: FAILED (ping $TEST_IP)" | Out-File $LOG_FILE -Append
}
Write-Output "[$timestamp] Скрипт завершён" | Out-File $LOG_FILE -Append