iptables: Der "Skript" Weg oder der "* Filter, Regeln, COMMIT" Weg?

7

Ich versuche herauszufinden, wie NAT und iptables funktionieren. Während ich mich in der Trial-and-Error-Phase befinde, habe ich zwei etwas widersprüchliche Howtos gefunden.

Eine Anleitung verwendet ein Skript, um iptablesRegeln nacheinander aufzurufen . Das Skript scheint so benannt und gespeichert zu sein, dass es früh während des Systemstarts ausgeführt wird, und ich denke, ein Problem kann sein, dass andere Skripte danach aufgerufen werden und seine Absichten rückgängig machen. Ich glaube sogar, dass ich dies einmal versehentlich getan habe, als ich das ursprüngliche Skript (00-Firewall) mithilfe eines Backups (00-Firewall-alt) gespeichert und umbenannt habe. Das Beispielskript für das Howto lautet:

#!/bin/sh

PATH=/usr/sbin:/sbin:/bin:/usr/bin

#
# delete all existing rules.
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Always accept loopback traffic
iptables -A INPUT -i lo -j ACCEPT


# Allow established connections, and those not coming from the outside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the LAN side.
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

# Masquerade.
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

# Don't forward from the outside to the inside.
iptables -A FORWARD -i eth1 -o eth1 -j REJECT

# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward

Ein anderes Howto verwendet kein Skript, sondern eine Datei, in der einige Filterregeln definiert sind. Es sieht aus wie das:

*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allows SSH connections 
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
-A INPUT -p tcp -m state --state NEW --dport 30000 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access 
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT

Was sind die Vor- und Nachteile beider Methoden zum Einrichten von iptables? Hintergrundinformationen werden sehr geschätzt, da ich für das Ganze ziemlich neu bin. Zum Beispiel verstehe ich nicht, wer die Datei aus dem letzteren Howto liest und wie sie verarbeitet wird. Mein Gefühl sagt mir, dass das zweite Howto eine bessere Lösung vorschlägt, aber warum genau?

Zebonaut
quelle

Antworten:

5

Ich habe in der Vergangenheit beide Techniken angewendet. In diesen Tagen tendiere ich zu einem Hybrid aus beiden.

Wenn Ihr Regelsatz fünf oder sechs einfache Regeln enthält, ist jede Methode in Ordnung. Die Dinge werden interessant, wenn Sie große Regelsätze haben: große Installationen, Ihre Firewall-Box erledigt ein bisschen Routing usw.

Denken Sie daran, Sie können sich in den Fuß schießen, egal wie Sie Ihre Regelsätze laden. :) :)

Skriptbasiert

Sie erstellen ein Bash-Skript, ein Perl-Skript, ein Python-Skript - Hölle, schreiben Sie ein Lisp oder Befunge Programm für alle, die sich ! Im Skript erstellen Sie alle gewünschten Netfilter-Regeln.

Die Vorteile:

  • Direktheit. Sie experimentieren mit Regeln und kopieren einfach diejenigen, die von der Befehlszeile aus funktionieren, und fügen sie in das Skript ein.
  • Dynamische Firewall. Ein Client von mir führt OpenVPN aus Setups für seine eigenen Clients aus, und jeder Client erhält aus Sicherheits-, Firewall- und Abrechnungsgründen eine eigene OpenVPN-Instanz. Die First-of-Defense-Firewall muss die OpenVPN-Ports für jedes Tupel (IP, Port) dynamisch öffnen. Das Firewall-Skript analysiert also das Manifest von OpenVPN-Konfigurationen und sticht dynamisch die erforderlichen Lücken. Ein anderer speichert Webserver-Details in LDAP. Das Skript iptables fragt den LDAP-Server ab und ermöglicht automatisch das Eindringen in die Webserver. Bei großen Installationen ist dies ein großer Segen.
  • Klugheit. Meine Firewall-Skripte ermöglichen die Remoteverwaltung, auch ohne Lichtausfallverwaltung: Wenn der Bediener nach dem Laden des Regelsatzes nicht innerhalb weniger Minuten antwortet, wird der Regelsatz auf den letzten bekannten Rollensatz zurückgesetzt. Wenn aus irgendeinem Grunde , der auch fehlschlägt, gibt es einen dritten (und vierten) Failback abnehmende Sicherheit.
  • Mehr Cleverness: Sie können den SSH-Zugriff auf Ihren Netblock am Anfang des Skripts öffnen und ihn am Ende des Skripts aufheben (und gefilterte SSH-Sitzungen einlassen). Wenn Ihr Skript fehlschlägt, können Sie trotzdem dort einsteigen.
  • Online-Beispiele. Aus irgendeinem Grund verwendeten die meisten Beispiele, die ich online gesehen habe, Aufrufe von iptables(dies kann durch die Tatsache beeinflusst werden, dass meine ersten Firewall-Setups älter iptables-savewaren als Netfilter - aber das ist eine andere Geschichte)

