Site icon IT Draft

Автоматическое переподключение WireGuard при обрыве соединения

Автоматическое переподключение Wireguard при обрыве соединения

WireGuard auto reconnect

Протокол WireGuard VPN разработан без сохранения состояния. Соединения рассматриваются как интерфейс — когда они активны, они всегда остаются активными. Если соединение с VPN-сервером потеряно, интернет-соединение перестает работать до тех пор, пока VPN-сервер снова не станет доступным. Как только VPN-сервер снова становится доступным, WireGuard повторно устанавливает VPN-соединение, и трафик снова начинает проходить.

Иногда возникают ситуации, когда WireGuard теряет коннект к серверу, а соединение не восстанавливается. К сожалению из-за архитектурных особенностей у WireGuard нет механизма переподключения при обрыве соединения.

За основу взят скрипт из github репозитория

Так же есть готовый модуль Python, но я его не тестировал

Создаем каталог и немного отредактируем исходный скрипт, добавив логирование

Selectel — ведущий провайдер облачной инфраструктуры и услуг дата-центров

Компания занимает лидирующие позиции на рынке на рынке выделенных серверов и приватных облаков, и входит в топ-3 крупнейших операторов дата-центров в России.


$ sudo mkdir -p /opt/python_wireguard_auto_reconnect
$ sudo nano /opt/python_wireguard_auto_reconnect/Wireguard_Reconnect.py
#Imports
import os
import time
import logging
logging.basicConfig(level=logging.INFO, filename="wg_reconnect.log",filemode="w", format="%(asctime)s %(levelname)s %(message)s")
from pythonping import ping
#Failed Tries
failedTrys = 0
#None Stop Running
while(True):
   #Test Ping Sucessful
   if(ping('172.16.0.1')._responses[0].success):
      #print('Ping sucessful!')
      #logging.info('Ping sucessful!')
      #Reset Failed Tries
      failedTrys = 0
   #Test Ping failed
   else:
      #print('Ping fail! Restarting wireguard connection!')
      logging.warning('Ping fail! Restarting wireguard connection!')
      #Restart Wireguard-Interface w0
      os.system('systemctl stop wg-quick@wg0.service')
      time.sleep(5)
      os.system('systemctl start wg-quick@wg0.service')
      #Add one failed Try
      failedTrys = failedTrys + 1
   #More than 50 failed Tries make one 30 minutes timeout
   if(failedTrys >= 50):
      #Reset failed Tries
      failedTrys = 0
      #print('More than 50 failed Pings. Waiting 30 minutes for next ping!')
      logging.error('More than 50 failed Pings. Waiting 30 minutes for next ping!')
      #Sleep for 30 minutes
      time.sleep(1800)
   else:
      #print('Waiting 30 seconds for next ping!')
      #logging.info('Waiting 30 seconds for next ping!')
      #Wait 30 seconds for next ping
      time.sleep(30)

IP-адрес 172.16.0.1 – ip нашего WireGuard сервера

Устанавливаем необходимые модули Python

$ sudo pip3 install pythonping
$ sudo pip3 install sentry-sdk

Создаем Systemd Unit

$ sudo nano /etc/systemd/system/wgreconnect.service
[Unit]
Description=Wireguard Reconnect
After=multi-user.target

[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/python3 Wireguard_Reconnect.py
WorkingDirectory=/opt/python_wireguard_auto_reconnect/
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Перечитываем Systemd Unit, добавляем сервис в автозагрузку, запускаем

$ sudo systemctl daemon-reload
$ sudo systemctl enable wgreconnect.service
$ sudo systemctl start wgreconnect.service
$ systemctl status wgreconnect.service
Exit mobile version