DSL-Modem im Bridging-Modus betreiben
Routing
Das IPForward=yes
in der systemd-networkd-Konfiguration erledigt das Setzen der bekannten ip_forwarding
-Parameter, somit sollte ein manuelles Bearbeiten von sysctl.conf nicht notwendig sein.
Die Maschine sollte von nun an mit dem Internet verbunden sein. Was hier aber noch fehlt, ist das Masquerading. Da das interne Netzwerk mit privaten IP-Adressen betrieben wird, ist es notwendig, die private Quell-IP-Adresse der nach außen gerichteten Pakete zu verändern. Unter Linux wird diese Technik Masquerading genannt. Da dieses Tutorial neue Technologien verwendet, werde ich zuerst auf die Masquerading-Konfiguration von nftables eingehen, danach auch kurz iptables aufzeigen.
Firewall
Ziel dieses Tutorials ist es, die Angriffsfläche aufs Heimnetzwerk zu verkleinern. Daher konfigurieren wir eine Firewall, die per Default von außen keine Verbindungen erlaubt. Ich empfehle StrongSwan + IKEv2, sollte jemand das Bedürfnis haben, von außen auf sein Heimnetzwerk zugreifen zu wollen.
nftables
NFTables ist die geplante Ablöse von IPTables. NFTables befindet sich bereits im Linux-Kernel seit Version 3.13. Ein schönes Tutorial über nftables hat Martin Loschwitz im Linux-Magazin geschrieben. Mein Fazit zu nftables ist, dass es bereits ganz gut verwendbar ist, jedoch noch ein paar Features fehlen, bzw. teilweise die Syntax für mich nicht ganz verständlich ist. Fehlende Features für meine Anwendungsfälle sind:
- mangelnde IPSec-Integration
- teilweise inkonsistente Syntax der nft-Befehlszeile.
- Spezial-Features wie MSS Clamping (mehr dazu später) sind noch nicht verfügbar.
Ich gehe davon aus, dass diese Probleme mit der Zeit gelöst werden.
Nun zur Installation: Das Userspace-Tool ist in Debian Jessie nur aus den Backports zu beziehen:
apt-get -t jessie-backports install "nftables"
Nftables kann man wie iptables mit einzelnen Befehlen betreiben oder aber über eine Datei, die atomar in den Kernel geladen (oder geändert) wird. Ich bevorzuge, eine Datei zu pflegen, die atomar in den Kernel geladen wird, ähnlich zum pf-System unter BSD. Eine weitere Eigenheit von nftables NAT ist, dass iptables NAT nicht geladen sein darf. Daher ist es erforderlich, das iptabes NAT-Modul zu entladen:
rmmod iptables_nat
Hier sieht man ein einfaches Beispiel, das nur ein Masquerading mit nftables macht und sinnvolle Chains für die weitere Verwendung angelegt hat:
#!/usr/sbin/nft -f flush ruleset table inet filter { chain input { type filter hook input priority 0; iifname lo accept iifname lan accept iifname ppp0 jump input_ppp0 drop } chain input_ppp0 { # rules applicable to public interface ct state {established,related} counter accept ct state invalid counter drop log drop } chain ouput { type filter hook output priority 0; accept } chain forward { type filter hook forward priority 0; iifname ppp0 counter jump from_internet accept } chain from_internet { ct state {established,related} counter accept ct state invalid counter drop drop } } table ip nat { chain prerouting { type nat hook prerouting priority 0; } chain postrouting { type nat hook postrouting priority 0; oifname ppp0 counter masquerade } }