Letztes Update am
Erweitert Sommer 2019: IPTABLES ist ein Programm zur Administration von Firewalls, ist schon im Linux-Kern verankert und muss also nicht gesondert installiert werden. Mit iptables werden Hacker und Spammer vom Zugriff auf den Server ausgeschlossen.
Alle IP-Adressen in den IPTABLES mitsamt Zeilennummern anzeigen, die momentan gesperrt sind
iptables -L INPUT -n --line-numbers
Ports, die nicht gebraucht werden, von vorn herein sperren oder einen Port für eine IP-Adresse sperren
+-- Regel am Ende anhängen +-- Abweisen ohne Meldung | | iptables -A INPUT -p tcp --dport telnet -j DROP +-- Regel an Position 22 einfügen | iptables -I INPUT 22 -s 200.87.0.0/16 -p tcp --destination-port ssh -j DROP | +-- für ganzen IP-Bereich sperren
Zugriffe für ganze Nummernkreise sperren
Eine einzelne IP-Adresse zu sperren macht wenig Sinn, denn Hacker kommen mit einer ganzen Batterie von gehackten Rechnern und greifen mit 10, 20 und noch mehr IP-Adressen an. Bei Angriffen aus China oder anderen Ländern, aus denen wir unter Garantie keine interessierten Besucher, sondern überwiegend Hackversuche erwarten, kann gleich ein ganzer IP-Nummernkreis ausgeschlossen werden.
iptables -A INPUT -s xxx.xxx.xxx.0/24 -j DROP iptables -A INPUT -s xxx.xxx.0.0/16 -j DROP iptables -A INPUT -s xxx.0.0.0/8 -j DROP
Fail2Ban
IPTABLES ist erst einmal Handarbeit: Die IP-Adresse der Angreifer aus den Log-Dateien fischen und sperren. Automatisch geht das mit Fail2Ban:
maxfailures = 3 bantime = 900 findtime = 600
Per Voreinstellung entdeckt Fail2Ban drei missglückte Login-Versuche seitens einer IP innerhalb von 600 Sekunden (findtime). Die IP-Adresse wird automatisch für 900 Sekunden gesperrt.
2019: Das große Botnetz mit mehr als 3000 IP-Adressen
Das gilt natürlich auch für WordPress-Plugins wie WordFence. Die aktuelle (Juli 2019) Angriffswelle eines Botnetz wird zwar scheinbar von WordFence anhand des Browser-Strings erkannt, aber WordFence blockiert den Angreifer nur für eine bestimmte Zeitspanne.
Allerdings sind die angreifenden Bots auch nicht dumm: Sie greifen nicht mit einer IP an, sondern mit 50, 100 und jetzt im Sommer 2019 mit über 3000 IP-Adressen an. Dieses Botnetz läßt sich viel Zeit zwischen zwei Login-Versuchen von einer individuellen IP, um der Fail2Ban-Falle zu entgehen. Wenn ein Angreifer ein solches Netz von IPs befehligt, bringt Fail2Ban nur bedingten Schutz. Ein regelmäßiger Blick in die Logdateien und weiträumiges Ausschließen per IPTABLES ist eine zusätzliche Sicherungsmaßnahme.
Ein leerer Referrer-String und immer derselbe Browserstring:
"-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
Und ein aktueller Browserstring Anfang 2021 – ebenfalls mit einem leeren Referrer-String:
"-" "Mozilla/5.0(Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"
Ban Hackers listet Angreifer mit ihrer IP und dem Browserstring.
IPTABLES
-p, -- protocol | Die Regel (TCP, UDP usw) |
-s, -- source | Kann eine Adresse, ein Netzwerkname, ein Hostname usw. sein |
-d, -- destination | Kann eine Adresse, ein Netzwerkname, ein Hostname usw. sein |
-j, -- jump | Aufgabe der Regel, z.B. was tun, wenn ein Paket erwischt wird |
-g, --goto chain | Ausführung wird in einer Kette (Chain) fortgesetzt |
-i, --in-interface | Benennt das Interface, von dem die Pakete empfangen werden. |
-o, --out-interface | Name des Interface, das die Pakete sendet. |
-f, --fragment | Regel wird nur auf das zweite und weitere Fragmente von fragmentierten Paketen angewendet |
-c, --set-counters | Initialisiert das Paket und einen Byte Counter der Regel |
ACCEPT
Zuerst das Rein und Raus auf Port 80 (http) und 443 (https) generell akzeptieren.
iptables -I INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -I OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT iptables -I INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT iptables -I OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
-I fügt die Regel am Anfang ein, statt sie mit -A am Ende einzufügen.
Bestimmte IP-Adressen zum Login durchlassen – einloggen müssen sich die IP-Adressen natürlich dennoch.
iptables -I INPUT 3 -p tcp -s xxx.xxx.xxx.xxx --dport 22 -j ACCEPT
Portnummer oder Service
Wird der Port oder der Service in iptables nicht aufgeführt, werden alle Ports für die IP oder den IP-Bereich gesperrt. Wenn die Liste der gesperrten IP-Adressen länger wird, führt die Prüfung zu längeren Verbindungszeiten auch für Port 80. Also setzt man besser den Port oder den Service in die iptables-Regel ein:
iptables -A INPUT -s 216.212.240.141 -p tcp --destination-port 25 -j DROP
sperrt Port 25 (Email) für den Spammer auf der IP-Adresse.
iptables -I INPUT -s 192.168.1.100 -p tcp --dport ssh -j REJECT
sperrt ssh (einloggen) für die angeführte IP-Adresse
Einlog-Versuche auf SMTP Port 465 können z.B. so aussehen:
SSL_accept error from mail.shealytruck.com[64.53.45.177]: lost connection
Multiport: Port 25 und Port 465 mit einer Anweisung sperren
iptables -A INPUT -s 64.53.45.177 -p tcp -m multiport --dports smtp,ssmtp -j DROP
oder via Portnummern
iptables -A INPUT -s 204.79.180.0/24 -p tcp -m multiport --dports 25,465,587,143,993,110,995 -j DROP
<
Zugriff auf einen IP-Bereich
iptables -A INPUT -m iprange --src-range 74.125.229.164-74.125.229.174 -j DROP
Hereinkommende HTTP-Anfragen erlauben
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
25 Most Frequently Used Linux IPTables Rules Examples
DROP oder REJECT
Werden Pakete mit REJECT verworfen, beendet TCP die Verbindung und lässt den Absender wissen, dass die Verbindung fehlgeschlagen ist.
Das Ablehnen mit DROP hingegen gibt keine Informationen zurück, sondern hält den Absender für mindestens 100 Sekunden fest.
IPTABLES Regel löschen
iptables -D INPUT 4
um Regel no. 4 zu löschen. Vorher den Index mit iptables -L INPUT -n –line-numbers abfragen.
iptables-Regeln können auch über die IP gelöscht werden. Die Regel muss konform zur vorangegangenen Regel für das Einsetzen gehen.
+-- Append - setzt die Regel | iptables -A INPUT -s 107.174.236.78 -p tcp --destination-port 25 -j DROP iptables -D INPUT -s 107.174.236.78 -p tcp --destination-port 25 -j DROP | +-- Delete – löscht die Regel
IPTABLES speichern und wiederherstellen
iptables-save > dateiname iptables-restore dateiname oder iptables-restore -c < dateiname
IPTABLES leeren
iptables -F
Das Sperren einzelner IPs und selbst von großen Nummernkreisen ist eine kurzfristige Lösung, denn Angriffe kommen nicht von einer einzelnen IP, auch nicht aus einem Nummernkreis, sondern die Gefahr rührt aus den Bot-Netzen, die mit 50, 100 oder noch mehr IP-Nummern eine statische Liste von IPs ins Abseits setzen.
Iptables Recent
Recent, ein Modul von IPTABLES, zählt TCP-Verbindungsversuche und kann eine IP blockieren, wenn eine bestimmte Zahl von Verbindungen innerhalb einer bestimmten Zeit beobachtet wird. Allerdings kann Recent nicht zwischen erfolgreichen und nicht erfolgreichen Versuchen unterscheiden.
Drei Versuche innerhalb von 60 Sekunden kann man z.B. erlauben und alles darüber als einen Brute Force-Angriff ansehen. Aber selbst mit zwei Versuchen pro Minute kann ein Angreifer immer noch fast 3000 Passwörter pro Tag testen. Bei SSH-Zugriffen könnte ein Limit von 30 Versuchen innerhalb von 24 Stunden bessere Dienste leisten, aber diese Strategie kann einen Überraschungsangriff nicht abfangen, denn es dauert einen Tag, bis Recent die IP sperrt.
Nur eine neue SSH-Verbindung pro IP innerhalb von 5 Sek zulassen
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set --name sshattack iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 5 --hitcount 2 -j DROP
recent zählt TCP-Verbindungsversuche mit und blockiert ab einem Schwellwert weitere Angriffe von einer IP-Adresse.
- –set schreibt die IP-Adresse einer Verbindung auf Port 22 mit einem Zeitstempel in die Proc-Datei /proc/net/ipt_recent/DEFAULT.
- –update fügt einen weiteren Zeitstempel ein und prüft, ob zwei Zeitstempel innerhalb der letzten 60 Sekunden liegen.
iptables zeitlich begrenzen
Das geht nicht. Stattdessen kann man sich behelfen mit
iptables -I INPUT -s 85.25.226.171 -j DROP echo "iptables -D INPUT -s 85.25.226.171 -j DROP" | at @10pm
oder einen Kommentar setzen und die Regeln von Zeit zu Zeit prüfen, ob die IP (z.B. bei Spam von einer IP-Adresse) wieder zugelassen werden soll:
iptables -A INPUT -s 85.25.226.171 -p tcp --destination-port 25 -j DROP -m comment --comment "2016-11 PlusServerAG"
Iptables bei Email-Attacken einsetzen
Ich sehe zunehmend Brute-Force-Email-Attacken, die dem Server eine große Last auferlegen. Die Versuche, Zugriff auf Emailkonten zu erlangen, können nicht ohne weiteres mit dem gleichen Schema abgefangen werden. Während sich reguläre Benutzer via SSH eher selten innerhalb kurzer Zeitfenster einloggen, holen die meisten Benutzer ihre Emails in Abständen von 5 Minuten ab.
iptables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --set iptables -A INPUT -p tcp --dport 25 -m state --state NEW -m recent --update --seconds 180 --hitcount 3 -j DROP
Vielleicht lieber nicht nur für Port 25, sondern gleich
iptables -A INPUT -p tcp -m multiport --dports 25,110,143,993,995 -m state --state NEW -m recent --set iptables -A INPUT -p tcp -m multiport --dports 25,110,143,993,995 -m state --state NEW -m recent --update --seconds 180 --hitcount 3 -j DROP
Wird –name nicht angegeben, wird automatisch in DEFAULT geloggt.
Mit cat /proc/net/ipt_recent/DEFAULT bzw. /proc/net/xt_recent/DEFAULT prüft man, ob schon wer gefangen wurde.
src=217.160.252.130 ttl: 118 last_seen: 35221479277 oldest_pkt: 3 35216241084, 35221479277, 35221479277
Dabei kommen Login-Versuche und Mail-Attacken immer noch durch – klar, der erste und zweite Versuch. Und obendrein: Angreifer benutzen Bot-Netze mit einer ganzen Reihe von IP-Adressen und jede IP hat zwei Versuche frei. Mail-Attacken lassen sich nicht wirkungsvoll mit IPTABLES abwehren, allenfalls vielleicht ein wenig mildern.
SSH vor brute-force-Angriffen schützen
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
Explain Shell schön gemacht
cidr / vlsm supernet calculator IP-Bereich berechnen
Quelle Block SSH Brute Force Attacks with IPTables
Quelle IPTables für CentOS
How to block unwanted IP addresses on Linux efficiently IP sets sind ein Kernel Feature, das mehrere unabhängige IP-Adressen, Mac-Adressen und selbst Portnummern kodiert und speichert.
Block SSH Brute Force Attacks with IPTables
How to Block SSH and FTP Access to Specific IP and Network Range in Linux
Prüfen, ob eine IP bereits auf einer Blacklist steht
Am Rande
Wenn ich feststelle, dass meine IP-Adresse in einer Blacklist auftaucht, Postfix pausieren mit
postfix stop
ein paar Sekunden warten
mailq
und den user / host zu finden.
Geht aber auch in Plesk: Tools and Settings / Mail Mailserver Settings / Mail Queue
Links zu Hacker ausschließen – Ban
Ban Hackers listet wöchentlich Angreifer auf seine Webseite mit Browserstring und IP