neunzehn83.de

Ein Mann, ein Blog, kein Plan.

Debian Router statt FritzBox mit Glasfaser von der Deutschen Giganetz

Ich habe nun einen Glasfaser-Anschluss von der Deutschen Giganetz (DGN). Yay! Ein Debian Linux soll das Routing übernehmen, wie zuvor auch schon für meinen DSL-Anschluss.

Mein Router ist ein LXC-Container auf einem Raspberry Pi4 mit Debian bookworm Linux. Wir wollen routen ganz ohne Klimbim, ausschließlich mit Systemd-Networkd und ein paar Scripts! Wir brauchen kein radvd oder wide-dhcp.

Der Pi hat einen separaten Netzwerk-Dongle zur PPPoE-Einwahl - dieser ist wahrscheinlich nicht unbedingt erforderlich, da PPPoE über ein VLAN stattfindet.

eth0: Internes Netzwerk
eth1: Patchkabel zum ONT (Glasfaser-Modem)

Von der DGN gibt es einen DS-Lite Anschluss mit 24h Zwangstrennung (!). Das IPv6 Subnetz ändert sich alle 24 Stunden. IPv4 gibt es nur über einen Tunnel zu einem AFTR mit Carrier-Grade-Nat.

Mit der PPPoE-Einwahl bekommen wir eine IPv6 und ein /56 IPv6 Subnetz. Ein /64 davon geben wir per RA/Router Advertisement in unser Netzwerk zur selbständigen Konfiguration der Clients (SLAAC).

Part 1: Netzwerk-Config für PPPoE

Wir benötigen ein VLAN mit der ID=7 für die PPPoe Einwahl:

root@rtr:~# vi /etc/systemd/network/00-vlan.netdev

[NetDev]
Name=myvlan
Kind=vlan

[VLAN]
Id=7

Dem Interface mit der Verbindung zum ONT geben wir dieses vlan (hier eth1).

root@rtr:~# vi /etc/systemd/network/10-eth1.netdev

[Match]
Name=eth1
Type=ether

[Network]
VLAN=myvlan
DHCP=no

Dem PPP-Interface sagen wir, dass es ein RA akzeptieren soll (das ist unser /56-Netz für Clients). DHCP (Client) wird benötigt um selbst via PPP eine einzelne IPv6 zu erhalten.

root@rtr:~# vi /etc/systemd/network/11-ppp0.network

[Match]
Name=ppp0
Type=ppp

[Network]
DHCP=ipv6
IPv6AcceptRA=yes
IPv6PrivacyExtensions=yes
KeepConfiguration=yes

[DHCPv6]
UseDelegatedPrefix=true
WithoutRA=solicit

Jetzt Netzwerk neustarten

systemctl restart systemd-networkd

Part 2: PPPoE Einwahl

Wir installieren die Tools ppp und pppoe und legen eine Config an. Außerdem packen wir die Zugangsdaten in eine Datei.

apt install ppp pppoe

root@rtr:~# vi /etc/ppp/peers/DGN

noipdefault
defaultroute
replacedefaultroute
hide-password
lcp-echo-interval 20
lcp-echo-failure 3
connect /bin/true
noauth
persist
noaccomp
default-asyncmap
plugin rp-pppoe.so
nic-myvlan					# Anpassen auf VLAN-Name
user "XXX@dgn.digital"		# Anpassen auf Username
nodetach
persist

root@rtr:~# vi /etc/ppp/chap-secrets

"XXX@dgn.digital" * "XXX"	# Anpassen Username und Passwort

PPPoE-Dienst anpassen vi /etc/systemd/system/pppoe.service

ExecStart=/usr/sbin/pppd call DGN

Hier den Config-Namen mit der PPPoE-Config (in /etc/ppp/peers) angeben. Hier: DGN

PPPoE-Einwahl!

systemctl restart pppoe

Mit systemctl status pppoe prüfen, ob die Verbindung geklappt hat. IPv6-Zugriff sollte nun funktionieren: ping6 heise.de.
Bei mir musste ich noch eine Route hinzufügen um IPv6-Konnektivität zu erhalten: ip -6 route add 0::/0 dev ppp0

Part 3: IPv4

Wir benötigen einen 4in6 Tunnel zum AFTR von DGN (bzw. Purtel, der tech. Provider von DGN)

