Ich verwende IPTables auf einem API-Server, um den gesamten eingehenden Datenverkehr mit Ausnahme von SSH, HTTP und HTTPS zu blockieren. Ich muss vollen Zugriff auf die Loopback-Schnittstelle haben, um beanstalkd
unter anderem ausgeführt zu werden, und ausgehende http-, https- und SSH-Zugriffe für API-Aufrufe anderer Dienste sowie das Abrufen von github benötigen.
Ich habe die Regeln wie folgt erstellt:
iptables -F
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
iptables -A INPUT -p tcp --dport http -j ACCEPT
iptables -A INPUT -p tcp --dport https -j ACCEPT
iptables -A INPUT -j DROP
iptables -L
Ausgänge:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
ACCEPT tcp -- anywhere anywhere tcp dpt:https
DROP all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Trotzdem git pull
kann der Server nicht gefunden werden, Ping bei Google funktioniert nicht und Mailgun wird nicht gesendet. Das Ausführen iptables -F
behebt diese Probleme, und ich kann es mir nicht leisten, eine Firewall zu haben, die meine Anwendung nur daran hindert, vollständig zu funktionieren ...
Wie kann ich erreichen, was ich oben versuche?
-S
nicht-L
viele Informationen verwendet, da das "freundliche" Format viele Informationen auslässt.Antworten:
Das ist ganz offensichtlich, wenn Sie darüber nachdenken:
Das Pingen von Google funktioniert nicht, da Sie keine Regel haben, die eingehende ICMP-Antworten zulässt.
Die Dinge können den Server nicht "finden", weil Sie keine Regel haben, die DNS-Antworten erlaubt.
Mailgun kann SMTP nicht sprechen, da Sie keine Regel haben, die SMTP-Pakete zulässt - die TCP-SYN erlischt, aber die entsprechende SYN / ACK wird verworfen.
Die allgemeine Lösung besteht darin, das Verbindungs-Tracking von netfilter (auch "conntrack" genannt) zu verwenden, um eine Regel zu erstellen, die alle Pakete zulässt, die aktiven Verbindungen entsprechen:
(Ältere Dokumentationen sind möglicherweise
-m state
veraltet.)Und natürlich,
denn warum würdest du das blockieren?
quelle