Alle Internet Verbindungen sollen den über ein Wireguard VPN nehmen.
Der Server ist für Routing im Heim-Netz bzw. Nating zuständig
192.168.178.0/24 - Unsere LAN
10.18.1.0/24 - IPv4 Adressenbereich für unsere VPN
fd01:a:cafe::/64 - IPv6 Adressenbereich für unsere VPN
10.18.1.1 - Wireguard IPv4 auf der VPS
fd01:a:cafe::1 - Wireguard IPv6 auf der VPS
192.0.2.123 - VPS öffentliche IPv4 Adresse
2001:db8:cafe::1 - VPS öffentliche IPv6 Adresse
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 MASQUERADEOIF 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.
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 20Die 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.
#!/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
;;
esacDas Script kann nach den Aufbau der Tunnels, bei Bedarf aufgerufen werden.