Die Nachteile:

  • Ein Syntaxfehler im Skript und Sie sind von Ihrer Firewall ausgeschlossen. Ein Teil der oben genannten Klugheit ist auf schmerzhafte Erfahrungen zurückzuführen. :) :)
  • Geschwindigkeit. Unter Embedded Linux Boxen ist ein Bash- (oder sogar Dash-) Skript langsam und langsam auszuführen. Langsam genug, dass Sie abhängig von Ihrer Sicherheitsrichtlinie möglicherweise die Reihenfolge des Hinzufügens von Regeln berücksichtigen müssen - Sie könnten ein kurzlebiges Loch in Ihrer Verteidigung haben, und das ist genug. Das Laden von Regelsätzen ist bei weitem nicht atomar.
  • Komplexität. Ja, Sie können erstaunliche Dinge tun, aber ja, Sie können das Skript auch zu komplex machen, um es zu verstehen oder zu warten.

Regelsatzbasiert

Fügen Sie Ihre Regeln zu einer Regelsatzdatei hinzu iptables-restoreund laden Sie sie dann (oder speichern Sie einfach Ihren vorhandenen Regelsatz mit iptables-save). Dies ist, was Debian standardmäßig tut.

Die Profis:

  • Geschwindigkeit. iptables-restoreist ein C-Programm und im Vergleich zu Shell-Skripten köstlich schnell. Der Unterschied ist selbst bei anständigen Maschinen offensichtlich, bei bescheidener Hardware jedoch um Größenordnungen schneller.
  • Regelmäßigkeit. Das Format ist leichter zu verstehen, es ist im Wesentlichen selbstdokumentierend (sobald Sie sich an die Besonderheiten von Netfilter gewöhnt haben).
  • Es ist das Standard-Tool, wenn Sie sich dafür interessieren.
  • Es werden alle Netfilter-Tabellen gespeichert. Zu viele Netfilter-Tools (einschließlich iptables) arbeiten nur auf dem filterTisch, und Sie könnten vergessen, dass Ihnen andere zur Verfügung stehen (mit möglicherweise schädlichen Regeln). Auf diese Weise sehen Sie alle Tabellen.

Die Nachteile:

  • Mangel an Flexibilität.
  • Aufgrund fehlender Vorlagen- / Parametrisierungs- / dynamischer Funktionen kann die Wiederholung zu weniger wartbaren Regelsätzen und zu großen Regelsatzfehlern führen. Die willst du nicht.

Eine hybride Lösung - das Beste aus beiden Welten

Ich habe dieses für eine Weile in meiner reichlichen Freizeit entwickelt. Ich habe vor, dasselbe skriptbasierte Setup zu verwenden, das ich jetzt habe, aber sobald der Regelsatz geladen ist, speichert er ihn mit iptables-saveund speichert ihn dann für später zwischen. Sie können einen dynamischen Regelsatz mit all seinen Vorteilen haben, der jedoch sehr schnell geladen werden kann, wenn beispielsweise die Firewall-Box neu gestartet wird.

Alexios
quelle
1

Man sieht aus wie die Ausgabe iptables-saveund folglich die Eingabe, für iptables-restoredie der aktuelle Status der Netfilter-Firewall gespeichert und wiederhergestellt wird (z. B. beim Systemstart).

Der iptablesBefehl bearbeitet die Netfilter-Firewall. Es kann verwendet werden, um eine einzelne Änderung in der Live-Firewall-Konfiguration vorzunehmen, z. B. das Hinzufügen einer einzelnen Regel, aber auch das Ändern oder Löschen von Regeln.

Sie erstellen also die gewünschte Konfiguration mit iptables und speichern die resultierende Konfiguration mit iptables-save. Führen Sie nach dem Neustart eine Wiederherstellung dieser Konfiguration durch.

Oder schreiben Sie die iptables-Befehle, mit denen Sie diese Firewall erstellt haben -F, per Skript : Der Switch löscht die Firewall, indem er eine leere Tabelle erstellt, und das anschließende Hinzufügen von Regeln in einem Skript ist eine Alternative zur Verwendung des Befehls iptables-restore mit sollte zu einem ähnlichen Endzustand führen.

HBruijn
quelle
1

Ich stimme @zebonaut darin zu, dass Sie sorgfältig überlegen müssen, ob Ihre Firewall / Ihr Router beim Start und auch beim Laden der Regeln angemessen geschützt ist. Am Ende habe ich meine eigenen Firewall-Erstellungsskripte erstellt, und wenn ich sie getestet habe, kopiere ich sie in ein Firewall.working-Skript. Wenn sich die beiden unterscheiden, führt ein Cron-Job das funktionierende aus. Wenn ich also ausgesperrt werde, kann ich wieder einsteigen. Dies ist jetzt sehr selten, da die ersten Regeln etablierten / verwandten Verkehr zulassen. Ich habe für jede Schnittstelle eine andere Unterkette für die Weiterleitung und Eingabe, dies erleichtert das Debuggen.

Ich habe eine separate Einstellungsdatei, die bestimmte Zugriffe aktiviert / deaktiviert. Die Einstellungsdatei wird von cron zwischen Tag- und Nachtmodus umgeschaltet, um meine Kinder vom Internet auszuschließen, wenn sie im Bett schlafen sollten! Natürlich kann ich sie auch jederzeit außer Kraft setzen und sperren :-)

Das gleiche Skript behandelt IPv4 und IPv6. Wenn ich einen Hostnamen verwende, lege ich ihn in / etc / hosts oder in die Einstellungsdatei, anstatt mich auf DNS zu verlassen, denn wenn DNS kaputt geht, bricht die Firewall-Konfiguration.

Paul M.
quelle