iptables, ICMP und RELATED

7

Ich verwende die folgende einfache iptables-Regel, die verwandte Pakete akzeptiert :

-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Ich lasse ICMP -Echoanforderungen mit dieser anderen Regel weiterleiten:

-A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Sollte ich explizit etwas hinzufügen, um "nützliche" ICMP-Nachrichten wie destination-unreachable, time-exceededund zu erhalten parameter-problem, oder RELATEDakzeptiert die Klausel diese bereits?

S19N
quelle
Möglicherweise verwandt: serverfault.com/a/456115/100793
S19N

Antworten:

6

http://www.linuxtopia.org/Linux_Firewall_iptables/x1571.html

Ein weiterer äußerst wichtiger Teil von ICMP ist die Tatsache, dass damit die Hosts darüber informiert werden, was mit bestimmten UDP- und TCP-Verbindungen oder Verbindungsversuchen passiert ist. Aus diesem einfachen Grund werden ICMP-Antworten sehr oft als VERBUNDEN mit ursprünglichen Verbindungen oder Verbindungsversuchen erkannt. Ein einfaches Beispiel wäre, dass der ICMP-Host nicht erreichbar oder das ICMP-Netzwerk nicht erreichbar ist. Diese sollten immer an unseren Host zurückgesendet werden, wenn versucht wird, eine nicht erfolgreiche Verbindung zu einem anderen Host herzustellen, das betreffende Netzwerk oder der betreffende Host jedoch möglicherweise ausgefallen ist. Daher antwortet der letzte Router, der versucht, die betreffende Site zu erreichen, mit einer ICMP-Nachricht uns darüber. In diesem Fall wird die ICMP-Antwort als RELATED-Paket betrachtet

thanasisk
quelle
1
Diese Netzfilterfunktion benötigt Werbung. Alle iptables-Tutorials, die ich gefunden habe, schlagen entweder vor, icmp und icmpv6 unter bestimmten Bedingungen zu blockieren oder zuzulassen. Die saubere Lösung für Heimrouter-Benutzer ist eine RELATED-Regel mit höchster Priorität.
Strangelovian
5

