Wie konfiguriere ich iptables gleichzeitig für IP-Masquerading und Firewall?

626
TemperedGlass

Ich habe einen Host, der als Gateway für die Weiterleitung eines Heimnetzwerks an das Internet fungiert. IP-Masquerading ist seit Monaten aktiviert und das System hat gut funktioniert.

Wie konfiguriere ich es so, dass es auch als Firewall funktioniert? Alle Bedingungen, die ich für den Verkehr in der FORWARDKette aufstelle, funktionieren einfach nicht.

Zum Beispiel

-A FORWARD -i eth1 -p tcp -j ACCEPT 

Entfernt lediglich den gesamten TCP-Datenverkehr vom Routing, anstatt ihn auf den von eth1 stammenden Datenverkehr zu beschränken. Ebenfalls...

 -A FORWARD -s 192.168.2.0/24 -p tcp -j ACCEPT 

... erlaubt nicht nur TCP-Datenverkehr aus dem Subnetz 192.168.2.0. In dem Moment, in dem die Regel angewendet wird, stoppt der gesamte TCP-Datenverkehr das Routing.

Ich konnte keine eindeutige Dokumentation zum Packet Mangling mit Maskerade finden oder wie man Maskerade aufhebt und stattdessen SNAT verwendet.

  • eth0 ist eine externe Schnittstelle in demselben Subnetz wie der DSL-Router
  • eth1 ist eine interne Schnittstelle, bei der alle meine Hosts einwandfrei mit DHCP arbeiten

Wie konfiguriere ich iptables für IP-Masquerading und Firewalling?

# Generated by iptables-save v1.4.21 on Thu Oct 29 12:48:19 2015 *nat :PREROUTING ACCEPT [10859:2328892] :INPUT ACCEPT [1002:126271] :OUTPUT ACCEPT [1256:91484] :POSTROUTING ACCEPT [638:43890] -A POSTROUTING -o eth0 -j MASQUERADE COMMIT # Completed on Thu Oct 29 12:48:19 2015 # Generated by iptables-save v1.4.21 on Thu Oct 29 12:48:19 2015 *filter :INPUT ACCEPT [5:803] :FORWARD ACCEPT [127:18532] :OUTPUT ACCEPT [5:431] -A INPUT -i eth1 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "HTTP Serve eth1" -A INPUT -i eth1 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "SSH Serve eth1" -A INPUT -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT -m comment --comment "ssh on eth1" -A INPUT -i eth0 -p tcp -m tcp --dport 53 -j DROP -m comment --comment "drop dns from eth0" -A INPUT -p icmp -j ACCEPT -A INPUT -i eth0 -j DROP -A INPUT -i eth1 -j REJECT -P INPUT DROP -A FORWARD -p tcp -j ACCEPT -m comment --comment "all tcp from internal" -A FORWARD -p udp -j ACCEPT -m comment --comment "all udp from internal" -A FORWARD -p icmp -j ACCEPT -P FORWARD DROP -A OUTPUT -o eth1 -p tcp -m tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT -A OUTPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT -P OUTPUT DROP COMMIT # Completed on Thu Oct 29 12:48:19 2015 
0
NB, ich habe Masquerading deaktiviert (scheint eine minderwertige Lösung zu sein) und SNAT wie folgt aktiviert, jedoch habe ich innerhalb von fünf Minuten alle Internet- und SSH-Verbindungen zum Router verloren. Ich denke, wenn ich das einfach knacken kann, dann haben wir eine Antwort für meine (und viele andere Situationen?) -A POSTROUTING -o eth0 -j SNAT - bis 192.168.1.1 TemperedGlass vor 9 Jahren 0
Wenn "SNAT" nicht funktioniert, verwenden Sie wahrscheinlich die falsche Quelladresse. Daniel B vor 9 Jahren 0
Was versuchst du überhaupt zu erreichen? Bitte geben Sie die Ausgabe von "iptables-save" mit Ihren gewünschten Regeln sowie einer verbalen Beschreibung davon an. Daniel B vor 9 Jahren 0
Ich bin jetzt mit 192.168.1.1 SNATING - Internet funktioniert, aber ich kann den Verkehr nicht filtern (nat Tabellen sagen mir, ich solle es dort nicht tun, und wenn ich Subnetze / Schnittstellen usw. in der Tabelle FORWARD verwende, dann schlägt der Verkehr für das Protokoll fehl Ich möchte bestimmte Hosts für den Zugriff auf das Internet sperren. Eine fehlgeschlagene Regel (die Speichern-Datei oben ist die einzige funktionierende Konfiguration) wäre -A FORWARD -p tcp -s 192.168.2.123 -j DROP -m comment --comment "block tcp from 192.168.2.123" Auswirkung von oben = Alle tcp-Weiterleitungen schlagen nach iptables-restore aus config mit dieser Regel fehl. TemperedGlass vor 9 Jahren 0
Vielen Dank für die bisherigen Antworten. Hoffentlich ist es jetzt klarer? TemperedGlass vor 9 Jahren 0
Welches ist Ihr WAN-NIC (eth0 / eth1?) Und welches ist Ihr LAN-NIC (eth1 / eth0)? MariusMatutiae vor 9 Jahren 0
Das ist ziemlich klar aus dem ursprünglichen Post, sicher? ... TemperedGlass vor 9 Jahren 0
Eigentlich nur um klar zu sein, ich habe den Heimrouter zu Router / ADSL-Breitband umformuliert. TemperedGlass vor 9 Jahren 0

1 Antwort auf die Frage

1
Radhil

iptables und das Networking im Allgemeinen ist komplizierter, als Sie dies würdigen.

Nehmen wir also an, Sie tun dies nur in der Hoffnung, den gesamten ausgehenden Datenverkehr von eth1 wie in Ihrer ersten Zeile zu aktivieren:

-A FORWARD -i eth1 -p tcp -j ACCEPT -P FORWARD DROP 

Wo dies bricht, ist, dass alle Verbindungen und der Verkehr in beide Richtungen erfolgen . FORWARD verarbeitet den gesamten Datenverkehr, der weder auf den Router gerichtet ist (INPUT) noch vom Router (OUTPUT) stammt. Daher erhält FORWARD sowohl den ausgehenden TCP-Verkehr, der die Verbindung initiiert (was Ihre Regel zulässt) als auch alle Antworten, die versuchen, diese Verbindung zu bestätigen und den Verkehr zurückzuleiten (was, da Sie alles andere löschen, was nicht passt, eine neue Regel erfordern würde) erlauben).

Hier wird iptables sehr schnell sehr kompliziert, denn es ist verrückt, für jedes mögliche Paket in beide Richtungen eine Regel festzulegen. Es wird einfacher, wenn die erste Regel darin besteht, den Datenverkehr über bestehende Verbindungen mit dem Status "-m state - ESTABLISHED" zuzulassen, da Sie in Ihrer anderen Frage bereits begonnen haben, das NAT-Problem zu lösen . So können Sie nur Regeln für Verbindungen schreiben, die Sie starten möchten. Es kann auch hilfreich sein, eingehende und ausgehende Verbindungen nach ihren eigenen Regeln zu sortieren (es sei denn, Sie sind nur besorgt über ausgehende Verbindungen), wie im Folgenden beschrieben:

#setup -N outbound -N inbound #design -A FORWARD -m state --state ESTABLISHED -j ACCEPT -A FORWARD -i eth0 -o eth1 -j inbound -A FORWARD -i eth1 -o eth0 -j outbound -P FORWARD DROP #allow outgoing web access -A outbound -p tcp -m tcp --dport 80,443 -j ACCEPT #and nothing else -A outbound DROP #etc....