Buenas tardes, me he encontrado con un problema que tiene Wireguard en general, no solo este plugin, el problema consiste en que si el servidor de wireguard tiene ip dinámica y por lo tanto tiene que usar DDNS, en el momento que el servidor cambia de ip el cliente no se actualiza y se produce una desconexión de la red VPN.
Tras investigar un poco encontré un script oficial de wireguard que soluciona este problema, se llama
reresolve-dns.sh:
Código:
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (C) 2015-2020 Jason A. Donenfeld <[email protected]>. All Rights Reserved.
set -e
shopt -s nocasematch
shopt -s extglob
export LC_ALL=C
CONFIG_FILE="$1"
[[ $CONFIG_FILE =~ ^[a-zA-Z0-9_=+.-]{1,15}$ ]] && CONFIG_FILE="/etc/wireguard/$CONFIG_FILE.conf"
[[ $CONFIG_FILE =~ /?([a-zA-Z0-9_=+.-]{1,15})\.conf$ ]]
INTERFACE="${BASH_REMATCH[1]}"
process_peer() {
[[ $PEER_SECTION -ne 1 || -z $PUBLIC_KEY || -z $ENDPOINT ]] && return 0
[[ $(wg show "$INTERFACE" latest-handshakes) =~ ${PUBLIC_KEY//+/\\+}\ ([0-9]+) ]] || return 0
(( ($EPOCHSECONDS - ${BASH_REMATCH[1]}) > 135 )) || return 0
wg set "$INTERFACE" peer "$PUBLIC_KEY" endpoint "$ENDPOINT"
reset_peer_section
}
reset_peer_section() {
PEER_SECTION=0
PUBLIC_KEY=""
ENDPOINT=""
}
reset_peer_section
while read -r line || [[ -n $line ]]; do
stripped="${line%%\#*}"
key="${stripped%%=*}"; key="${key##*([[:space:]])}"; key="${key%%*([[:space:]])}"
value="${stripped#*=}"; value="${value##*([[:space:]])}"; value="${value%%*([[:space:]])}"
[[ $key == "["* ]] && { process_peer; reset_peer_section; }
[[ $key == "[Peer]" ]] && PEER_SECTION=1
if [[ $PEER_SECTION -eq 1 ]]; then
case "$key" in
PublicKey) PUBLIC_KEY="$value"; continue ;;
Endpoint) ENDPOINT="$value"; continue ;;
esac
fi
done < "$CONFIG_FILE"
process_peer
Guardé el script en la ruta: /usr/script/
Para ejecutarlo, es suficiente con poner en la terminal:
Código:
./usr/script/reresolve-dns.sh /etc/wireguard/Wg0.conf
Y de nuevo recuperé la conexión de VPN.
Imagino que ejecutando desde cron cada X minutos el comando ya tendria solucionado el problema.
Pero me dió por ir un poco más allá y pensé que la conexión VPN también podría fallar por la conexión entre el deco y el router o incluso por pérdida de conexión de internet.
¿Como podría saber el motivo del la caída de la red VPN de forma rápida y automática?
Y se me ocurrió la idea de crear un script que se encargara de ello.
El script que voy a compartir es la unión de varios script buscados por la red adaptados a este problema que comento.
Decir que no tengo ni idea de hacer scripts, así que pido disculpas si los entendidos ven muchas burradas y les animo a que compartan que mejoras o modificaciones se les ocurren.
check_vpn_wireguard.sh:
Código:
#!/bin/sh
# script que informa y/o recupera conexión de red VPN Wireguard
################### Insertar los valores dependiendo de vuestro deco. ###################################################
log=/var/log/oscam.log # Donde tienes el log oscam
lineas=4 # Numero lineas ultimas en que busca errores
ip_deco=127.0.0.1 # Direccion ip de nuestro receptor
userweb=xxxxxx # Usuario webinf
passweb=yyyyyy # Password webinf
webport=80 # Puerto webinf
tiempo=300 # Cada cuanto tiempo queremos que se ejecute la revisión del log buscando errores
error="Connection timed out" # Tipo error que queremos que busque
ip_router=192.168.X.1 # IP nuestro router
ip_internet=8.8.8.8 # URL o DNS de Google
host_vpn=xxyyzz.dyndns.org # Dirección VPN
interfaz=Wg0.conf # Archivo conf en /etc/wireguard/
#############################################################################################################################################
#Obtener ip del host y guardarla en /tmp/ip_host.txt
nslookup $host_vpn | grep "Address" | awk '{print $2}' | sed -n 2p &> /tmp/ip_host.txt
#echo "obtenida ip y guardada en /tmp"
#sleep 3
#echo "buscando errores en el log..."
#sleep 3
##################################################
while true
do
tiempo=$tiempo
count=`tail -n $lineas $log | grep "$error" | wc -l`
if [ "$count" -gt "0" ]
then
curl "http://$userweb:$passweb@$ip_deco:$webport/web/message?text=¡Error+conexión+VPN!%0AIniciando+proceso+de+recuperación+automático%0APor+favor+espere...&type=2&timeout=60"
ping -c 1 ${ip_router} >/dev/null 2>/dev/null
respuesta1=$?
if [ $respuesta1 -eq 1 ];
then
# echo "conexion router nok"
curl "http://$userweb:$passweb@$ip_deco:$webport/web/message?text=No+hay+conexion+con+el+router+compruebe:%0Arouter+encendido%0Aconexión+cable+de+red%0Ao%%0Awifi+activo+en+router%0Acontraseña+wifi+correcta&type=2"
else
# echo "conexion router ok"
sleep 5
ping -c 1 ${ip_internet} >/dev/null 2>/dev/null
respuesta2=$?
if [ $respuesta2 -eq 1 ];
then
# echo "conexion internet nok"
curl "http://$userweb:$passweb@$ip_deco:$webport/web/message?text=No+hay+conexion+de+internet+compruebe:%0Aluces+encendidas+en+router%0Aconexion+cable+wan+en+router&type=2"
else
# echo "conexion internet ok"
nslookup $host_vpn | grep "Address" | awk '{print $2}' | sed -n 2p &> /tmp/ip_host_new.txt
sleep 10
cmp "/tmp/ip_host.txt" "/tmp/ip_host_new.txt"
respuesta3=$?
if [ $respuesta3 -eq 0 ];
then
# echo "conexion vpn ok"
rm /tmp/ip_host_new.txt
curl "http://$userweb:$passweb@$ip_deco:$webport/web/message?text=¡VPN+conexión+OK!%0ASi+sigue+el+bloqueo+de+la+emisión:%0Acambie+de+canal%0Areinicie+camd%0Areinicie+equipo&type=2"
else
# echo "conexion vpn nok"
curl "http://$userweb:$passweb@$ip_deco:$webport/web/message?text=No+hay+conexión+VPN%0AReiniciando+conexión+espere...&type=2&timeout=20"
sh /usr/script/reresolve-dns.sh /etc/wireguard/$interfaz
mv /tmp/ip_host_new.txt /tmp/ip_host.txt
sleep 5
fi
fi
fi
fi
sleep 60
done
El script se guarda en /usr/script/ junto con reresolve-dns.sh
Permisos 755 a los dos script
Código:
chmod 755 reresolve-dns.sh
chmod 755 check_vpn_wireguard.sh
Habilitar log en oscam.conf:
Código:
nano /etc/tuxbox/config/oscam_1.20/oscam.conf
logfile= stdout;/var/log/oscam.log
Guardamos: Ctrl+X
Iniciar script en el arranque
Editamos /usr/bin/enogma2.sh
Buscamos en el archivo:
if [ -d /home/root ]; then
cd /home/root
export HOME=/home/root
fi
Copiar debajo lo siguiente:
if [ -x /usr/script/check_vpn_wireguard.sh ]; then
/usr/script/check_vpn_wireguard.sh &
fi
Guardamos: Ctrl+X
Reiniciamos y ya está funcionando.
Espero que les sea de utilidad.
Saludos Nozul