Die RELATED-Regel kümmert sich standardmäßig um die zugehörigen ICMP-Nachrichten. Auf der Manpage zu iptables im Abschnitt zu conntrack ( http://linux.die.net/man/8/iptables ):

RELATED bedeutet, dass das Paket eine neue Verbindung startet, jedoch einer vorhandenen Verbindung zugeordnet ist, z. B. einer FTP-Datenübertragung oder einem ICMP-Fehler .

Andere von conntrack gemeldete Zustände sind:

  • UNGÜLTIG bedeutet, dass das Paket keiner bekannten Verbindung zugeordnet ist
  • ESTABLISHED bedeutet, dass das Paket einer Verbindung zugeordnet ist, die Pakete in beide Richtungen gesehen hat
  • NEU bedeutet, dass das Paket eine neue Verbindung gestartet hat oder anderweitig einer Verbindung zugeordnet ist, die keine Pakete in beide Richtungen gesehen hat
  • SNAT Ein virtueller Status, der übereinstimmt, wenn die ursprüngliche Quelladresse vom Antwortziel abweicht
  • DNAT Ein virtueller Status, der übereinstimmt, wenn sich das ursprüngliche Ziel von der Antwortquelle unterscheidet

Sie können die Conntrack-Tabelle mit dem conntrackPaket untersuchen und verwalten .

$ sudo conntrack -L
jjmontes
quelle
2

Im Allgemeinen ist es eine sehr schlechte Idee, icmp zu filtern oder zu blockieren. Normalerweise ist das einzige "gültige" Bit von icmp, das gefiltert werden soll, die Echoanforderung, in einem naiven Scan nach unten zu "erscheinen".

Wenn Sie jedoch Teile davon explizit zulassen möchten, fehlen mindestens zwei sehr wichtige Bits, Fragmentierung erforderlich & Source Quench:

-A INPUT -p icmp --icmp-type fragmentation-needed -m state --state NEW -j ACCEPT
-A INPUT -p icmp --icmp-type source-quench -m state --state NEW -j ACCEPT

Lassen Sie mich noch einmal sagen, dass das Filtern von icmp eine schlechte Idee ist, die Probleme maskiert und es schwierig macht, sie zu entdecken.

Dies war das Problem mit DF (nicht fragmentieren) und Fragmentierung erforderlich, das für die automatische PTMU-Erkennung erforderlich ist und dazu führte, dass auf Websites nicht zugegriffen werden konnte, da zwischengeschaltete Firewalls / Router die icmp-Pakete verwarfen, die den Endpunkt ankündigten, um die MTU zu senken.

Jorge Nerín
quelle
+1. Gute Antwort. Blockieren Sie niemals die erforderliche Fragmentierung und vor allem niemals ICMPv6 "Packet Too Big".
Tim Woolford
2
Wurde 2012 nicht source-quenchveraltet? tools.ietf.org/html/rfc6633#section-2
S19N
@ S19N du hast recht, das war ein bisschen, an das ich mich vor langer Zeit erinnerte, ich habe nicht neu, es war veraltet.
Jorge Nerín
1
Wäre eine Fragmentierung nicht erforderlich, würde das ICMP-Paket als RELATED klassifiziert und als solches durch die in der Frage dargestellte Regel berücksichtigt?
Ferenc Wágner
2

Ich werde meine eigene Antwort hinzufügen, um meine endgültige Konfiguration bereitzustellen, inspiriert von anderen Antworten und den folgenden Quellen:

  1. ein abgelaufener Entwurf der IETF mit einer nützlichen Tabelle, aus der hervorgeht, welche ICMP-Typen ein Limit zulassen, verweigern oder bewerten;
  2. eine weitere Seite mit den Mindestzeilen für iptables und Cisco IOS;
  3. eine dritte Ressource, die verwendet RELATED:

    iptables -P INPUT DROP
    iptables -A INPUT -p icmp --fragment -j DROP
    iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
    
S19N
quelle
Beachten Sie, dass blindes Filtern zu Problemen führen kann. Sehen Sie sich die an, die verursacht wurden, als das ECN-Bit in TCP verwendet wurde und Firewalls mit veralteten Konfigurationen diese SYN-Pakete blind ablegten
Jorge Nerín
Sie meinen, dass es neue ICMP-Typen geben könnte, die in Zukunft nützlich sein könnten? Ich stimme zu, aber ich betrachte eine "Firewall mit veralteter Konfiguration" als eigenständiges Problem. Daher bin ich bereit, die Regeln nach Bedarf zu aktualisieren.
S19N
-1

ICMP ist ein sehr wichtiges Verbindungsprotokoll. Die "Echo-Anfrage" ist die einzige wichtige nützliche Nachricht, die die Kommunikation unterstützt. Der Rest von ihnen, einschließlich "Ziel nicht erreichbar", kann sicher blockiert werden, insbesondere wenn die von Ihnen ausgeführte Anwendung eine große Anzahl unbekannter Treffer erhält.

Mit so etwas bist du besser dran,

-A INPUT -p icmp --icmp-type echo-request -m recent --set 
-A INPUT -p icmp --icmp-type echo-request -m recent --update --seconds 1 --hitcount 30 -j DROP 

-A INPUT -p icmp --icmp-type echo-request -j ACCEPT
-A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

-A OUTPUT -p icmp --icmp-type destination-unreachable -j DROP
-A INPUT -p icmp -j DROP

Dies würde nicht nur "Echo-Request" akzeptieren, sondern auch Ping-Floods mit mehr als 30 Paketen / s blockieren. Alles andere, was Sie hinzufügen möchten, muss ausdrücklich akzeptiert werden, da die RELATED-Klausel sie nicht empfängt, solange die Verbindung durch Einlassen hergestellt wird.

Asad Moeen
quelle
Wenn Sie ICMP auf Raten beschränken, ist es wichtig zu beachten, dass Sie diesen Host nicht mehr verwenden können, um den Paketverlust über ICMP während des Debuggens / der Diagnose des Netzwerks zu messen! 2c. TW
Tim Woolford
Normalerweise bewerte ich Limit-Echo-Anfragen mit --limit und --limit-Burst, die globale Zähler sind, deren Limit hoch genug ist, um keine Probleme zu verursachen. Sie können aber auch --hashlimit-mode srcip verwenden und Per-IP-Zähler haben, oder sogar Whitelist des sendenden Hosts.
Jorge Nerín
Ziel nicht erreichbar / * ist NICHT sicher zu blockieren, dies verursacht PMTU-Schwarze Löcher.
Figtrap