У меня есть опыт использования iptables и fail2ban. Оба работают как надо, но я хотел бы оптимизировать способ "DROP" пакетов при зондировании IP и порта.
Fail2Ban успешно блокирует IP-адреса, пытающиеся получить доступ к различным портам (например, SSH, MySQL и т. д.).
Однако после блокировки IP-адреса на определенном порту (например, порту 22 для SSH) хост по-прежнему доступен по протоколу ICMP, даже несмотря на то, что Fail2Ban добавил условие «DROP - all» в iptables.
Я могу ошибаться, но мне кажется, это связано с порядком, в котором iptables считывает ЦЕПОЧКУ Fail2Ban.
Вот что iptables -L
мы видим (IP-адреса и DNS-адреса были заменены):
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
Также, вот мой iptables
файл в качестве отправной точки:
# 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
Как вы видите, есть строка, которая РАЗРЕШАЕТ ICMP:
ACCEPT icmp -- anywhere anywhere icmp any
Это сделано намеренно, поскольку мне нужно, чтобы легитимные пользователи могли пинговать определенные серверы.
Вы можете видеть в моем файле iptables, что я добавил ЦЕПОЧКУ «fail2ban-SSH» перед остальными в надежде, что она будет прочитана раньше всех остальных правил, но это не сработало.
Моя цель — ОТБРАСЫВАТЬ ЛЮБЫЕ запросы с IP-адреса, который Fail2Ban заблокировал по любой причине, включая ICMP-запросы.
Есть ли способ настроить iptables так, чтобы он считывал правила Fail2Ban раньше всех остальных ЦЕПОЧЕК и правил, чтобы я мог действительно блокировать и IP на всех портах и протоколах?
решение1
Если я правильно понял ваш вопрос, IP-адреса в вашей SSH-тюрьме должны быть заблокированы со всех портов в системе и не должны иметь возможности пинговать вас. Все остальные IP-адреса должны иметь возможность пинговать.
Чтобы запретить IP на всех портах, вам нужно настроить SSH jail для использования конфигурации действия iptables-allports. Вы можете настроить, использовать ли DROP, REJECT и т. д. в /etc/fail2ban/action.d/iptables-blocktype.conf
[sshd]
enabled = true
action = iptables-allports[name=sshd]
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 300
bantime = 7200
Если вы также хотите запретить этому конкретному IP-адресу отправлять вам запросы, но разрешить отправлять запросы всем остальным, кто не находится в SSH-зоне, вам нужно будет добавить еще одно действие в вашу SSH-зону.
- Сделайте копии iptables-allports.conf и iptables-blocktype.conf.
- Дайте файлам новые имена, например: iptables-blockping.conf и iptables-blocktype-ping.conf.
- Откройте iptables-blockping.conf и обновите раздел [INCLUDES], чтобы он указывал на iptables-blocktype-ping.conf.
- Откройте iptables-blocktype-ping.conf и измените тип блока на
REJECT --reject-with icmp-host-prohibited
.
У клеток может быть несколько действий, поэтому прямо под iptables-allports[name=sshd] укажите имя нового файла конфигурации действий, iptables-blockping.conf.
Это должно подойти для ваших целей - IP-адреса в вашей SSH-тюрьме будут иметь определенные записи в iptables для отклонения ping-запросов. Эти правила будут считываться после вашего правила, разрешающего ping-запросы.