iptables-Regeln zum Zulassen von HTTP-Datenverkehr für nur eine Domäne

20

Ich muss meinen Computer so konfigurieren, dass nur HTTP-Datenverkehr von / zu serverfault.com zugelassen wird. Alle anderen Websites, Service-Ports sind nicht zugänglich. Ich habe mir die folgenden Iptables-Regeln ausgedacht:

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

Es funktioniert nicht ganz gut:

  • Nachdem ich alles fallen gelassen habe, gehe ich zu Regel 3 über:

    iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT

Ich erhalte diesen Fehler:

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

Denken Sie, dass es mit DNS zusammenhängt? Soll ich das auch zulassen? Oder sollte ich einfach IP-Adressen in die Regeln aufnehmen? Glauben Sie, was ich versuche, könnte mit einfacheren Regeln erreicht werden? Wie?

Ich würde mich über jede Hilfe oder Hinweise dazu freuen. Vielen Dank!

Zenet
quelle
2
Vergessen Sie nicht sstatic.net und andere. serverfault.com kommt nicht ganz von serverfault.com
Zoredache
Können Sie einen Proxy auf einem anderen System ausführen? Dies ist die beste / einfachste Lösung: serverfault.com/questions/215134
mattdm

Antworten:

29

Bei den IPTables-Regeln ist die Reihenfolge wichtig. Die Regeln werden der Reihe nach hinzugefügt und angewendet. Darüber hinaus werden Regeln beim manuellen Hinzufügen sofort angewendet. Daher werden in Ihrem Beispiel alle Pakete, die die INPUT- und OUTPUT-Ketten durchlaufen, verworfen, sobald die Standardrichtlinie festgelegt wird. Dies ist übrigens auch der Grund, warum Sie die Fehlermeldung erhalten haben, die Sie erhalten haben. Was passiert ist folgendes:

  1. Die Standard-DROP-Richtlinie wird angewendet
  2. IPTables empfängt einen Hostnamen als Ziel
  3. IPTables versucht eine DNS-Suche auf "serverfault.com"
  4. Die DNS-Suche wird durch die DROP-Aktion blockiert

Während die Quell- / Zieloptionen Hostnamen akzeptieren, wird davon dringend abgeraten. So zitieren Sie die Manpage:

Hostnamen werden nur einmal aufgelöst, bevor die Regel an den Kernel gesendet wird. Beachten Sie, dass die Angabe eines Namens, der mit einer Remote-Abfrage wie DNS aufgelöst werden soll, eine wirklich schlechte Idee ist.

Slillibri traf den Nagel auf den Kopf, worauf er antwortete, Sie hätten die DNS-ACCEPT-Regel verpasst. In Ihrem Fall spielt es keine Rolle, aber im Allgemeinen würde ich die Standardrichtlinie später im Prozess festlegen. Das Letzte, was Sie möchten, ist, dass Sie remote arbeiten und SSH zulassen, nachdem Sie eine Standardverweigerung aktiviert haben.

Abhängig von Ihrer Distribution sollten Sie auch in der Lage sein, Ihre Firewall-Regeln so zu speichern, dass sie beim Start automatisch angewendet werden.

Wenn Sie das alles wissen und Ihr Skript neu ordnen, empfehle ich Folgendes.

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Scott Pack
quelle
3
Schöne, gut gemachte Antwort.
JakeRobinson
1
Ich weiß das zu schätzen, obwohl Sie auch meinen Fehler verpasst haben müssen. Hoppla.
Scott Pack
3
Tatsächlich können Sie Ihre iptables -PAnweisungen an einer beliebigen Stelle in Ihrem Skript platzieren, da Kettenrichtlinien nur angewendet werden, wenn Pakete am Ende einer Kette "abfallen". Normalerweise setze ich die Richtlinienanweisungen (normalerweise DROPRichtlinien) oben in meine iptables-Skripte.
Steven Montag
1
@Steven: Du hast absolut recht. Das OP scheint sie interaktiv einzugeben. Nehmen wir an, Sie sind über SSH mit Ihrem Host verbunden und Ihre erste Regel gilt für die Richtlinie DROP. Ihre SSH-Verbindung wird getrennt, bevor Sie weitere Regeln eingeben können. Dies ist das gleiche Timing-Problem, wenn es sich um eine andere Manifestation handelt, als sie angetroffen hat.
Scott Pack
Vielen Dank. Versuchte das. Hat aber nicht funktioniert ohne hinzuzufügen sudo iptables -I OUTPUT 1 -o lo -j ACCEPT. Sollte das nicht hinzugefügt werden?
Kiran
7

