#!/bin/bash is_serverip6route_set() { local server_ip6=${1} if [[ -z "${server_ip6}" ]]; then return 0 fi if ! ip -6 route | grep -q "^${server_ip6}"; then return 1 fi } set_serverip6route() { local server_ip6=${1} local ip6_gw=${2} local wired_device=${3} ip route add "${server_ip6}/128" via "${ip6_gw}" dev "${wired_device}" } wired_device=$(ip route | awk '/default via/ { print $5; }') # See https://openvpn.net/community-resources/reference-manual-for-openvpn-2-4/#environmental-variables # to have a list of variables provided by OpenVPN, i.e: # - ifconfig_ipv6_remote # - net_gateway_ipv6 server_ip6=${ifconfig_ipv6_remote} ip6_gw=${net_gateway_ipv6} echo "[INFO] Autodetected internet interface: ${wired_device}" if [[ -n "${server_ip6}" ]]; then echo "[INFO] Autodetected IPv6 address for the VPN server: ${server_ip6}" else echo "[INFO] No IPv6 address for the VPN server detected" echo "[INFO] No IPv6 route set" exit 0 fi # Set the new server ipv6 route if [[ -n "${ip6_gw}" ]]; then if ! is_serverip6route_set "${server_ip6}"; then set_serverip6route "${server_ip6}" "${ip6_gw}" "${wired_device}" fi echo "[INFO] Native IPv6 detected" echo "[INFO] Autodetected native IPv6 gateway: ${ip6_gw}" if is_serverip6route_set "${server_ip6}"; then echo "[ OK ] IPv6 server route correctly set" else echo "[FAIL] No IPv6 server route set" >&2 exit 1 fi else echo "[INFO] No native IPv6 detected" echo "[INFO] No IPv6 server route to set" fi