Hilfe bei Transistion pf.conf nach nftables.conf

dettus

Bicycle User
LEIDER muss ich gerade meinen Router auf Debian umsetzen. :(

Meine schoene pf.conf kann ich damit nicht mehr gebrauchen, der Linux User von Welt nimmt nftables.conf.

Seit zwei Tagen bin ich damit am wurschteln.
Ich moechte doch "nur", dass

1. Meine beiden Netze 192.168.7.0/24 und 192.168.8.0/24 sich intern sehen und nach aussen genatted werden
2. Port 8080 von aussen auf einen internen SSH-Server umgeleitet wird
3. Port 5060 fuer VOIP Anrufe offen ist.


Meine pf.conf sah bisher so aus:
Code:
set skip on lo

block return    # block stateless traffic
pass        # establish keep-state

block return in on ! lo0 proto tcp to port 6000:6010

ext_if="pppoe0"
int0_if="em0"
int2_if="em2"

match on $ext_if scrub (max-mss 1340)
match out on pppoe0 inet from $int0_if:network to any nat-to ($ext_if)
match out on pppoe0 inet from $int2_if:network to any nat-to ($ext_if)

match in on $ext_if proto { tcp, udp } from any to any port 8080 rdr-to 192.168.7.12 port 22
pass in quick on $ext_if proto { tcp, udp } from $ext_if to any port 5060 keep state

Jetzt bin ich an der dreitausendsten Variation von nftables.conf.... Hilfe!
Nichtmal ein popeliges Port Forwarding mag funktionieren.
 
Spricht was dagegen firewalld zu verwenden? nftables ist wirklich nicht dazu gemacht, um direkt bedient zu werden, wenns nicht unbedingt sein muss :D
 
NAT sollte aber in etwa so aussehen:

Code:
table ip nat {
        chain prerouting {
                type nat hook prerouting priority dstnat; policy accept;
        }

        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                oifname "wg0" masquerade
        }
}

Interfaces eben anpassen, bzw. beide reinschreiben.
Normaler Port öffnen:

Code:
table ip filter {
        chain INPUT {
                type filter hook input priority filter; policy accept;
                tcp dport 5060 counter packets 0 bytes 0 accept
        }
}

Bei DNAT bin ich auf die schnelle überfragt. Wie gesagt ich würde meiden händisch mit der nftablesconf zu arbeiten.
 
Okay, mittlerweile geht es.
Ich bin noch nicht ganz fertig: Ich mag es zum Beispiel nicht, dass vom Internet Device nicht standardmaessig gedroppt wird.
Aber das hier ist jetzt erstmal das, was fuer mich funktioniert:

Code:
#!/usr/sbin/nft -f

flush ruleset

define    DEV_WIRE="lan3"
define    DEV_WIFI="lan2"
define    DEV_INTERNET="ppp0"

define    PORT_FTP="21"
define    PORT_DNS="53"
define    PORT_DHCP="67"
define    PORT_SIP="5060"
define    PORT_HTTP="8080"

table inet filter {
    chain input {
        type filter hook input priority filter; policy accept;
        tcp dport { $PORT_FTP } counter accept;
        iifname $DEV_INTERNET tcp dport { $PORT_HTTP } counter accept;
        iifname $DEV_INTERNET udp dport $PORT_SIP counter packets 0 bytes 0 accept;        
        iifname $DEV_INTERNET tcp dport $PORT_SIP counter packets 0 bytes 0 accept;
        iifname { lo, $DEV_WIRE, $DEV_WIFI } counter accept;
    }
    chain forward {
        type filter hook forward priority filter; policy accept;
    }
    chain output {
        type filter hook output priority filter; policy accept;
    }
}

table ip nat {
    chain prerouting {
        type nat hook prerouting priority 0; policy accept;
        iifname $DEV_INTERNET tcp dport { $PORT_HTTP } counter dnat to 192.168.7.12:22
    }
    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        masquerade
    }
}
 
Das muss man ja auch nicht. Denn als Alternative zu nftables gibt es iptables-nft (xtables-nft — iptables using nftables kernel api). Nicht zu verwechseln mit iptables-legacy.

Viele Wege führen nach Rom oder zur brauchbaren Firewall :) Spätestens am Desktop würde ich aber klar firewalld den Vorzug geben, daher ist das auch eher meine Empfehlung, wenn man sich ohnehin in etwas einarbeitet. Wer aber die alte iptables Syntax im Schlaf kann, macht natürlich auch mit iptables-nft nichts falsch :)
 
früher gabs da doch mal den fwbuilder - der wurde allerdings vor Jahren aufgegeben;
da konnte man das eigentlich schön übersichtlich bildlich sehen, was als Regel aufgesetzt wurde

