zaLinux.ru

Скрипт для подключения и отключения от OpenVPN в зависимости от доступности сервера


Задача:

Подсети филиалов объединены через 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.

Смотрите также:


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован.