Alle eingehenden Verbindungen mit iptables verweigern?


17

Ich möchte einige einfache iptables-Regeln erstellen, um alle eingehenden Verbindungen zu verweigern und ausgehende Verbindungen zuzulassen. Wie kann ich das machen?

Antworten:


24

Versuchen Sie dies mit root-Zugriff:

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Beachten Sie, dass dadurch alle laufenden Verbindungen brutal unterbrochen werden - dies schließt Dinge wie die SSH-Verbindung ein, die Sie zur Verwaltung des Servers verwenden können. Verwenden Sie diese Option nur, wenn Sie Zugriff auf eine lokale Konsole haben.

In der Antwort von Miphix erfahren Sie, wie Sie eine Ausnahme für SSH hinzufügen.


2
Als ich die erste Zeile der Regel tun, habe ich von SSH Verbindung unterbrochen wurde
Holme

7
Die Frage lautet "Alle eingehenden Verbindungen ablehnen" und nicht "Alle eingehenden Verbindungen mit Ausnahme von SSH ablehnen" :)
Yohann

Ich habe die Warnung von @holms über die erste Regel zu spät gelesen ...
DenisKolodin

Beachten Sie, dass dies keine Auswirkungen auf den IPv6-Verkehr hat. Lies meine Antwort unten, wenn du ipv6 aktiviert hast.
bhelm

13

Wenn Sie remote über SSH arbeiten, können Sie dies hinzufügen ( -Ifügt es vor allen anderen Regeln ein INPUT):

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

Wenn Ihr SSH-Dienst einen anderen Port überwacht, müssen Sie diesen Port anstelle von verwenden 22.

Andernfalls können Sie versehentlich den Zugriff verlieren.


2

Beachten Sie, dass die anderen Antworten nicht IPv6 abdecken! Wenn Ihr System IPv6-Datenverkehr akzeptiert, gilt für IPv6-Datenverkehr keine einzige iptables-Regel.

Anstatt iptables / ip6tables direkt zu verwenden, empfehle ich die Verwendung von iptables-restore und save. Mit diesen Tools können Sie eine iptables-Konfiguration mit mehreren Regeln angeben und diese einfach mit einem Befehl laden.

erstelle eine Datei (ich nenne sie iptables.rules) mit folgendem Inhalt:

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# commit changes
COMMIT

Hinweis: Ich habe ein zusätzliches Beispiel hinzugefügt, wenn Sie ICMP und Datenverkehr an bestimmten Ports zulassen möchten.

Jetzt können Sie es mit diesen Befehlen laden:

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

Jetzt decken Ihre Regeln auch ipv6 ab und sind einfach zu verwalten.

Zusätzlicher Hinweis für Debian-Benutzer: Wenn Sie mit Ihren Regeln zufrieden sind, können Sie apt install iptables-persistentdie Regeln nach dem Neustart wiederherstellen. Die Regeln werden beim Herunterfahren nicht automatisch gespeichert. Führen Sie sie aus netfilter-persistent save, um die beständigen Regeln zu aktualisieren.


1

Beide Antworten oben sind irgendwie korrekt, aber sie sind nicht genau genug, um die ursprüngliche Antwort zu erhalten. (Sorry, ich habe nicht genug Reputation, um einen Kommentar hinzuzufügen, also schreibe eine vollständige Antwort).

In meinem Fall traf ich einen überlasteten Apache-Server, der mit Cron-Jobs überlastet war und die CPU überlastete. Thread-Limits wurden in der SQL-Datenbank gespeichert, aber ich habe das Limit seiner Verbindungen erreicht. Ich wollte eingehende Apache-Verbindungen vom lokalen Host einschränken (dieser Teil ist optional), aber alle anderen Verbindungen sind weiterhin möglich. Einschließlich der tatsächlich errichteten.

Ich habe es mit Befehl getan

sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT

stateDies bedeutet: Laden Sie für jedes eingehende TCP-Paket auf Port 80 das Modul, und lehnen Sie es ab, wenn dies das erste Paket ist (eingehende Verbindung). Für localhost können Sie einfach verwenden-s 127.0.0.0/8

In der Praxis können Sie in einigen Fällen den Status "INVALID" hinzufügen NEW,INVALID, da Sie "böswillige" Pakete senden können, indem Sie versuchen, Ihre Regel zu umgehen. Und ersetzen -j DROPSie es auch durch , um Ihren ausgehenden Datenverkehr zu speichern (es sendet kein Ablehnungssignal).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.