ip -6 tunnel add ip6tnl mode ipip6 local <lokale IPv6> remote 2a01:41e3:ffff:cafe:face::3 dev eth1
ip addr add 192.0.0.2/29 peer 192.0.0.1 dev ip6tnl
ifconfig ip6tnl up
ip route add default via 192.0.0.1 dev ip6tnl

Damit sollte auf dem Router IPv4 funktionieren: ping 8.8.8.8

Part 4: Konfiguration für die Clients

Wir konfigurieren das interne Interface (hier: eth0) wie folgt:

root@rtr:# vi /etc/systemd/network/eth0.network

[Match]
Name=eth0
[Network]
Address=10.11.12.254/24

IPv6AcceptRA=yes
IPv6SendRA=yes
DHCPPrefixDelegation=yes
DHCPv6PrefixDelegation=yes

DHCPServer=true

[DHCPServer]
PoolOffset=100
PoolSize=100
EmitDNS=yes
DNS=10.11.12.254

[IPv6SendRA]
EmitDNS=true
DNS=fe80::1

Bei [Network] vergeben wir eine eigene IPv4 für den Router - das ist die Gateway-Adresse für alle v4-Verbindungen. Bei [DHCPServer] konfigurieren wir den v4 DNS: jeder Client bekommt eine IPv4 aus dem Pool 10.11.12.100-199.
Interessant ist hier, dass wir kein NAT in unserem Netzwerk brauchen! Die Pakete mit den privaten IPs gehen in den Tunnel und werden erst beimAFTR umgeschrieben.
Bei [IPv6SendRA] verteilen wir auch einen DNS via IPv6. Der Router selbst ist DNS-Server. Hier könnte auch ein öffentlicher IPv6-DNS-Server stehen.

Wenn der Router selbst der DNS-Server sein soll (um bspw. Adblocking-Aufgaben zu übernehmen) muss zusätzlich bspw. dnsmasq installiert und konfiguriert werden.

Damit Clients via ICMP die MTU der Pakete anpassen können müssen wir die Kommunikation zulassen:

iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Part 5: Automatisierung

Da die PPPoE-Verbindung nach 24h getrennt wird, muss bspw. die Default-Route und der IPv4-Tunnel nach jedem Verbinden erneut aufgebaut werden. Dazu kann man die Befehle in ein "IPv6-up" Script packen, welches PPPoE automatisch ausführt:

root@rtr:# vi /etc/ppp/ipv6-up.d/rtr

#!/bin/sh
sleep 1
ip -6 route add 0::/0 dev ppp0
sleep 1
ipv6=$(ip -6 addr show ppp0 | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v '^\(::1\|fe80\)' | head -n1)
ip -6 tunnel add ip6tnl mode ipip6 local $ipv6 remote 2a01:41e3:ffff:cafe:face::3 dev eth1
ip addr add 192.0.0.2/29 peer 192.0.0.1 dev ip6tnl
ifconfig ip6tnl up
ip route add default via 192.0.0.1 dev ip6tnl

iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Das Script holt automatisch die IPv6 und nutzt diese als Tunnel-Eingang. Tunnel-Ausgang ist der AFTR von Purtel (aftr.fra.purtel.com). Das Script muss executable sein: chmod +x /etc/ppp/ipv6-up.d/rtr

Automatischer Reconnect

Damit die Zwangstrennung nicht in ungünstige Zeiten fällt, kommen wir ihr zuvor, indem wir täglich ppp neustarten und damit eine Neueinwahl auslösen. Zudem gibt es ein neues IPv6 Subnetz.

crontab -e

30 4 * * * systemctl restart pppoe

Part 6: ToDos

Das alles ist erst der Anfang! Wir benötigen zwangläufig noch eine Firewall (ufw) und eventuell die ein oder andere IPv6-Portfreigabe. Diese Portfreigabe soll dann auch trotz ständig wechselndem IPv6-Präfix von außen erreichbar sein. Auch wollen wir unterwegs, wenn nur IPv4 verfügbar ist, uns nach Hause verbinden! Ideen dazu folgen im nächsten Blog-Beitrag ..

Geschrieben am Mittwoch, 21. August 2024 und abgelegt unter Linux.