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


0

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

Wie konfiguriere ich es so, dass es auch als Firewall fungiert? Irgendwelche Bedingungen, die ich in den Verkehr gebracht habe FORWARD Kette funktioniert einfach nicht.

Zum Beispiel

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

Lässt einfach den gesamten TCP-Verkehr vom Routing ab, anstatt ihn auf den Verkehr zu beschränken, der von eth1 stammt. Ebenfalls...

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

... lässt nicht nur TCP-Verkehr aus dem 192.168.2.0-Subnetz zu, sobald ich die Regel anwende, stoppt der gesamte TCP-Verkehr das Routing.

Ich konnte keine eindeutige Dokumentation zum Packet Mangling mit Masquerade finden oder darüber, wie man Masquerade unterbindet und stattdessen SNAT verwendet.

  • eth0 ist eine externe Schnittstelle im selben Subnetz wie der DSL-Router
  • eth1 ist eine interne Schnittstelle, über die alle meine Hosts problemlos 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

NB, ich habe Masquerading deaktiviert (scheint eine minderwertige Lösung zu sein) und SNAT wie folgt aktiviert. Allerdings habe ich innerhalb von fünf Minuten alle Internet- und SSH-Verbindungen zum Router verloren. Ich denke, wenn ich das nur knacken kann, haben wir eine Antwort, die für meine (und viele andere Situationen?) -A POSTROUTING -o eth0 -j SNAT --to 192.168.1.1 brauchbar ist
TemperedGlass

Ob SNAT funktioniert nicht, verwenden Sie wahrscheinlich die falsche Quelladresse.
Daniel B

Was versuchst du überhaupt zu erreichen? Bitte geben Sie die Ausgabe von iptables-save mit Ihren gewünschten Regeln sowie einer verbalen Beschreibung von ihnen.
Daniel B

Ich SNATING es jetzt mit 192.168.1.1 - Internet funktioniert, aber ich kann den Verkehr nicht filtern (nat Tabellen sagen mir, dass ich es nicht tun soll, und wenn ich Subnetze / Schnittstellen usw. in der FORWARD-Tabelle anwende, dann schlägt der Verkehr für das Protokoll fehl Ich möchte verhindern, dass bestimmte Hosts auf das Internet zugreifen. Ein Beispiel für eine fehlgeschlagene Regel (die obige Sicherungsdatei 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" Wirkung von above = all tcp forwarding schlägt nach iptables-restore aus config mit dieser Regel fehl.
TemperedGlass

Vielen Dank für die bisherigen Antworten. Hoffentlich ist es jetzt klarer?
TemperedGlass

Antworten:


1

Iptables und das Networking im Allgemeinen sind komplizierter, als Sie es zu schätzen wissen.

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

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

Wo dies bricht, ist das Alle Verbindungen und der Datenverkehr erfolgen in beide Richtungen . FORWARD verarbeitet den gesamten Datenverkehr, der nicht auf den Router (INPUT) abzielt oder vom Router (OUTPUT) stammt. FORWARD erhält also sowohl die Verbindung, über die der ausgehende TCP-Datenverkehr initiiert wird (was Ihre Regel zulässt), als auch alle Antworten, die versuchen, diese Verbindung zu bestätigen und den Datenverkehr weiterzuleiten (da Sie alles andere verwerfen, was nicht übereinstimmt, wäre eine neue Regel erforderlich, um erlauben).

Hier wird iptables sehr schnell sehr kompliziert, weil es verrückt ist, eine Regel für jedes potenzielle Paket in beide Richtungen aufzustellen. Es wird einfacher, wenn die erste Regel immer darin besteht, Datenverkehr über hergestellte Verbindungen mit -m state --state ESTABLISHED zuzulassen. als Sie anfingen, in Ihrer anderen Frage zu verwenden, Ihr NAT-Problem aussortierend . Auf diese Weise können Sie nur Regeln für Verbindungen schreiben, deren Start Sie zulassen möchten. Es kann auch hilfreich sein, eingehende und ausgehende Verbindungen nach ihren eigenen Regeln zu sortieren (es sei denn, Sie machen sich nur Gedanken über ausgehende), 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....
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.