Задача:
Подсети филиалов объединены через OpenVPN. Все клиенты подключаются к серверу и маршруты в интернет прописаны через OpenVPN сервер. Всё работает, только вот есть проблема. Если OpenVPN сервер по какой-то причине остаётся без Интернета, то и все остальные филиалы тоже остаются без интернета, ведь трафик идёт не через свой шлюз, а через сервер OpenVPN. Можно ли как-то написать скрипт, чтобы:
1. При отсутствии связи до OpenVPN сервера маршруты восстанавливались и работали через собственный шлюз.
2. Раз 2-3 минуты клиент пытался бы подключиться к OpenVPN серверу.
3. При восстановлении подключения маршруты прописывались бы снова через OpenVPN сервер.
Решение:
В теории, вполне возможно написать скрипт на Bash (для Linux) или PowerShell (для Windows) который бы пинговал OpenVPN сервер и в случае если сервер онлайн выполнял бы подключение к нему или если подключение уже присутствует, то ничего бы не делал. А если OpenVPN сервер офлайн, то выполнял бы отключение от него или ничего не делал, если сервер уже отключён. В Linux такой скрипт можно добавить в автозагрузку и затем регулярно его запускать с помощью таймеров Systemd или Cron. В Windows тоже это можно решить с помощью Диспетчера задач (Windows Task Scheduler).
Но, ИМХО, это кардинально неправильный подход. Нужно стремиться к тому, чтобы OpenVPN сервер всегда был онлайн. Поскольку для чего-то же он нужен в работе пользователей, если они к нему подключаются? А если так, то при отключении от OpenVPN будут сбои в подключении к локальным ресурсам.
И тем не менее, вот примеры скриптов.
Для Windows скрипт написан на PowerShell, создайте файл vpn.ps1 и скопируйте в него (замените IP адрес OpenVPN сервера и путь до конфигурационного файла на свои):
# IP адрес сервера OpenVPN $openvpnIP='185.117.153.79' # путь до конфигурационного файла для подключения клиента к OpenVPN серверу $openvpnFILE='C:\Users\MiAl\client1.ovpn' if (Test-Connection -TargetName $openvpnIP -IPv4 -Count 1 -Quiet -TimeoutSeconds 1) { 'OpenVPN server is up' if (Get-Process | Where-Object { $_.Name -eq "openvpn" }) { 'OpenVPN connection is active. Nothing to do' } else { Write-Warning 'No OpenVPN connections, trying to connect...' & "C:\Program Files\OpenVPN\bin\openvpn.exe" --config $openvpnFILE & } } else { Write-Warning 'OpenVPN server is down' if (Get-Process | Where-Object { $_.Name -eq "openvpn" }) { 'OpenVPN connection is active, let us kill it' Get-Process | Where-Object { $_.Name -eq "openvpn" } | Select-Object -First 1 | Stop-Process } else { Write-Warning 'No OpenVPN connections. Nothing to do' } }
Проверять так:
.\vpn.ps1
OpenVPN сервер онлайн, поэтому скрипт выполняет подключение к нему и при последующих проверках ничего не делает. Проверка IP клиента показывает, что выход в Интернет выполняется действительно через OpenVPN:
OpenVPN офлайн, поэтому скрипт разрывает связь с ним. При последующих проверках скрипт ничего не делает пока OpenVPN сервер не станет доступен. Когда OpenVPN снова онлайн, выполняется подключение к нему.
Используйте Диспетчера задач Windows для запуска вашего скрипта примерно следующим образом:
powershell -File vpn.ps1 -WindowStyle Hidden
Пример скрипта для Linux — создайте файл vpn.sh и скопируйте в него:
#!/bin/bash # IP адрес сервера OpenVPN openvpnIP='185.117.153.79' # путь до конфигурационного файла для подключения клиента к OpenVPN серверу openvpnFILE='/home/mial/bin/OpenVPNassistent-конфигурации/configs/client1.ovpn' isOpenVPNActive=`pgrep openvpn` timeout 1 ping -c 1 $openvpnIP > /dev/null; if [ $? -eq 0 ]; then echo 'Сервер онлайн' if [ -z "$isOpenVPNActive" ]; then echo 'Подключение к OpenVPN отсутствует, подключаемся...' sudo openvpn "$openvpnFILE" & else echo 'Уже подключены к OpenVPN, ничего не делаем...' fi else echo 'Сервер офлайн' if [ -z "$isOpenVPNActive" ]; then echo 'Подключение к OpenVPN отсутствует, ничего не делаем...' else echo 'Подключены к OpenVPN, разрываем связь...' kill "$isOpenVPNActive" fi fi
Запускать так:
sudo bash vpn.sh
OpenVPN сервер онлайн, поэтому скрипт выполняет подключение к нему и при последующих проверках ничего не делает. Проверка IP клиента показывает, что выход в Интернет выполняется действительно через OpenVPN. OpenVPN офлайн, поэтому скрипт разрывает связь с ним. При последующих проверках скрипт ничего не делает пока OpenVPN сервер не станет доступен. Когда OpenVPN снова онлайн, выполняется подключение к нему.
Для регулярного запуска используйте .timer systemd или cron.
Смотрите также:
Связанные статьи:
- Изменения в конфигурационных файлах при переходе с OpenVPN 2.4.* на OpenVPN 2.5.* (94.6%)
- Как использовать OpenVPN с протоколом TCP (94.6%)
- Сравнение производительности (скорости передачи данных) OpenVPN через UDP и TCP (94.6%)
- Одновременное использование нескольких OpenVPN на одном сервере (94.6%)
- Ошибки «TLS Error: TLS key negotiation failed to occur within 60 seconds» и «TLS handshake failed» (РЕШЕНО) (94.6%)
- Как узнать все DNS записи сайтов за CloudFlare (RANDOM - 50%)