Failover for two (or more) Wireguard VPN

Hello! Help set the switch between the VPN Wireguard when one is not available, so that OpenWRT automatically switches to the other. I use Wireguard to protect all the traffic.

I wrote a short script that I use outside of OpenWrt but you can easily modify it a bit to fit the wg-framework on your router.


handshake=$(wg | grep "latest handshake" | cut -d ":" -f2 | cut -d "," -f1)
pingtest=$(ping -c 3 | grep "time" | head -n 3)
wg1status=$(systemctl status wg-quick@wg1 | grep "Active: active")
wg2status=$(systemctl status wg-quick@wg2 | grep "Active: active")

if [[ $handshake == *"1 minute"* ]]; then
	echo "ok"
	[[ -z $pingtest ]]; then
		if [[ -z $wg2status ]]; then
			wg-quick down wg1
			wg-quick up wg2
		       [[ -z $wg1status ]]; then	
			wg-quick down wg2
			wg-quick up wg1

Since you don't have the wg-quick on your router, you can work with something like wg | grep wg | cut -d ":" -f2 to check wich interface is currently up and use it to fill $wgXstatus.
You may also change the $handshake test depending on your handshake settings.

Finally you can create a cronjob that runs the script every n minutes.