DS-LITE und Zugriff auf das Heimnetzwerk

Jean-Jacques Sarton

Motivation

Glasfaser Anschlüsse sind in Planung und der Anbieter sieht nur Anschüsse mit IP-V6 vor. Die den Router zugeteilte Adressen, sind im Bereich 100.64.0.0/10 (Carrier Grade NAT), sind nicht öffentlich und daher von außen nicht erreichbar.

Manche Geräte/Dienste in LAN können nur über IPv4 erreicht werden (SIP Telefonie der Fritzbox).

Manche Webseiten haben nur eine IPv4 Adresse (zeit.de, bild.de, rheinpfalz.de). Glücklicherweise sind dies Seiten über CG-NAT erreichbar. Dies wäre schlecht, wenn ein IPv4 Zugriff in irgend eine Art nicht erreichbar wäre.

Manche neuere Web-Präsenzen sind nur über IPv6 Erreichbar, die vorgestelle Lösung kann leicht für IPv6 erweitert werden.

Verbindung via IPv6

Die Verwendung einen VPN wie Wireguard, Zerotier, OpenVPN erlaubt es aus der Ferne sich im Heimnetzwerk zu begeben.

Das VPN Tunnel kann über IPv6 erfolgen, die im Tunnel enthaltene werden entsprechend der Quelle (IPv4 oder IPv6) übertragen.

Verbindung über IPv4

Ist man in einen Netzt, der keine IPv6 Verbindung erlaubt ist eine Vermittler notwendig.

Suche nach Vermittler

Die Deutsche-Glasfaser verweist auf Dienste von:

Nachteil: - UDP wird nicht unterstüzt!!!

Eigene Server

Es ist möglich sehr kostengünstive vServer zu mieten. Beispiele sind:

Am günstigsten ist Ionos mit ein Preis von 1 Euro pro Monat.

Wie soll es aussehen ?

Was benötigen wir?

Socat

Socat fungiert, in unseren Fall, als Übersetzer zwischen IPv4 und IPv6 Telegramme.

Für jeden Dienst, welches über das Internet angeboten wird, ist einer entsprechende Instanz zu starten.

VPN Auswahl

Kritrerien:

Meiner Wahl ist Wireguard

VPN Relay

Auf der V-Server muss lediglich eine Instanz von socat laufen:

socat UDP4-LISTEN:51820,fork,reuseaddr UDP6:[2a01:db8::1]:51820

Http/https über der V-Server

socat TCP4-LISTEN:80,fork,reuseaddr TCP6:[2a01:db8::1]:80
socat TCP4-LISTEN:443,fork,reuseaddr TCP6:[2a01:db8::1]:443

Automatische Start der Dienste auf den V-Server

Am besten is es die Dienste über Systemd zu starten.

Siehe: https://www.mbuth.de/?cat=13

Wireguard Client Konfiguration

Die Wireguard Konfiguration sieht entsprechend so aus:

[Interface]
Address    = 192.168.0.2/32
PrivateKey = PRIVAT CLIENT KEY
[Peer]
PublicKey  = SERVER PUBLIC KEY
AllowedIPs = 192.168.0.0/24
Endpoint   = 192.0.2.123:51820

192.0.2.123 steht für die IPv4 Adresse des V-Server.

Signal Verlauf

         IP4          IP6            IP4
  Phone <--> V-Server <--> Wireguard <-> Sipxoxd <-> Tel Server
            Internet     |                 LAN

Wireguard auf den Server

[Interface]
PrivateKey = PRIVAT SERVER KEY
Address    = 192.168.0.1
ListenPort = 51820
[Peer]
PublicKey  = PUBLIC CLIENT KEY
AllowedIPs = 192.168.0.2/32

Linphone Konfiguration

Auf Linphone ist anzugeben, dass die Route über das Siproxd Server (auf den gleichen Server wie wireguard) laufen muss.

SIP-Adresse         [sip:12345678@192.168.178.1      ]
SIP-Serveradresse   [<sip:192.168.0.1;transport=udp> ]
Route               [sip:192.168.0.1                 ]

Wireguard Einbindung für Telefonie und Netwerkzugriff

Siproxd empfängt Daten aus den Internet und modifitiert auch Adressen im Payload. Betoffen sind die Port 5060 und 7070 bis 7089.

