Warum muss Loopback-Verkehr mithilfe von iptables autorisiert werden, um Webzugriff zu erhalten?

7

Ich dachte, dass Folgendes für ausgehendes HTTP auf einem Desktop (Nicht-Server) erforderlich ist:

iptables -A INPUT  -p tcp -m multiport --sports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Aber es stellt sich heraus, dass ich diese beiden brauche, damit es funktioniert. Ich weiß nicht warum:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Ich weiß, dass die letzte Regel UDP zur loSchnittstelle erlaubt .

Aber ich dachte alles was ich brauchte war outgoing TCP for NEW/ESTABLISHED connections+ incoming TCP for ESTABLISHED connections. Es schien mir nicht intuitiv zu sein (weil ich noch lerne).

dgo.a.
quelle
Es scheint, dass andere IPtables-Regeln vorhanden sein müssen. Dies kann von einer Firewall oder einem Captive-Portal-System oder einer Reihe anderer Dinge stammen.
Shawn J. Goff

Antworten:

7

Sie benötigen offensichtlich keinen loInternetzugang. Aber vielleicht läuft ein lokaler DNS-Server (Forwarder). DNS verwendet UDP, und für den Webzugriff ist neben HTTP auch DNS erforderlich.

Ihre Regeln erlauben übrigens keine (verwandten) ICMP-Antworten. Dies wird wahrscheinlich zu Problemen führen (es sei denn, Sie verwenden niedrigere Werte für MSS / MTU). Sie erlauben jedoch nicht einmal ausgehendes ICMP, sodass die Pfad-MTU-Erkennung nicht einmal funktioniert.

Hauke ​​Laging
quelle
5

Ich kann nur Annahmen treffen, da Sie Ihre Standardrichtlinien nicht aufgelistet haben. Gefunden oben in der Ausgabe von iptables -S. Ich gehe davon aus, dass Sie restriktiv sind und so etwas haben.

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP

Großartig! Ihr Computer ist jetzt in Bezug auf IP-Pakete völlig unsichtbar, mit verbundenen Augen, gebunden und geknebelt. Dies ist fast so gut wie das Trennen von Ihrem Ethernet-Netzwerk.

Wenn Sie also Hoffnung in dieser grausamen, dunklen Welt haben möchten, müssen Sie einige Regeln aufstellen, um einige Pakete anzunehmen, vielleicht jemanden mit einem Messer treffen, mit dem Sie Ihre Seile schneiden können, aber welche Pakete sind die richtigen?

Eine Ausgaberegel ist erforderlich, damit Pakete die Ports erreichen können, die die Server für den http / https-Verkehr verwenden

-A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Eine INPUT-Regel ist erforderlich, damit Pakete von Ports, die für den http / https-Verkehr verwendet werden, in Ihren Browser gelangen.

-A INPUT -p tcp -m multiport --sports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Jetzt können Sie über Ihren Webbrowser NEUE http / https-Verbindungen herstellen und Informationen erhalten, die über diese EINGESETZTEN Verbindungen zurückkommen.

Was ist dann das Problem? Es gibt keine Möglichkeit, DNS-Informationen abzurufen. Sie sollten in der Lage sein, die IP-Adresse der Websites, die Sie besuchen möchten, in Ihren Webbrowser einzugeben, aber genau das möchten wir nicht. Der DNS-Verkehr wird über Port 53 mit dem UDP-Protokoll verarbeitet.

-A OUTPUT -p udp --dport 53 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Und um diese praktischen Antworten zu erhalten, müssen wir noch einige Löcher in diese Augenbinde schneiden.

-A INPUT -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Jetzt gibt es etwas Licht, das Sie hören können, wenn Sie eine DNS-Abfrage an einen der Server von Google senden

dig @8.8.8.8 slashdot.org

Eine solche Antwort! Aber vielleicht kann Ihr Browser immer noch nicht herausfinden, wo sich Slashdot wirklich auf der Welt befindet. Mindestens eine Distribution (Ubuntu) ist für die Verwendung eines internen DNS-Proxys eingerichtet, sodass Sie in der Lage sein müssen, mit sich selbst zu sprechen (der Rest der Welt ist sowieso langweilig), indem Sie Regeln einrichten, auf denen Sie als Server kommunizieren können Port 53

-A OUTPUT -o lo -p udp --sport 53 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-A INPUT -i lo -p udp --dport 53 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Beachten Sie den subtilen Unterschied zwischen diesen Regeln "Ich bin mein eigener Server" und den vorherigen Regeln "Ich möchte nur die Weltregeln sehen". Auch -o lound -i lozeige an, dass dieser Server nur diese Maschine dienen, ein gutes Maß zu vermeiden , dass gesaugt in einen komplizierten DNS - Bounce - Typ Angriff.

Sie sollten jetzt sehen, dass Ihr Browser wieder funktioniert.

Drist
quelle
1

Dies hängt davon ab, ob die INPUTund / oder OUTPUTKetten auf nicht ACCEPTübereinstimmende Pakete eingestellt sind. Wenn ja, brauchen Sie überhaupt keine Regeln. Wenn Sie es nicht geändert haben, ist dies wahrscheinlich die Standardeinstellung.

Diese letzten beiden Regeln erlauben jeglichen Verkehr von oder zur loSchnittstelle (dh 127.0.0.1 / :: 1), nicht nur UDP. Sofern Sie keine Verbindung zu einem Webserver auf dem lokalen Desktop herstellen, haben diese keine Relevanz für HTTP.

David Baggerman
quelle
"Es sei denn, Sie stellen eine Verbindung zu einem Webserver auf dem lokalen Desktop her ... keine Relevanz für HTTP": Das habe ich auch. Die Standardrichtlinie lautet ACCEPT für alle IN./FORW/OUT. Die allerletzten Regeln gelten -j DROPfür IN./FORD/OUT. Es gibt jedoch etwas im Netzwerk oder auf dem Computer, für das UDP-Pakete erforderlich sind, die an die Loopback-Schnittstelle gesendet werden, damit der Internetzugang funktioniert. Ich habe die Protokolle überprüft: UDP von / nach lowurde gelöscht, und dann konnte ich nicht auf das Internet zugreifen. Der Internetzugang wird wiederhergestellt, indem tcp / udp / etc auf der Loopback-Schnittstelle zugelassen wird. Es ist komisch.
dgo.a