
Gibt es eine Möglichkeit, die Iptables-Regeln zu aktualisieren, um eine Verbindung zu blockieren, ohne sie neu starten zu müssen?
Hier ist ein Beispiel für das Verhalten, das ich vermeiden möchte:
On shell#1: I start a ping command 8.8.8.8
On shell#2: I block ping command with iptables rules.
On shell#1: The ping command is still working and I get replies from 8.8.8.8,
but if I end the ping command and I restart it, now it will not work.
Ich würde gerne wissen, ob es eine Möglichkeit gibt, den Ping-Befehl zu blockieren, ohne ihn neu starten zu müssen.
Antwort1
1) Was Sie fragen, ist die einfachste Möglichkeit, um iptables
zu arbeiten - blockieren Sie den gesamten Verkehr zu einem Ziel unabhängig vom Verbindungsstatus, sodass bestehende Verbindungen eine Zeitüberschreitung erfahren. In Ihrem Beispiel
iptables -I OUTPUT -d 8.8.8.8 -j DROP
blockiert sofort UDP- (DNS), ICMP- (Ping) und TCP-Pakete, die 8.8.8.8 erreichen. Das scheint also Ihre Antwort zu sein. Wenn Sie das beschriebene Verhalten feststellen, posten Sie die von Ihnen verwendete iptables-Befehlszeile.
2) Wenn Sie das andere Verhalten wünschen, also bestehende Verbindungen aufrechtzuerhalten, bis der Prozess neu gestartet wird, haben Sie folgende Möglichkeiten:
iptables -I OUTPUT -d 8.8.8.8 -m state --state NEW -j DROP
oder
iptables -I OUTPUT -d 8.8.8.8 -p tcp --syn -j REJECT
3) Im fortgeschrittenen Fall, in dem Sie eine bestehende TCP-Verbindung tatsächlich so schnell wie möglich schließen möchten, anstatt sie zu blockieren und sie ablaufen zu lassen, könnten Sie vielleicht etwas -j REJECT --reject-with tcp-reset
in den Eingabe- und Ausgabeketten basieren oder tcpkill
einige Sekunden lang laufen lassen. Dies ist schwierig, und in fast allen Fällen möchten Sie die Verbindung mit Lösung 1) trennen.