Es ist nicht möglich über der Adresse, die für der Telefonie eingerichet wurde den interne Netz zu erreichen (NAT notwendig).

Wireguard zur Zugriff im Heimnetz (Server)

[Interface]
PrivateKey = PRIVATE KEY SERVER
Address    = 192.168.0.1
Address    = 192.168.1.1
PostUp     = sysctl net.ipv4.conf.all.forwarding=1
PostUp     = sysctl -w net.ipv4.ip_forward=1
PostUp     = iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
PostUp     = iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
PostDown   = iptables -D FORWARD  -s 192.168.1.0/24 -j ACCEPT
PostDown   = iptables -t nat -D POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
ListenPort = 51820

[Peer]
PublicKey  = PUBLIC KEY CLIENT
AllowedIPs = 192.168.0.2/32, 192.168.1.2/32, 192.168.0.0/16

Wireguard Konfiguration auf der Client

[Interface]
PrivateKey = PRIVATE KEY CLIENT
Address    = 192.168.0.2
Address    = 192.168.1.2
[peer]
PublicKey  = PUBLIC KEY SERVER
PostUp     = ip r a 192.178.0/24 via 192.168.1.2
EndPoint   = 192.0.2.123:51820
AllowedIp  = 192.168.0.0/16

Signal Verlauf

         IP4          IP6            IP4
  Phone <--> V-Server <--> Wireguard <-> Sipxoxd <-> Tel Server
                         |            |
                                      -> Nating  <-> LAN Geräte
            Internet     |                 LAN

Wireguard auf NAS Systeme

Synology und QNAP unterstützen nicht wireguard (Kernel Module)

Wireguard bietet eine Userspace Version (in der Sprache go), das Original muss aber gepatcht werden.

Entware erlaubt es viele Linux Programme zu installieren und auf den NAS zu betreiben. Eine gepatche Version von wireguard (wireguard-go) kann unter Entware installiert werden.

Das Starten erfolgt mit ein Script, neispielsweise: /opt/etc/init.d/S62wireguard.sh

Entware Startscript Beispiel

DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
. /opt/etc/init.d/rc.func
case $1 in
start)
        wireguard-go wg0
        wg setconf wg0 /opt/etc/wireguard/wg0.conf
        ip link set mtu 1420 up dev wg0
        ip a a 192.168.0.1/24 dev wg0
        sysctl -w net.ipv4.conf.all.forwarding=1
        sysctl -w net.ipv4.ip_forward=1
        ;;
stop)
        ;;
esac

Wahl der IPv4

Die meisten router verwenden ein Adresse im Bereich 192.168.0.0/16. Beliebt sind

Andere verwenden Adresse im Bereich 10.0.0.0/8. Auch Freifunk verwendet oft dieser Bereich.

Damit es nicht zur Kollision kommt dürfen die IP nicht mit der des Anbieter (Fremde Router, Freifunk, …) kollidieren.

Im Bereich 172.16.0.0/12 (172.16.x.x bis 172.31.x.x) sollte am besten geeignet sein. Allerdings habe ich Adressen aus den Bereich im Freifunk Netz gesichtet!!!

Das Ausweichen auf 100.64.0.0/10 ist auch keine Alternative.

Eine gute Alternative, öffentliche IP?

25.0.0.0/8  RIPE NCC  1995-01
            As of 2005-08-23 entire block assigned to UK Ministry of Defence

siehe auch: https://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xhtml

Was gibt es sonst noch?

Siehe: https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml

Address Block

Name

RFC

Allocation Date

Termination Date

Source

Destination

Forwardable

Globally Reachable

Reserved-by-Protocol

[…]

192.168.0.0/16

Private-Use

[RFC1918]

1996-02

N/A

True

True

True

False

False

[…]

198.18.0.0/15

Benchmarking

[RFC2544]

1999-03

N/A

True

True

True

False

False

[…]

MTU

Default MTU ist 1420 (80 Bytes weniger als das Default von 1500 Bytes).

Bei den Tests, das fremdes Netz ging über Freifunk, konnte nicht immer eine Verbindung aufgebaut werden. Dies ist möglicherweise durch einer Konfigurationsfehler einen der FF-Server zurückzuführen.

Durch Reduzierung auf ein MTU von 1280 Bytes ging es.

Die Lösung

Definitionen:

