it-swarm.com.de

iptables-Regeln, um HTTP-Verkehr nur für eine Domäne zuzulassen

Ich muss meinen Computer so konfigurieren, dass nur HTTP-Verkehr zu/von serverfault.com zugelassen wird. Auf alle anderen Websites und Service-Ports kann nicht zugegriffen werden. Ich habe mir diese 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 AKZEPTIEREN

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 es auch zulassen? Oder sollte ich einfach IP-Adressen in die Regeln einfügen? Denken 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!

20
Zenet

Bei IPTables-Regeln ist die Reihenfolge wichtig. Die Regeln werden der Reihe nach hinzugefügt und angewendet. Wenn Regeln manuell hinzugefügt werden, werden sie außerdem sofort angewendet. In Ihrem Beispiel werden daher alle Pakete, die die INPUT- und OUTPUT-Ketten durchlaufen, verworfen, sobald die Standardrichtlinie festgelegt ist. Dies ist übrigens auch der Grund, warum Sie die Fehlermeldung erhalten haben, die Sie gemacht haben. Was passiert ist folgendes:

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

Die Quell-/Zieloptionen akzeptieren zwar Hostnamen, es wird jedoch dringend davon abgeraten. Um die Manpage zu zitieren,

Hostnamen werden nur einmal aufgelöst, bevor die Regel an den Kernel gesendet wird. Bitte 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, was seine Antwort war, Sie haben 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, remote zu arbeiten und SSH zuzulassen nach Aktivieren einer Standardverweigerung.

Abhängig von Ihrer Distribution sollten Sie außerdem 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 anordnen, würde ich Folgendes empfehlen.

# 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
30
Scott Pack

Hinzufügen

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

um DNS-Lookups zu ermöglichen.

7
slillibri

Diese Art von Anforderung kann mit einem Webproxy und/oder Filter besser behandelt werden. Dansgaurdian kann dafür konfiguriert werden. Sie müssen NAT Regeln) verwenden, um Ihren Datenverkehr durch den Filter zu zwingen.

Durch die Verwendung von iptables zum Filtern werden alle Websites zugelassen, die unter den entsprechenden IP-Adressen verfügbar sind. Dies ist normalerweise eine kleine Teilmenge des gesamten Webs.

5
BillThor

Ich fürchte, iptables funktioniert auf dieser Ebene nicht, es geht 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 Eingabe von .htaccess-Dateien prüfen.

2
Niall Donegan

Sie müssen dies auf Ihrem Webserver konfigurieren. iptables ist ein Paketfilter. HTTP-Transaktionen senden den Site-Namen (dh den Stapelüberlauf) als Teil der TCP-Nutzlast) (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 werden (dh Sie können nicht einfach eine Zeichenfolge im HTTP-Header abgleichen), wird dies von Ihrer Webserver-Konfiguration oder von einem Proxy vor Ihnen viel besser gehandhabt davon.

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

  1. Weiterleiten zur richtigen URL, wenn sie die falsche URL eingeben (z. B. Weiterleiten zu 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 dies nur abhören.
1
Philip Reynolds