gibts da aktuell noch was vergleichbares?
 
früher gabs da doch mal den fwbuilder - der wurde allerdings vor Jahren aufgegeben;
....

gibts da aktuell noch was vergleichbares?
Der fwbuilder (GUI) wird in debian noch zur Verfügung gestellt:
Code:
:~$ apt policy fwbuilder
fwbuilder:
  Installiert:           (keine)
  Installationskandidat: 5.3.7-5+b1
  Versionstabelle:
     5.3.7-5+b1 500
Für Router/Server finde ich netfilter-persistent, geeigneter (weil ohne GUI):
Code:
:~ $ systemctl status netfilter-persistent
● netfilter-persistent.service - netfilter persistent configuration
     Loaded: loaded (/lib/systemd/system/netfilter-persistent.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/netfilter-persistent.service.d
             └─iptables.conf, not_run.conf
     Active: active (exited) since Fri 2024-08-16 11:19:35 CEST; 2 weeks 1 days ago
       Docs: man:netfilter-persistent(8)
   Main PID: 307 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 3723)
     Memory: 0B
        CPU: 0
     CGroup: /system.slice/netfilter-persistent.service
Code:
:~ $ ls -la /etc/iptables/rules.v4
-rw------- 1 root root 3200 Feb  1  2024 /etc/iptables/rules.v4
 
Der fwbuilder (GUI) wird in debian noch zur Verfügung gestellt:
Code:
:~$ apt policy fwbuilder
fwbuilder:
  Installiert:           (keine)
  Installationskandidat: 5.3.7-5+b1
  Versionstabelle:
     5.3.7-5+b1 500
naja, is halt jahrelang nichts mehr dran gemacht worden - 5 Jahre oder so?


Für Router/Server finde ich netfilter-persistent, geeigneter (weil ohne GUI):
der fwbuilder lief ja im Idealfall nicht auf dem Router, sondern auf dem Rechner desjenigen, welcher die Regelsätze erstellte - als Resultat kam dann ein rules-File raus, was man dann zum Router/Server etc übertrug - und was man manuell auf Kommandozeile auch hätte schreiben können (die Objekte waren halt eher Maschinen-lesbar als Human-lesbar);

der Charme des ganzen war ja, dass man den gleichen bzw ähnliche Regelsätze einmal aufsetzte und die auf verschiedenste Netfilter anwenden konnte (iptables, pf, Asa, Pix,...)
 
Kommt halt immer darauf an was man allgemein machen will. Ich hatte letztens wieder einen Wutanfall gegenüber Debian, da sowohl netfilter (über netfilter selbst, als auch iptables-nft), als auch das oft empfohlene ufw erstmal Probleme mit anderen Systemen machen, die nft Regeln bearbeiten wie virtuelle Maschinen oder Container. Sowas bin ich von rhel mit firewalld nicht gewohnt.
 
Den "Wutanfall" hatte ich auch!
Das haengt aber auch damit zusammen, dass man immer irgendwo beim googeln irgendwelche Stueckchen findet, und die FOren voll sind mit irgendwelchen kaputten .conf-files, die nicht funktionieren, zusammen mit der Frage "Warum geht das nicht?!" :)


Daher hier mein Beitrag zu einer besseren Welt:

BEI MIR GEHT DAS! ;)

Code:
#!/usr/sbin/nft -f

flush ruleset

define    DEV_WIRE="lan3"
define    DEV_WIFI="lan2"
define    DEV_INTERNET="ppp0"

define    PORT_FTP="21"
define    PORT_DNS="53"
define    PORT_DHCP="67"
define    PORT_SIP="5060"
define    PORT_HTTP="8080"

table inet filter {
    chain input {
        type filter hook input priority filter; policy accept;
        tcp dport { $PORT_FTP } counter accept;
        iifname $DEV_INTERNET tcp dport { $PORT_HTTP } counter accept;
        iifname $DEV_INTERNET udp dport $PORT_SIP counter packets 0 bytes 0 accept;       
        iifname $DEV_INTERNET tcp dport $PORT_SIP counter packets 0 bytes 0 accept;
        iifname { lo, $DEV_WIRE, $DEV_WIFI } counter accept;
    }
    chain forward {
        type filter hook forward priority filter; policy accept;
        tcp flags syn tcp option maxseg size set 1340
    }
    chain output {
        type filter hook output priority filter; policy accept;
    }
}

table ip nat {
    chain prerouting {
        type nat hook prerouting priority 0; policy accept;
        iifname $DEV_INTERNET tcp dport { $PORT_HTTP } counter dnat to 192.168.7.12:22
    }
    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        masquerade
    }
}
 
Zurück
Oben