#!/bin/bash
MTU=1280
DNS=192.168.178.1 # 198.18.0.1 # Falls DNS-Server auf das WG-Server läuft #
DOMAIN=fritz.box
USERSPACE=TRUE

getDevGw() {
        GATEWAY=`ip r get 1.1.1.1 | awk '{print $3;exit}'`
        DEV=`ip r get 1.1.1.1 | awk '{print $5,exit}'`
        SRC=`ip r get 1.1.1.1 | awk '{print $7;exit}'`
}

Die Lösung

Start Tunnel:

case $1 in
start|up)
        getDevGw
        if [ "$USERSPACE" == "TRUE" ]; then wireguard-go wg0
        else ip l add dev wg0 type wireguard; fi
        wg setconf wg0 /etc/wireguard/wg0.conf
        ip link set mtu $MTU up dev wg0
        ip a a 198.18.0.2/24 dev wg0  # Tunnel IP kein NAT, mit Route
        ip a a 198.18.1.2/24 dev wg0  # Tunnel IP mit NAT,  mit Route
        ip r a 192.168.178.0/24 via 198.18.1.2 # Route für Zugriff mit NAT auf das Heimnetz
        if [ "$DNS" != "" ]; then
                echo nameserver $DNS | resolvconf -a wg0 -m 0 -x;
                resolvectl default-route $DEV 0 # DNS nur über unseren Netz
        fi
        if [ "$GATEWAY" == "192.168.178.1" ]; then ip r a 192.168.178.1 dev $DEV; fi
        # oder                 ip r d 192.0.2.123 via $GATEWAY dev $DEV src $SRC
        resolvectl domain wg0 $DOMAIN
        ;;

Die Lösung

Stop Tunnel:

stop|down)
        if [ "$USERSPACE" == "TRUE" ]; then pkill wireguard-go
        else ip link del dev wg0; fi
        getDevGw
        if [ "$GATEWAY" == "192.168.178.1" ]; then ip r d 192.168.178.1 dev $DEV; fi
        # oder                 ip r d 192.0.2.123 via $GATEWAY dev $DEV src $SRC
        if [ "$DNS" != "" ]; then
                resolvectl default-route $DEV 1 # DNS wieder über der eigentlich Verbindung
        fi
        ;;
esac

192.0.2.123 ist die Adresse unserer Socat Server

DNS Relay (auf der Wireguard Server)

#!/bin/sh
case $1 in
start|up)
        if [ ! -e /var/run/dnsmasq.pid ]
        then
                dnsmasq -a 198.18.0.1 -S 192.168.178.1 -h -R -k &
        fi
        ;;
stop|down)
        if [ -e /var/run/dnsmasq.pid ]
        then
                kill `cat /var/run/dnsmasq.pid`
                rm /var/run/dnsmasq.pid
        fi
        ;;
esac

Keep Alive - dauerhafte Verbindung

[peer]
...
PersistentKeepAlive = 25

Für Maus Schubser

#!/bin/sh
CMD=
TEXT=
ip l sh $WG >/dev/null 2>&1
if [ $? -eq 1 ]; then TEXT=Start; CMD=up; else TEXT=Stop; CMD=down; fi

while true; do
        PASS=`zenity --forms --add-password=Passwort --text="$TEXT Wireguard" --title Wireguard`
        if [ $? -eq 1 ]; then exit; fi
        if [ "$PASS" != ""  ]; then break; fi
done

sudo -k -S $HOME/bin/wgclient.sh $CMD <<!
$PASS
!

if [ $? -ne 0 ]; then zenity --error --text "$TEXT Gescheitert" --title Wireguard; fi

So schaut unsere Fenster aus

Icon Bild des Starter ändern

#!/bin/sh
DTF=$HOME/.config/xfce4/panel/launcher-36/16194579951.desktop
ICU=$HOME/.local/share/icons/wireguard/wg-up.svg
ICD=$HOME/.local/share/icons/wireguard/wg-down.svg

ip l | grep wg > /dev/null 2>&1
case $? in
        0) sed -i -e "s@Icon.*@Icon=$ICU@" $DTF;;
        *) sed -i -e "s@Icon.*@Icon=$ICD@" $DTF;;
esac

Fragestunde

Anhang (Beispiele): beispiele/anhang.html

Beipiele Download: beispiele.tgz

/