avenga
Goto Top

Nftables in Raspian Bullseye für Wireguard

Hallo,
ich habe gestern Raspian Bullseye auf meinem RPi4 installiert und wollte eigentlich meine Wireguard iptables-Regeln in nftables anwenden.

[Interface]
Address = 192.168.99.1/24, fd08::1/64
ListenPort = 51820
PrivateKey = ###=
MTU = 1412

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
...

Die Übersetzung lautet:

nft add rule inet filter FORWARD iifname "%i" counter accept  
nft add rule inet filter FORWARD oifname "%i" counter accept  
nft add rule inet nat POSTROUTING oifname "eth0" counter masquerade  
inet = ip&ip6 gleichzeitig
für PostDown entsprechend nft delete ...

Damit lässt sich Wireguard nicht starten und meldet einen Fehler bei nft.

Also iptables installiert und die alten Regeln wieder genommen -> läuft.

Wenn ich jetzt:
pi@raspberrypi:~ $ sudo nft list ruleset
table ip filter {
        chain FORWARD {
                type filter hook forward priority filter; policy accept;
                iifname "wg0" counter packets 153997 bytes 496055433 accept  
                oifname "wg0" counter packets 96761 bytes 8636643 accept  
        }
}
table ip nat {
        chain POSTROUTING {
                type nat hook postrouting priority srcnat; policy accept;
                oifname "eth0" counter packets 10118 bytes 1107027 masquerade  
        }
}
table ip6 filter {
        chain FORWARD {
                type filter hook forward priority filter; policy accept;
                iifname "wg0" counter packets 0 bytes 0 accept  
                oifname "wg0" counter packets 0 bytes 0 accept  
        }
}
table ip6 nat {
        chain POSTROUTING {
                type nat hook postrouting priority srcnat; policy accept;
                oifname "eth0" counter packets 962 bytes 92770 masquerade  
        }
}
aufrufe, werden die iptables scheinbar korrekt in nftables umgewandelt.

