Vollständiges Masquerading-NAT-Beispiel mit Nftables unter Linux?

Vollständiges Masquerading-NAT-Beispiel mit Nftables unter Linux?

Ich suche nach einem vollständigen Beispiel, wie dies mit nftables funktioniert. Es sollte ein DHCP-Client auf der Upstream-Schnittstelle sein, ein 192.168.0.0/24-LAN auf der anderen Schnittstelle haben und auch als Firewall fungieren.

Extrapunkte gibt es für das Öffnen eines SSH-Ports auf der Upstream-Schnittstelle und die Weiterleitung des Datenverkehrs über Port 80 an einen anderen Server im LAN.

Das nftables-Wiki lässt einige Fragen unbeantwortet. Zum Beispiel dieAbschnitt über Maskierungbeschreibt nicht, wie die Maskierungsregel an die eine oder andere Schnittstelle angehängt wird.

Antwort1

Ich verwende Folgendes und gehe davon aus, dass lan0es mit Ihrem internen Netzwerk und wan0Ihrem ISP verbunden ist.

Ich bin mir nicht sicher, was Sie mit „DHCP-Client auf der Upstream-Schnittstelle“ meinen, da dies mit einem DHCP-Client und nicht mit nftables erfolgt. Das folgende Setup schränkt den ausgehenden Datenverkehr nicht ein, sodass die DHCP-Anforderung durchgeht.

#!/usr/bin/nft -f

flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;

    # allow established/related connections
    ct state {established, related} accept

    # early drop of invalid connections
    ct state invalid drop

    # allow from loopback
    iifname lo accept

    # Allow from internal network
    iifname lan0 accept

    # allow icmp
    ip protocol icmp accept

    # allow ssh
    tcp dport 22 accept comment "SSH in"

    reject
  }

  chain forward {
    type filter hook forward priority 0;

    # Allow outgoing via wan0
    oifname wan0 accept

    # Allow incoming on wan0 for related & established connections
    iifname wan0 ct state related, established accept

    # Drop any other incoming traffic on wan0
    iifname wan0 drop
  }

  chain output {
    type filter hook output priority 0;
  }

}

table ip nat {
  chain prerouting {
    type nat hook prerouting priority 0;

    # Forward traffic from wan0 to a LAN server
    iifname wan0 tcp dport 80 dnat 192.168.0.8 comment "Port forwarding to web server"
  }

  chain postrouting {
    type nat hook postrouting priority 0;

    # Masquerade outgoing traffic
    oifname wan0 masquerade
  }
}

Antwort2

Masquerading ist ein Sonderfall von SNAT. Wenn Sie den Datenverkehr an die Ausgabeschnittstelle oder Ausgabeadresse (Quelladresse für Ihre internen IPs) anhängen möchten, verwenden Sie SNAT

verwandte Informationen