fragen stichworte

iptables-Regeln, um den HTTP-Verkehr nur zu einer Domäne zuzulassen

Ich muss meinen Computer so konfigurieren, dass nur HTTP-Verkehr zu/von serverfault.com zugelassen wird. Alle anderen Websites, Services-Ports sind nicht zugänglich. 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 abgelegt habe, gehe ich weiter zu Regel 3:

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

Ich erhalte folgende Fehlermeldung:

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

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

Ich würde mich freuen, wenn Sie mir dabei helfen oder Hinweise geben würden. Danke vielmals!

antworten

Bei IPTables-Regeln kommt es auf die Reihenfolge an. Die Regeln werden in der Reihenfolge hinzugefügt und angewendet. Wenn Regeln manuell hinzugefügt werden, werden sie sofort angewendet. In Ihrem Beispiel werden also alle Pakete, die die INPUT- und OUTPUT-Ketten durchlaufen, gelöscht, sobald die Standardrichtlinie festgelegt ist. Dies ist übrigens auch der Grund, warum Sie den Fehler erhalten haben Nachricht, die Sie getan 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

Obwohl die Quell-/Zieloptionen Hostnamen akzeptieren, wird davon abgeraten. Um die Manpage zu zitieren,

Hostnames will be resolved once only, before the rule is submitted to the kernel. Please note that specifying any name to be resolved with a remote query such as DNS is a really bad idea.

Slillibri hat den Nagel auf den Kopf getroffen, was seine Antwort war, Sie haben die DNS-ACCEPT-Regel verfehlt. In Ihrem Fall spielt es keine Rolle, aber im Allgemeinen würde ich die Standardrichtlinie später 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 all das 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

Fügen Sie

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

, um DNS-Suchvorgänge zuzulassen.

Diese Anforderung kann mit einem Webproxy und/oder -filter besser gehandhabt werden. Dansgaurdian kann dafür konfiguriert werden. Sie müssen NAT-Regeln verwenden, um den Datenverkehr durch den Filter zu erzwingen.

Durch die Verwendung von iptables zum Filtern werden alle verfügbaren Standorte der entsprechenden IP-Adressen zugelassen. Dies ist normalerweise eine kleine Teilmenge des gesamten Webs.

Ich fürchte, iptables funktioniert auf dieser Ebene nicht, es interessiert nur die IP-Adresse, nicht den Hostnamen. Wenn Sie den Zugriff auf andere virtuelle Namen mit demselben Namen auf derselben IP-Adresse blockieren möchten, müssen Sie die .htaccess-Dateien einfügen.

Sie müssen dies auf Ihrem Webserver konfigurieren. iptables ist ein Paketfilter. HTTP-Transaktionen senden den Site-Namen (d. H. Stackoverflow) als Teil der TCP-Nutzdaten (d. H. Nicht als Teil des TCP-Headers, der von iptables problemlos gelesen werden kann).

In Anbetracht dessen und der Tatsache, dass HTTP-Transaktionen mit großer Wahrscheinlichkeit über mehrere Pakete verteilt werden (dh, Sie können nicht einfach eine Zeichenfolge im HTTP-Header angeben), wird dies in Ihrer Webserverkonfiguration oder in einem Stellvertreter davor.

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

  1. Weiterleiten zur richtigen URL, wenn sie die falsche URL eingeben (z. B. Weiterleitung zu stackoverflow.com, wenn sie www.stackoverflow.com eingeben)
  2. Sagen Sie Ihrem Webserver, dass er keine Hosts außer stackoverflow.com bereitstellt
  3. Setzen Sie die Site auf eine separate IP-Adresse, für die nichts anderes bestimmt ist, und veranlassen Sie nur Ihren Webserver, dies zu überwachen.