Wie lassen sich iptables-Regeln auslaufen?

18

Jemand sagte mir, dass dies möglich ist, aber ich kann nichts auf Google oder Manpages finden.

Ich muss IPs für eine bestimmte Zeit sperren und habe sie dann automatisch wieder freigegeben.

HappyDeveloper
quelle

Antworten:

18

Wenn Sie möchten, dass iptables die Regel von sich aus vollständig entfernt, können Sie dies meines Wissens nicht tun. Was ist der Zweck davon? Wenn Sie eine Art automatisches temporäres Sperren benötigen, ist die Standardlösung fail2ban .

Alternativ können Sie einen Cron-Job verwenden, um die Regel zu entfernen, die Sie hinzufügen, oder besser, wenn Sie dies interaktiv tun möchten, einen atJob:

iptables -I INPUT -s 192.168.1.100 -j DROP
echo "iptables -D INPUT -s 192.168.1.100 -j DROP" | at @10pm 

Schauen Sie sich auch das recentModul von iptables an. Dies kann mit seiner --secondsOption hilfreich sein, abhängig von Ihren tatsächlichen Bedürfnissen. man iptablesfür mehr Informationen.

Eduardo Ivanec
quelle
oh wow der at job sieht toll aus. Kann ich es mit nohup und & kombinieren? Wie?
HappyDeveloper
Nohup muss nicht verwendet werden - der at-Job wird unabhängig von dem Terminal ausgeführt, mit dem Sie ihn erstellt haben. Dies bedeutet, dass es in einer Shell ausgeführt wird, die Ihre Umgebungsvariablen übrigens nicht erbt, und dass dies /bin/shstandardmäßig der Fall ist . Aber das wird in diesem Fall wahrscheinlich kein Problem sein.
Eduardo Ivanec
9

Fügen Sie einen Kommentar mit einem Zeitstempel (wahrscheinlich Sekunden seit der Epoche) in die Regeln ein. Wischen Sie regelmäßig nach abgelaufenen Regeln.

Beachten Sie, dass der neueste Linux-Kernel das dynamische Laden von IP-Adressen in einen Cache unterstützt, der von iptable-Regeln anstatt von direkten iptables-Regeln abgerufen wird.

Beispiel:

iptables  -A INPUT -s 192.168.200.100/32 -m comment --comment "expire=`date -d '+ 5 min' +%s`" -j DROP 
iptables -L INPUT -n --line-numbers | tac | perl -ne 'next unless /(^\d+).*expire=(\d+)/; if ($2 < time) { print "iptables -D INPUT $1\n"; }'

Sie können iptables -D INPUT $1den Befehl natürlich auch ausdrucken, anstatt ihn zu drucken.

Seth Robertson
quelle
großartige Idee. Ich bin mir jedoch nicht sicher, wie ich das Fegen machen soll.
HappyDeveloper
+1 Sehr gute Idee, vielleicht nicht die einfachste, aber auf jeden Fall ordentlich.
Kyle Smith
1
@ HappyDeveloper: Beispiel für add / sweep bereitgestellt
Seth Robertson
1
Haha, ich musste das auch tun, ich habe awk für meine Aufräumarbeiten verwendet: iptables -L FORWARD --line-numbers | sort -r | awk 'substr($8,1,4) == "exp@" && substr($8,5) < systime() { systems("iptables -D FORWARD " $1) }'wo Regeln festgelegt sind wie:iptables -A FORWARD -j DROP -m comment --comment "exp@EPOCH"
Kyle Smith
Meine 2 Cent in Perl:iptables -L FORWARD --line-numbers | tac | perl -walne 'system "iptables -D FORWARD $F[0]" if $F[-2] =~ /^expire=(\d+)$/ and $1<time()'
Tuomassalo
5

iptables bietet eine Methode zum automatischen Hinzufügen von IP-Adressen zu einer Liste, wenn benutzerdefinierte Bedingungen erfüllt sind. Ich verwende Folgendes, um automatisierte Hackversuche auf meinen ssh-Port zu vermeiden:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name ssh --seconds 60 --reap -j DROP

Auf diese Weise können Sie automatisierte Versuche, auf den Server zuzugreifen, einschränken, indem Sie die Verbindungsversuche von derselben IP-Adresse auf einen Versuch alle 60 Sekunden beschränken.

Wenn Sie eine festgelegte Anzahl von Versuchen in einem Zeitrahmen zulassen möchten, z. B. 4 in 5 Minuten, und diese bei einem Fehler für einen längeren Zeitraum, z. B. 24 Stunden, auf die schwarze Liste setzen möchten, können Sie Folgendes tun:

iptables -X black
iptables -N black
iptables -A black   -m recent --set   --name blacklist   -j DROP

iptables -X ssh
iptables -N ssh
iptables -I ssh 1   -m recent --update    --name blacklist   --reap   --seconds 86400     -j DROP
iptables -I ssh 2   -m recent --update    --name timer       --reap   --seconds   600     --hitcount 4   -j black
iptables -I ssh 3   -m recent --set       --name timer   -j ACCEPT

iptables -A INPUT   -p TCP --dport ssh   -m state --state NEW -j ssh

Oben erstellen wir 2 Ketten; "ssh" und "black" und 2 Listen; "timer" und "blacklist".

Kurz; Die letzte oben gezeigte Kette ist das "Tor" zur SSH-Kette.

  • Regel 1 in der SSH-Kette überprüft, ob sich die Quell-IP in der Liste "Blacklist" befindet. In diesem Fall wird die Verbindung getrennt und der 24-Stunden-Blacklist-Timer neu gestartet. Wenn Regel 1 falsch ist, fahren wir mit Regel 2 fort.
  • Regel 2 in der SSH-Kette überprüft, ob die Quell-IP innerhalb von 5 Minuten mehr als 4 Verbindungsversuche unternommen hat. Wenn ja, sendet es das Paket an die Kette "black", wo es der Liste "blacklist" hinzugefügt wird. Die Kette "schwarz" löscht dann die Verbindung und wir sind fertig.
  • Regel 3 in der Kette "ssh" wird nur erreicht, wenn die Regeln 1 und 2 falsch sind. In diesem Fall wird das Paket AKZEPTIERT und die Quell-IP zur Liste "Timer" hinzugefügt, damit wir die Häufigkeit der Verbindungsversuche überwachen können.

Die Option "--reap" weist den Kernel an, die Liste zu durchsuchen und alle Elemente zu löschen, die älter als das festgelegte Zeitlimit sind. 5 Minuten für die Liste "Timer" und 24 Stunden für die Liste "Blacklist".

Hinweis: Die zusätzlichen Leerzeichen dienen der Lesbarkeit und sind in Ihrem Shell-Skript optional.

Tal
quelle
3

IPTables hat eine eigens dafür vorgesehene Funktion: IP-Set. Sie erstellen die Regel einmal und sie bleibt wie gewohnt bestehen, prüft jedoch eine Reihe von IPS (oder Ports) auf Übereinstimmungen. Das Tolle ist, dass dieses Set dynamisch und effizient aktualisiert werden kann, ohne den Rest der Firewall zu stören.

Die Hauptwebsite , Beispiele .

Um es zu verwenden, müssten Sie immer noch die Entfernung verwenden atoder cronplanen.

Allen
quelle
2

Sie können fail2ban verwenden, um IP-Adressen zu sperren und den Zeitraum zu konfigurieren, für den eine Adresse gesperrt wird.

user9517 unterstützt GoFundMonica
quelle
2

Wie schon jemand sagte: Du solltest ipset für diese Funktion verwenden.

ipset kann eine IP-Adresse mit einem Timeout-Wert hinzufügen. Wenn die Zeitüberschreitung endet, wird der Datensatz automatisch aus ipset entfernt.

timeout All set types supports the optional timeout parameter when creating a set and adding entries. The value of the timeout parameter for the create command means the default timeout value (in seconds) for new entries. If a set is created with timeout support, then the same timeout option can be used to specify non-default timeout values when adding entries. Zero timeout value means the entry is added permanent to the set. The timeout value of already added elements can be changed by readding the element using the -exist option. Example: ipset create test hash:ip timeout 300 ipset add test 192.168.0.1 timeout 60 ipset -exist add test 192.168.0.1 timeout 600

http://ipset.netfilter.org/ipset.man.html

Dies ist eine bevorzugte Methode, um dieses Verhalten zu steuern.

Navern
quelle
0

Ich muss IPs für eine bestimmte Zeit sperren und habe sie dann automatisch wieder freigegeben.

Sie könnten das folgende versuchen

# iptables -I INTPUT -s xxx.xxx.xxx.xxx -m time --utc --datestart 2013-09-09T15:00 --datestop 2013-09-09T15:30 -j DROP
ALex_hha
quelle
0

Je nachdem, was genau Sie erreichen möchten, können entweder die Module netfilter recent oder time verwendet werden, um dies zu erreichen.

Beide sind in der Manpage von iptables dokumentiert .

TimS
quelle