Ziel dieses Skripts ist es, nur Datenverkehr über das VPN zuzulassen, mit Ausnahme von localhost <-> localhost und eingehendem SSH-Datenverkehr. Aber wenn ich das Skript über SSH ausführe, werde ich getrennt und gezwungen, die VM neu zu starten. Was ist los mit meinem Skript?
#!/bin/bash
iptables -F
#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT
#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT
#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
Ihre
#SSH
Regel impliziert, dass ssh eine Einwegkommunikationsform ist, die es nicht ist. Daten werden hin und zurück gesendet .Der normale Weg, um damit umzugehen, besteht darin, Verbindungen zuzulassen, die als "hergestellt" oder "verwandt" mit einer hergestellten Verbindung gelten , da Sie die Portnummer auf der Clientseite nicht im Voraus kennen . Dazu benötigen Sie:
Vor Ihren
DROP
Regeln (und vorzugsweise ganz oben, da die Regeln in der richtigen Reihenfolge verarbeitet werden und diese beiden für die meisten Pakete gelten).Es gibt eine Erklärung, wie eine TCP - Verbindung wird hier ; Im Wesentlichen
#SSH
INPUT
macht es die Tatsache, dass der Server auf das von Ihrer Regel zugelassene Paket antwortet, so.quelle
-p tcp
, einen Unterschied in diesem Sinne zu machen, und die nachfolgende Erklärung für UDP auf dieser Seite gelesen (es ist dieselbe). Der Punkt ist, dass der Server antwortet, ohne zu wissen, ob iptables dies zulässt oder nicht, und wenn iptables diese Antwort vom Server auf dem lokalen System empfängt, hat er jetzt Datenverkehr in beide Richtungen gesehen (obwohl der Client dies noch nicht getan hat) Die Verbindung wurde hergestellt und die Antwort wird ausgegeben. Die "Technik" hängt davon ab, dass sich die Firewall in der Mitte der beiden Parteien befindet.