Wie verwende ich NFT auf einer Linux-Bridge, um den Zugriff auf bestimmte IP-Adressen zu blockieren?

Wie verwende ich NFT auf einer Linux-Bridge, um den Zugriff auf bestimmte IP-Adressen zu blockieren?

Ich habe eine Ubuntu-Box mit einer br0definierten Bridge. Die Bridge ist eth0mit dem Internetdienst verbunden und eth1mit dem Netzwerkport eines PCs verbunden. Die Bridge funktioniert wie erwartet und leitet den gesamten Datenverkehr zwischen eth0und weiter eth1.

Ich möchte eine Regel festlegen, die den Zugriff auf bestimmte externe IP-Adressen (z. B. 1.1.1.1) vom PC aus blockiert. Ich nehme an, das ist die Art, dies zu tun. Wie schreibe ich eine Regel, sodass nichts von/zu 1.1.1.1 nftpassieren kann ?br0

Der Zweck besteht hierbei darin, bestimmte Fehler zu Testzwecken simulieren zu können.

Antwort1

Dies geschieht mitNftables'Brückenfamilie.

Nftablesbietet die Bridge-Familie als Ersatz fürebtabellen.

Erstellen Sie eine Tabelle imBrückeFamilie:

# nft add table bridge t

Erstellen Sie eine Kette zum Filtern weitergeleiteter Frames:

# nft add chain bridge t c '{ type filter hook forward priority 0; policy accept; }'

Erstellen Sie eine Regel, um zu verhindern, dass IP-Paketeeth1um 1.1.1.1 zu erreichen:

# nft add rule bridge t c iif eth1 ether type ip ip daddr 1.1.1.1 drop

Das ist alles zum Thema zustandslose Firewall.


SeitLinux-Kernel 5.3 Nftablesbietet auch Unterstützung für direkte Stateful Firewall imBrückeWeg:

Fügen Sie native Verbindungsverfolgungsunterstützung für die Bridge hinzu. Vor diesem Patchset bestand die einzige Möglichkeit für Benutzer, eine zustandsbehaftete Filterung durchzuführen, darin, die br_netfilterEmulationsschicht zu verwenden. Dies ist ein Schritt nach vorne, um sie zu verwerfen [...]

Dadurch lässt sich das System problemlos in eine Richtung isolieren. So können Sie beispielsweise Folgendes erreichen:

  • eingehender Zugriff auf den PC mit SSH
  • Ausgehender Zugriff vom PC: der zu verwendende PCKlingelnund DNS ( thunten steht für beideTCPUndUDP)
  • ARP (ohne das keine IPv4-Konnektivität besteht)
  • alles nötigeAntwortverkehr(als erste Regel aus Performancegründen)
  • und sonst nichts

man könnte verwenden:

# nft add rule bridge t c ct state related,established accept
# nft add rule bridge t c oif eth1 ether type ip tcp dport 22 accept
# nft add rule bridge t c iif eth1 ether type ip meta l4proto {tcp, udp} th dport 53 accept
# nft add rule bridge t c iif eth1 ether type ip icmp type echo-request accept
# nft add rule bridge t c ether type arp accept
# nft add rule bridge t c drop

Eine gewisse Faktorisierung ist sicherlich möglich und sollte in Betracht gezogen werden (z. B. durch Verwendung von Mengen undVerkettungen).


Alle obigen Beispiele haben keine Auswirkungen auf die Ubuntu-Box selbst, die weiterhin von beiden Seiten erreicht werden kann. Um den Verkehr vom PC zur Ubuntu-Box (oder von der Ubuntu-Box zum PC) zu beeinflussen, können dieselben Regeln auf einer Kette angewendet werden, die sich einklinkt inEingang(bzw.Ausgabe) anstattnach vorne.


Notiz:

Derbr_netfilterModul sollte nicht geladen werden (standardmäßig aktiviert die sysctl-Eigenschaft net.bridge.bridge-nf-call-iptables = 1), um unerwartete Interaktionen zwischen nativenBrückeRegeln undIP-AdresseFamilienregeln, die auchNftablesgenauso gut wieiptables. Das bedeutetDas Ausführen von Docker oder Kubernetes (die beiden üblichen Benutzer von br_netfilter) auf demselben System sollte vermieden werdenbei Netzwerk-Experimenten (ist aber mit zusätzlicher Sorgfalt möglich, z. B. durch Anpassungdiese UL SE Q/A).

br_netfilterWenn Sie (und ) geladen haben net.bridge.bridge-nf-call-iptables = 1, werden Sie fälschlicherweise annehmen, dass die normale Vorgehensweise darin besteht, inIP-AdresseFamilie imFilter/nach vorneHaken. Das ist nicht der Normalfall, undNftablesEs fehlen zusätzliche Funktionen, die dies nutzen, wieiptables'physdevMatch-Modul: Stattdessen war das Ziel immer, dies nativ imBrückeFamilie und nicht verlassen sich auf br_netfilter.

Antwort2

Wenn Ihr Linux-Host als Router ausgeführt wird, müssen Sie auch die IP-Weiterleitung konfigurieren.

Um Ihre Frage zu beantworten, könnten Sie Nftables wie folgt verwenden:

#!/usr/bin/nft 

flush ruleset

table inet my_table {
   chain INPUT {
      iifname br0 saddr 1.1.1.1 drop
      iifname br0 daddr 1.1.1.1 drop
   }

chain FORWARD {
      iifname br0 saddr 1.1.1.1 drop
      iifname br0 daddr 1.1.1.1 drop
   } 

}

und führen Sie dies mit nft -f /Pfad/zu/Ihrer/nft.Datei aus

Das ist allerdings ein bisschen nutzlos (ich weiß, dass Sie Nftables lernen, nehmen Sie das nicht zu ernst). Die beste Vorgehensweise besteht darin, alles zu löschen und nur das zuzulassen, was erforderlich ist, also nicht bestimmten Datenverkehr zu löschen, sondern bestimmten Datenverkehr zuzulassen.

Ich fand die Red Hat 8-Dokumentation zu Nftables sehr gut, vielleicht können Sie genauso viel daraus lernen wie ich:

rhel 8 nftables Dokumentation

verwandte Informationen