Wireguard - Sonderkonfiguration

Ziel der Konfiguration

Zugriff auf das Heim LAN

Verschlüsselung des Internetverkehr im öffentlichen Netz

Alle Internet Verbindungen sollen den über ein Wireguard VPN nehmen.

Der Server ist für Routing im Heim-Netz bzw. Nating zuständig

IP-Bereiche

Einstellung auf der VPS

NAT or not to NAT

OIF=eth0
ip6tables  -t nat -A POSTROUTING -o $OIF -j MASQUERADE
ip6tables -A FORWARD -i wg0 -j ACCEPT

ipset create LAN nethash
ipset add LAN 192.168.178.0/24
ipset add LAN 10.18.1.0/24

iptables -A FORWARD -m set ! --match-set LAN src -j ACCEPT
iptables -A INPUT -m set --match-set LAN src -j ACCEPT
iptables -t nat -A POSTROUTING -o $OIF -j MASQUERADE

OIF ist die Bezeichnung der externen Interface auf der VPS

Für IPv6 ist nur ein normaler NAT vorgesehen.

Die Adressen im Bereich 192.168.178.0/24 sowie 10.18.1.0/24 dürfen nicht “genatet” werden. Deswegen wird ein ipset angelegt und die Adressen im Set abgelegt.

Anschliessend werden, unter Verwendung der ipset, die notwendige iptables Anweisungen aufgerufen.

Einstellung auf der Client

ip route add 192.0.2.123/32 via $GW dev $DEV metric 1
ip route add default dev wg0 via 10.18.1.1 dev wg0 metric 20

ip -6 r a default dev wg0 metric 20

Die erste Zeile sorgt für eine extra route zur VPS. Ohne diese Angabe würde die Verbindung zum VPS verloren sein.

GW *  * und * *DEV müssen dynamisch berechnet werden:

GW=`ip r g 1.1.1.1 | awk '{print $3;exit}'`
DEV=`ip r g 1.1.1.1 | awk '{print $5;exit}'`

Die Routen werden mit eine Metric versehen, damit wird die Priorität der einzeln festgelegte Routen festgelegt.

Viele Desktop-Distributionen setzen die Metric für die Schnittstelle auf ein Wert größer oder gleich 100. Wenn wir eine niedrige Metric vorgeben wird die angelegte Route priorisiert.

Linux Client-Script

#!/bin/bash
$VPS=192.0.2.123
$VPS6=2001:db0:cafe::1
$WGIP=10.10.1.1
$WGIP6=fd01:cafe::1
$WG=wg0

case $1 in
start)
    # Value for building route to the VPS
    GW=`ip route get 1.1.1.1 | awk '{print $3;exit}'`
    DEV=`ip route get 1.1.1.1 | awk '{print $5;exit}'`
    LL=`ip -6 route | grep default | awk '{print $3}'`

    # IPv4
    ip route a $VPS/32 via $GW dev $DEV metric 1
    ip route a default dev $WG via $WGIP metric 20

    # IPv6
    ip address add $WGIP6/64 dev $WG
    ip -6 route add $VPS6 via $LL dev dev $DEV
    ip -6 route add default dev $WG metric 20
    ;;
stop)
    # Find out which route must be deleted
    #RO=`ip route | grep  'metric 1 $'`
    RO=`ip route | awk '{if ($6 == "metric" && $7 == 1) { print $0;exit}}'`
    # IPv4
    ip route del $RO
    ip route del default dev $WG via $WGIP metric 20
    # IPv6
    ip route del $WGIP6/64 dev $WG
    RO=`ip -6 route | awk '{if ($6 == "metric" && $5 == 20) { print $0;exit}}'`
    ip -6 route del $RO
;;
esac

Das Script kann nach den Aufbau der Tunnels, bei Bedarf aufgerufen werden.