30-vpnclient-set-server-ipv6-route 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/bin/bash
  2. is_serverip6route_set() {
  3. local server_ip6=${1}
  4. if [[ -z "${server_ip6}" ]]; then
  5. return 0
  6. fi
  7. if ! ip -6 route | grep -q "^${server_ip6}"; then
  8. return 1
  9. fi
  10. }
  11. set_serverip6route() {
  12. local server_ip6=${1}
  13. local ip6_gw=${2}
  14. local wired_device=${3}
  15. ip route add "${server_ip6}/128" via "${ip6_gw}" dev "${wired_device}"
  16. }
  17. wired_device=$(ip route | awk '/default via/ { print $5; }')
  18. # See https://openvpn.net/community-resources/reference-manual-for-openvpn-2-4/#environmental-variables
  19. # to have a list of variables provided by OpenVPN, i.e:
  20. # - ifconfig_ipv6_remote
  21. # - net_gateway_ipv6
  22. server_ip6=${ifconfig_ipv6_remote}
  23. ip6_gw=${net_gateway_ipv6}
  24. echo "[INFO] Autodetected internet interface: ${wired_device}"
  25. if [[ -n "${server_ip6}" ]]; then
  26. echo "[INFO] Autodetected IPv6 address for the VPN server: ${server_ip6}"
  27. else
  28. echo "[INFO] No IPv6 address for the VPN server detected"
  29. echo "[INFO] No IPv6 route set"
  30. exit 0
  31. fi
  32. # Set the new server ipv6 route
  33. if [[ -n "${ip6_gw}" ]]; then
  34. if ! is_serverip6route_set "${server_ip6}"; then
  35. set_serverip6route "${server_ip6}" "${ip6_gw}" "${wired_device}"
  36. fi
  37. echo "[INFO] Native IPv6 detected"
  38. echo "[INFO] Autodetected native IPv6 gateway: ${ip6_gw}"
  39. if is_serverip6route_set "${server_ip6}"; then
  40. echo "[ OK ] IPv6 server route correctly set"
  41. else
  42. echo "[FAIL] No IPv6 server route set" >&2
  43. exit 1
  44. fi
  45. else
  46. echo "[INFO] No native IPv6 detected"
  47. echo "[INFO] No IPv6 server route to set"
  48. fi