Mir ist auch noch aufgefallen, dass der Dienst gar nicht läuft:
pi@raspberrypi:~ $ sudo systemctl status nftables
● nftables.service - nftables
     Loaded: loaded (/lib/systemd/system/nftables.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:nft(8)
             http://wiki.nftables.org


Aber scheinbar braucht es den doch nicht.

Über Hilfe würde ich mich freuen.
MfG

Content-Key: 1518358068

Url: https://administrator.de/contentid/1518358068

Printed on: April 26, 2024 at 01:04 o'clock

Member: Avenga
Avenga Nov 17, 2021 updated at 06:58:20 (UTC)
Goto Top
P.S. die Fehlermeldung von Wireguard:
 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 
Error: Could not process rule: No such file or directory
add rule inet filter FORWARD iifname wg0 counter accept
              ^^^^^^
[#] ip link delete dev wg0

Das fand ich dazu:
Zitat:
You're probably missing your table or chain.

nft list ruleset

will give you what you are working with. If it prints out nothing, you're missing both.

nft add table ip filter # create table
nft add chain ip filter INPUT { type filter hook input priority 0 \; } # create chain

ich habe keine Ahnung wie man das in die wg0 config einbauen könnte.
Mitglied: 149569
149569 Nov 17, 2021 updated at 07:09:02 (UTC)
Goto Top
aufrufe, werden die iptables scheinbar korrekt in nftables umgewandelt.
Mir ist auch noch aufgefallen, dass der Dienst gar nicht läuft:
Normal weil die Userland automatisch im Hintergrund das ganze nach nftables konvertieren, einfach mal lesen ....
https://sanjuroe.dev/iptables-vs-nftables


Zitat von @Avenga:

P.S. die Fehlermeldung von Wireguard:
Error: Could not process rule: No such file or directory
Ist ja auch logisch, denn inet ist nicht gleich ip und in deinem Regelwerk gibt es nur eine Tabelle filter im Bereich ip und nicht in inet, somit ist klar daß er diese nicht findet.

ich habe keine Ahnung wie man das in die wg0 config einbauen könnte.
Gar nicht weil wenn man komplett mit nftables arbeitet hat man diese natürlich schon vorher im Regelwerk fest angelegt. Wie man das macht ist ja allseits bekannt:

https://wiki.nftables.org/wiki-nftables/index.php/Main_Page#Examples
Member: Avenga
Avenga Nov 17, 2021 at 07:12:53 (UTC)
Goto Top
Danke, mit nur "ip" statt "inet" kam die gleiche Fehlermeldung.

Kannst du mir sagen wie und vorallem was ich wo genau vorher im Regelwerk fest anlegen muss ?
Will ungern experimentieren.
Mitglied: 149569
Solution 149569 Nov 17, 2021 updated at 10:14:17 (UTC)
Goto Top
Zitat von @Avenga:

Danke, mit nur "ip" statt "inet" kam die gleiche Fehlermeldung.

Kannst du mir sagen wie und vorallem was ich wo genau vorher im Regelwerk fest anlegen muss ?
Will ungern experimentieren.
DU willst also allen ernstes die Verantwortung deiner Firewall in UNSERE Hände legen?? DU musst dafür hinterher die Verantwortung tragen nicht wir!
Also lies die Links oben ganz aufmerksam vor allem die Beispiele für SERVER und CLIENTS dann passt du deine Default Regeln an deine Bedürfnisse an (die benötigten Dienste die auf deinem Gerät laufen kennen wir ja nicht), kopierst das ganze in die Konfigurationsdatei nach /etc/nftables.conf und aktivierst den nftables Dienst mit sudo systemctl enable nftables.

Dann machst du folgendes in deiner wireguard config für die postup und postdowns, hier nur das Beispiel für die Forwarding-Rules (Namen der Tables und chains nat. anpassen), das Masquerading darfst du dann als Hausaufgabe selbst machen.

PostUp = nft add rule inet filter forward iifname "%i" counter accept; nft add rule inet filter forward oifname "%i" counter accept  
PostDown = nft --handle list chain inet filter forward | grep -P 'iifname "%i"|oifname "%i"' | grep -Po '\d+$' | xargs -I{} nft delete rule inet filter forward handle {}  

Das wäre jetzt plain Rules hinzufügen, effektiver würde es werden du legst ein set in nftables an und fügst nur das Interface zu dieser Liste hinzu dann musst du keine Regeln hinzufügen oder löschen sondern änderst nur das set.

Das sähe dann mit der Nutzung von set's bspw. so aus

nftables.conf
flush ruleset
table inet filter {
	chain input {
		type filter hook input priority filter; policy drop;
		ct state invalid drop
		ct state established,related accept
		iif "lo" accept  
		ip protocol icmp accept
		ip6 nexthdr ipv6-icmp accept
	}

	chain forward {
		type filter hook forward priority filter; policy drop;
		ct state established,related accept
	        iifname @wg_interfaces accept
                oifname @wg_interfaces accept
	}

	chain output {
		type filter hook output priority filter; policy accept;
	}
	
	set wg_interfaces {
		type ifname
	}
}
table inet nat {
	chain PREROUTING {
		type nat hook prerouting priority dstnat; policy accept;
	}

	chain POSTROUTING {
		type nat hook postrouting priority srcnat; policy accept;
                oifname eth0 masquerade
	}
}

Das Wireguard PostUpDown reduziert sich dann auf das Hinzufügen und Entfernen des Interface zum/aus dem set
PostUp = nft add element inet filter wg_interfaces {%i}
PostDown = nft delete element inet filter wg_interfaces {%i}

Fertig

Never trust anyone, always verify what you are doing!
Member: Avenga
Avenga Nov 17, 2021 at 17:09:58 (UTC)
Goto Top
Danke hacktor, das übersteigt meine Kompetenzen bei Weitem.
Da bleibe ich bei der iptables Krücke.
Mitglied: 149569
149569 Nov 17, 2021 updated at 20:21:18 (UTC)
Goto Top
Zitat von @Avenga:
Da bleibe ich bei der iptables Krücke.
Wieso Krücke?? Iptables ist genauso wie nftables eine Firewall die ebenso gut ihre Arbeit auf zig Millionen von Routern verrichtet, die Vorteile von nftables wirst du bei deinem derzeitigen Wissensstand eh nicht nutzen können, erst recht nicht auf der Hardware.