Iptables für Wireguard zu nftables konvertieren

Avenger84

Lt. Commander
Registriert
Feb. 2008
Beiträge
1.609
Hallo,
ich hatte dies schon mal gefragt aber keine Lösung erhalten.

Für Wireguard unter Raspian Bullseye wird laut Anleitung empfohlen wieder iptables zu installieren um damit Wireguard ans laufen zu kriegen mit den Regeln:

Code:
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -A FORWARD -i %i -j ACCEPT
PostUp = ip6tables -A FORWARD -o %i -j ACCEPT
PostUp = ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostDown = ip6tables -D FORWARD -i %i -j ACCEPT
PostDown = ip6tables -D FORWARD -o %i -j ACCEPT
PostDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Habe versucht gem. Anleitungen die Regeln in nftables Sprache zu übersetzen, kriege aber immer nur:
iptables-translate-restore: line 1 failed

Muss man für Wireguard tatsächlich zwingend iptables installieren ?
Vielleicht funktioniert "PostUp" und "PostDown" nicht mit nftables.
 
PostUp und PostDown haben nichts mit iptables zu tun. Das sind Einträge in der wg.conf, die lediglich angeben, dass die dahiner formulierten Kommandos nach dem Herstellen bzw. dem Schließen der VPN-Verbindung ausgeführt werden sollen. Diese Zeilen kannst du nicht mittels iptables-translate-restore übersetzen, weil PostUp und PostDown schlicht und ergreifend nicht übersetzt werden können, da es keine iptables-Kommandos sind.
iptables-translate-restore erwartet eine Datei, die mittels iptables-save erzeugt wurde. Dort stehen die aktuellen Regeln drin, in vollständiger Syntax von iptables.

Entweder du sicherst ohne/mit aktivem VPN mit iptables-save die jeweils aktuelle Konfiguration, übersetzt diese mit iptables-translate-restore und suchst dir die entsprechenden Zeilen raus oder aber du nimmst die Regeln von oben und übersetzt sie einzeln mittels iptables-translate -A FORWARD -i ......
Die so übersetzten Kommandos müsstest du dann 1:1 in die wg.conf übernehmen können, je nachdem ob sie eben nach dem Verbindungsaufbau oder -abbau ausgeführt werden sollen.

Schau mal hier
 
  • Gefällt mir
Reaktionen: snaxilian, SoDaTierchen und Avenger84
Danke, scheinbar ist nftables bei meinem jetzigen Buster gar nicht installiert.
PostUp & PostDown habe ich natürlich gelöscht.

Allerdings bleibt die erzeugte iptables.txt leer obwohl Wireguard läuft.

edit:

Code:
iptables-translate -A FORWARD -i %i -j ACCEPT
nft add rule ip filter FORWARD iifname "%i" counter accept

iptables-translate -A FORWARD -o %i -j ACCEPT
nft add rule ip filter FORWARD oifname "%i" counter accept

iptables-translate -t nat -A POSTROUTING -o eth0 -j MASQUERADE
nft add rule ip nat POSTROUTING oifname "eth0" counter masquerade

sieht das gut aus?

Wie wird IPv6 bei nft definiert? einfach ntf6 ?

Die "-D" also deaktivieren Regeln kann er nicht
 
Zuletzt bearbeitet:
Nein, bei nft ist alles in einem Paket. Die IPv6-Regeln werden mit ip6 bzw. IPv4+IPv6-Regeln mit inet spezifiziert, wenn ich mich nicht täusche.
 
  • Gefällt mir
Reaktionen: Avenger84
blöde Frage:
würde es etwas ausmachen, wenn man die Regeln, unabhängig davon ob mit Iptables oder Nftables, nicht mit Wireguard startet, sondern einfach immer aktiviert lässt ?
Also aus der wg0.conf raus und einfach nur einmalig "add rule..." ?
oder sind die nach einem neustart dann weg?

IP6 wäre dann:
Code:
nft add rule ip6 filter FORWARD iifname "%i" counter accept

