Ich habe einige Erfahrung mit der Verwendung von iptables und fail2ban. Beide funktionieren wie sie sollen, aber ich möchte die Art und Weise optimieren, wie Pakete „VERLOREN“ werden, wenn IP- und Port-Prüfungen stattfinden.
Fail2Ban blockiert erfolgreich IPs, die versuchen, auf verschiedene Ports zuzugreifen (z. B. SSH, MySQL usw.).
Wenn jedoch eine IP auf einem bestimmten Port blockiert ist (z. B. Port 22 für SSH), ist der HOST weiterhin über ICMP erreichbar, obwohl Fail2Ban iptables eine „DROP - all“-Bedingung hinzugefügt hat.
Ich kann mich irren, aber ich glaube, es hat mit der Reihenfolge zu tun, in der iptables die Fail2Ban-KETTE liest.
Folgendes wird iptables -L
enthüllt (IPs und DNSs wurden ersetzt):
user@ SERVER > iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-SSH tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT all -- 10.10.10.1/25 anywhere
fail2ban-SSH all -- anywhere anywhere
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
fail2ban-SSH all -- anywhere anywhere
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere icmp any
ACCEPT esp -- anywhere anywhere
ACCEPT ah -- anywhere anywhere
ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns
ACCEPT udp -- anywhere anywhere udp dpt:ipp
ACCEPT tcp -- anywhere anywhere tcp dpt:ipp
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ftp
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain fail2ban-SSH (3 references)
target prot opt source destination
DROP all -- badip.baddomain.org anywhere
DROP all -- 299.299.299.11 anywhere
DROP all -- prober.hackers.com anywhere
RETURN all -- anywhere anywhere
Hier ist auch meine iptables
Datei als Referenz:
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:fail2ban-SSH - [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
#
#
#
-A INPUT -j fail2ban-SSH
-A FORWARD -j fail2ban-SSH
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
Wie Sie sehen, gibt es eine Zeile, die ICMP ERLAUBT:
ACCEPT icmp -- anywhere anywhere icmp any
Dies geschieht mit Absicht, da ich es benötige, dass legitime Benutzer bestimmte Server anpingen können.
Sie können in meiner iptables-Datei sehen, dass ich die KETTE „fail2ban-SSH“ vor den anderen hinzugefügt habe, in der Hoffnung, dass sie vor allen anderen Regeln gelesen wird, aber das hat nicht funktioniert.
Mein Ziel wäre es, JEDE Anfrage von einer IP zu LÖSCHEN, die Fail2Ban aus irgendeinem Grund blockiert hat, einschließlich ICMP-Anfragen.
Gibt es eine Möglichkeit, iptables so zu konfigurieren, dass die Fail2Ban-Regeln vor allen anderen KETTEN und Regeln gelesen werden, sodass ich wirklich alle Ports und Protokolle blockieren und IPs verwenden kann?
Antwort1
Wenn ich Ihre Frage richtig verstehe, sollten IPs in Ihrem SSH-Jail von allen Ports des Systems blockiert sein und Sie nicht anpingen können. Alle anderen IPs sollten anpingen können.
Um eine IP von allen Ports zu verbannen, müssen Sie Ihr SSH-Jail so einrichten, dass die Aktionskonfiguration iptables-allports verwendet wird. Sie können in /etc/fail2ban/action.d/iptables-blocktype.conf konfigurieren, ob DROP, REJECT usw. verwendet werden soll.
[sshd]
enabled = true
action = iptables-allports[name=sshd]
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 300
bantime = 7200
Wenn Sie außerdem verhindern möchten, dass diese bestimmte IP Sie anpingt, während Sie allen anderen, die sich nicht im SSH-Jail befinden, das Anpingen erlauben, müssen Sie Ihrem SSH-Jail eine weitere Aktion hinzufügen.
- Erstellen Sie Kopien von iptables-allports.conf und iptables-blocktype.conf.
- Geben Sie den Dateien neue Namen, beispielsweise: iptables-blockping.conf und iptables-blocktype-ping.conf.
- Öffnen Sie iptables-blockping.conf und aktualisieren Sie den Abschnitt [INCLUDES], sodass er auf iptables-blocktype-ping.conf verweist.
- Öffnen Sie iptables-blocktype-ping.conf und ändern Sie den Blocktyp in
REJECT --reject-with icmp-host-prohibited
.
Jails können mehrere Aktionen haben. Listen Sie daher direkt unter iptables-allports[name=sshd] den Namen Ihrer neuen Aktionskonfigurationsdatei iptables-blockping.conf auf.
Dies sollte für Ihre Zwecke funktionieren – IPs in Ihrem SSH-Jail haben bestimmte Einträge in iptables, um Ping-Anfragen abzulehnen. Diese Regeln werden nach Ihrer Regel gelesen, um Pings zuzulassen.