Hinzufügen

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

DNS-Lookups zulassen.

slillibri
quelle
5

Diese Art von Anforderung kann mit einem Web-Proxy und / oder Filter besser gehandhabt werden. Dansgaurdian kann dazu konfiguriert werden. Sie müssen NAT-Regeln verwenden, um den Datenverkehr durch den Filter zu zwingen.

Durch die Verwendung von iptables zum Filtern können alle Websites mit den entsprechenden IP-Adressen ausgewählt werden. Dies ist normalerweise eine kleine Teilmenge des gesamten Webs.

BillThor
quelle
1
Stimme dem voll und ganz zu. iptablesist wahrscheinlich das falsche Tool, da es sich nicht besonders gut um DNS-Namen handelt. Ein Webproxy mit entsprechenden Filtereinstellungen passt viel besser.
Steven Montag
2

Ich fürchte, iptables funktioniert auf dieser Ebene nicht, es kümmert sich nur um die IP-Adresse, nicht um den Hostnamen. Wenn Sie den Zugriff auf virtuelle Hosts mit anderen Namen auf derselben IP-Adresse blockieren möchten, müssen Sie die .htaccess-Dateien eingeben.

Niall Donegan
quelle
Die Sache ist, wenn ich Regel 3 versuche, ohne "alles fallen zu lassen", funktioniert es gut mit iptables!
Zenet
2
hmm, ich habe die Frage falsch verstanden. Richtig, was im Hintergrund passiert, ist, dass iptables serverfault.com auf 64.34.119.12 auflöst (siehe Antwort von slillibri, um zu verstehen, warum das Auflösen nicht funktioniert hat). Da iptables jedoch keine Hostnamen versteht und nur die IP zulässt, können Sie eine Verbindung zu jeder Website auf dieser IP herstellen, wenn mehrere Websites vorhanden sind.
Niall Donegan
2
@Emily, es kann gut funktionieren, da die Regel hinzugefügt wird, aber wenn sich die serverfault.com-IP ändert, wird kein Datenverkehr zugelassen. Das Zulassen einer Website wie google.com mit Hunderten von Adressen, die häufig geändert werden, funktioniert überhaupt nicht.
Zoredache
1

Sie müssen dies auf Ihrem Webserver konfigurieren. iptables ist ein Paketfilter. HTTP-Transaktionen senden den Site-Namen (dh Stackoverflow) als Teil der TCP-Payload (dh nicht als Teil des TCP-Headers, den iptables leicht liest).

Angesichts dessen und der Tatsache, dass HTTP-Transaktionen mit ziemlicher Sicherheit über mehrere Pakete verteilt sein werden (dh, Sie können nicht einfach eine Zeichenfolge im HTTP-Header abgleichen), wird dies von Ihrer Webserverkonfiguration oder einem Proxy vor Ihnen viel besser gehandhabt davon.

Es wäre nützlich, die Gründe dafür zu kennen. Es gibt noch ein paar andere Alternativen:

  1. Weiterleiten an die richtige URL, wenn sie die falsche URL eingeben (z. B. Weiterleiten an stackoverflow.com, wenn sie www.stackoverflow.com eingeben)
  2. Weisen Sie Ihren Webserver an, keine anderen Hosts als stackoverflow.com zu bedienen
  3. Stellen Sie die Site auf eine separate IP-Adresse, auf die sich sonst nichts auflöst, und lassen Sie Ihren Webserver nur darauf warten.
Philip Reynolds
quelle
Hallo Phil, ich bin mir nicht sicher, welchen Webserver ich verstehe? Ich habe keinen Webserver. Ich mache diese Konfiguration auf meinem Computer.
Zenet