To create one rule that applies to both IPv4 and IPv6, use inet. inet allows for the unification of the ip and ip6 families to make defining rules for both easier.
 
Zuletzt bearbeitet:
Die Firewall sollte so wenig Regeln enthalten wie möglich, aber so viele wie nötig. Unsinnige Regeln wie jene, die auf ein nicht existentes Interface - zB VPN-Interfaces wie tun0, o.ä. - oder auch nicht vorhandene Subnetze reagieren, machen die Firewall nur unübersichtlich und stellen dadurch ein potentielles Sicherheitsrisiko oder zumindest eine Ablenkung bei der Fehlersuche dar. Genau deswegen gibt es ja die Möglichkeit bei Wireguard, gezielt Regeln beim Auf-/Abbau der Verbindung einzurichten bzw. zu löschen.

iptables/nftables sind so auch schon komplex genug, insbesondere wenn man beispielsweise noch Addons wie ufw oder dergleichen verwendet, weil die endlos viele Chains mit einbauen. Da möchte man eigentlich keine Regeln drin haben, die keinem Zweck dienen.
 
schade, funktioniert nicht

Code:
pi@raspberrypi:~ $ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.99.1/24 dev wg0
[#] ip -6 address add fd08::1/64 dev wg0
[#] ip link set mtu 1412 up dev wg0
[#] ip -6 route add fd00:bbbb::/32 dev wg0
[#] ip -4 route add 192.168.74.0/24 dev wg0
[#] nft add rule inet filter FORWARD iifname "wg0" counter accept
/usr/bin/wg-quick: line 295: nft: command not found
[#] ip link delete dev wg0
 
Funktioniert es denn direkt im Terminal? Du hattest ja geschrieben, dass nftables gar nicht installiert war.
 
zu spät, jetzt flashe ich Bullseye gerade auf die SD Karte.

Soll ich es bei Bullseye ausprobieren?

Muss man denn extra nftables installieren? ich dachte das wäre der neue Standard ab Buster? @Raijin
 
Zuletzt bearbeitet:
Bei Bullseye ist nftabels vorhanden, nft Befehle werden verarbeitet, aber die o.g. Regeln funktionieren nicht.
Also iptables installiert und die alten Regeln laufen wieder.
 
danke, aber das Thema ist für mich viel zu komplex. iptables werden zum Glück richtig umgesetzt.
 
lang ist´s her, nun habe ich es doch noch geschafft die Regeln in nftables umzuwandeln. Was ein Akt.

von den Iptabels:
Code:
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = ip6tables -A FORWARD -i %i -j ACCEPT
PostUp = ip6tables -A FORWARD -o %i -j ACCEPT
PostUp = ip6tables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = ip6tables -D FORWARD -i %i -j ACCEPT
PostDown = ip6tables -D FORWARD -o %i -j ACCEPT
PostDown = ip6tables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE

zu den Nftables:
Code:
PostUp = nft add table ip filter
PostUp = nft add table ip6 filter
PostUp = nft add table ip6 nat
PostUp = nft add chain ip filter FORWARD '{ type filter hook input priority 0; policy accept; }'
PostUp = nft add chain ip6 filter FORWARD '{ type filter hook input priority 0; policy accept; }'
PostUp = nft add chain ip6 nat POSTROUTING '{ type nat hook postrouting priority 0; policy accept; }'
PostUp = nft add rule ip filter FORWARD iifname "%i" counter accept
PostUp = nft add rule ip filter FORWARD oifname "%i" counter accept
PostUp = nft add rule ip6 filter FORWARD iifname "%i" counter accept
PostUp = nft add rule ip6 filter FORWARD oifname "%i" counter accept
PostUp = nft add rule ip6 nat POSTROUTING oifname "enp1s0" counter masquerade
PostDown = nft flush ruleset

Das einzige was ich nicht ganz verstehe:
1736971127901.png

"srcnat" was SourceNAT heißt in der Kette, habe ich nicht da rein bekommen:

1736971194836.png


Mein Wireguard Netzwerk über 3 Knoten läuft allerdings, sowohl über IPv4 als auch IPv6.

Wenn Jemand noch Tipps / Verbesserungsvorschläge hat gern her damit.
Ergänzung ()

Nun sieht es exakt so aus wie mit den Iptables:
1736973670128.png


Code:
PostUp = nft add table ip filter
PostUp = nft add table ip6 filter
PostUp = nft add table ip6 nat
PostUp = nft add chain ip filter FORWARD '{ type filter hook forward priority 0; policy accept; }'
PostUp = nft add chain ip6 filter FORWARD '{ type filter hook forward priority 0; policy accept; }'
PostUp = nft add chain ip6 nat POSTROUTING '{ type nat hook postrouting priority 100; policy accept; }'
PostUp = nft add rule ip filter FORWARD iifname "%i" counter accept
PostUp = nft add rule ip filter FORWARD oifname "%i" counter accept
PostUp = nft add rule ip6 filter FORWARD iifname "%i" counter accept
PostUp = nft add rule ip6 filter FORWARD oifname "%i" counter accept
PostUp = nft add rule ip6 nat POSTROUTING oifname "enp1s0" counter masquerade
PostDown = nft flush ruleset

priority 100 war es siehe
https://wiki.nftables.org/wiki-nftables/index.php/Netfilter_hooks#Priority_within_hook

edit3: nun ist es korrekt
 
Zuletzt bearbeitet:
Avenger84 schrieb:
Muss man für Wireguard tatsächlich zwingend iptables installieren ?
Nein, wireguard braucht das nicht.
Lediglich dein Netzwerksetup braucht das möglicherweise.
 
Falls mal jemand per Suche hier landen sollte, hier meine Konfig von Zuhause, komplett ohne NAT:
Code:
[Interface]
Address = 192.168.99.1/24, fd08::1/64
ListenPort = 51820
PrivateKey = xyz
MTU = 1412
PostUp = nft add table ip filter
PostUp = nft add table ip6 filter
PostUp = nft add chain ip filter FORWARD '{ type filter hook forward priority 0; policy accept; }'
PostUp = nft add chain ip6 filter FORWARD '{ type filter hook forward priority 0; policy accept; }'
PostUp = nft add rule ip filter FORWARD iifname "%i" counter accept
PostUp = nft add rule ip filter FORWARD oifname "%i" counter accept
PostUp = nft add rule ip6 filter FORWARD iifname "%i" counter accept
PostUp = nft add rule ip6 filter FORWARD oifname "%i" counter accept
PostDown = nft flush ruleset
[Peer]
PublicKey = xy
AllowedIPs = 192.168.99.2/32, fd08::2/128
[Peer]
PublicKey = xy
AllowedIPs = 192.168.99.3/32, fd08::3/128
[Peer]
PublicKey = xy
AllowedIPs = 192.168.99.4/32, fd08::4/128
[Peer]
PublicKey = xy
AllowedIPs = 192.168.99.5/32, fd08::5/128
[Peer]
PublicKey = xy
AllowedIPs = 192.168.99.10/32, 192.168.99.20/32, 192.168.74.0/24, 192.168.75.0/24
AllowedIPs = fd08::10/128, fd08::20/128, fd00:bbbb::/64, fd00:cccc::/64
Endpoint = endpoint.dynv6.net:51821
PersistentKeepalive = 25
Von Zuhause geht es zu Büro 1 und von Büro 1 geht es zu Büro 2.

Alle Geräte in und von allen Netzwerken sind sowohl über IPv4 als auch IPv6 erreichbar.
1737105799423.pngScreenshot 2025-01-17 102411.jpg
Dazu muss man noch die passenden Routen in der FB eintragen.

Entsprechend in den anderen Netzwerken genauso.
 
Mir ist noch eine Sache aufgefallen, wenn ich ohne IPv6 NAT arbeite, also ohne:
Code:
PostUp = nft add rule ip6 nat POSTROUTING oifname "enp1s0" counter masquerade
dann bekommt mein "Roadwarrior" keine öffentliche IPv6 (die der VM), folglich funtioniert IPv6 nicht richtig vom Mobiltelefon aus über mein WG.
Das lustige ist, meinen Mailserver Zuhause, der nur per IPv6 erreichbar ist von außen, erreiche so, als Login steht dann da fd08::2.
aber ipv6.google.com erreiche ich nicht und auch alle Tests zeigen mir negativ an.

Daher die Frage: wie kann ich die nft Regel anpassen, so dass sie nur für die Roadwarrior fd08::1 - 5 gilt ?
 
ChatGPT hat geantwortet :volllol:

Code:
PostUp = nft add table ip filter
PostUp = nft add table ip6 filter
PostUp = nft add table ip6 nat
PostUp = nft add chain ip filter FORWARD '{ type filter hook forward priority 0; policy accept; }'
PostUp = nft add chain ip6 filter FORWARD '{ type filter hook forward priority 0; policy accept; }'
PostUp = nft add chain ip6 nat POSTROUTING '{ type nat hook postrouting priority 100; policy accept; }'
PostUp = nft add rule ip filter FORWARD iifname "%i" counter accept
PostUp = nft add rule ip filter FORWARD oifname "%i" counter accept
PostUp = nft add rule ip6 filter FORWARD iifname "%i" counter accept
PostUp = nft add rule ip6 filter FORWARD oifname "%i" counter accept
PostUp = nft add rule ip6 nat POSTROUTING ip6 saddr { fd08::2, fd08::3, fd08::4, fd08::5 } oifname "enp1s0" counter masquerade
PostDown = nft flush ruleset

100% 👍

Damit wird nur bei den Mobilgeräten die NAT-Übersetzung durchgeführt, also die Quelladresse der Pakete maskiert (auf meine öffentliche IPv6 der VM) wenn sie das Netzwerk verlassen.

Der dauer Tunnel (fd08::1 <-> fd08::10 usw.) wird nicht maskiert / NAT.
 
Zuletzt bearbeitet:
Ich betreibe einen VServer, der mir als Exit-Point für 2 Mobiltelefone dient, wenn ich es benötige. MIt PostUp und PostDown hab ich gar nicht erst angefangen.

Meine /etc/nftables sieht so aus:

Code:
table inet filter {
	chain input {
		type filter hook input priority filter; policy drop;
		iif "lo" accept
		ct state { established, related } accept
		ct state invalid drop
		iifname "lo" accept
		iifname "wg0" accept
		ip protocol icmp accept
		ip6 nexthdr ipv6-icmp accept
		tcp dport 22 accept
		udp dport 55555 accept
		ct state invalid drop
		meta nfproto ipv4 log prefix "[nftables] Input rejected: " reject
	}

	chain forward {
		type filter hook forward priority filter; policy drop;
		iifname "wg0" accept
		oifname "wg0" accept
		reject with icmpx type host-unreachable
	}

	chain output {
		type filter hook output priority filter; policy accept;
	}
}
table ip nat {
	chain postrouting {
		type nat hook postrouting priority srcnat; policy accept;
		ip saddr 192.168.108.128 oif "eth0" masquerade
		ip saddr 192.168.108.131 oif "eth0" masquerade
	}
}

Und Wireguard hab ich über Systemd-Networkd konfiguriert. Empfinde ich als besser konfigurierbar als über die wg.conf. Mit der NFTables-Konfiguration kommen die 2 festgelegten Mobilgeräte per IPv4 über den V-Server ins Netz. Entsprechend hab ich auf den Mobilgeräten auch 2 Profile: eins nur für den internen Zugriff, eins wo bei dem der gesamte Traffic nach außen über den V-Server getunnelt wird.

Allerdings nutz ich für den Zugang ins Netz nur IPv4.
 
  • Gefällt mir
Reaktionen: Avenger84
VServer heißt die Firewall ist nft, da der direkt im Internet hängt?

Bei mir ist die Fritzbox die Firewall.
 
Zurück
Oben