我有一些使用 iptables 和 fail2ban 的经验。两者都正常工作,但我想优化在进行 IP 和端口探测时“丢弃”数据包的方式。
Fail2Ban 在阻止试图访问各种端口(例如 SSH、MySQL 等)的 IP 方面做得很好。
但是,一旦 IP 在特定端口(即 SSH 的端口 22)上被阻止,即使 Fail2Ban 已向 iptables 添加了“DROP - all”条件,仍然可以通过 ICMP 访问 HOST。
我可能错了,但我认为这与 iptables 读取 Fail2Ban CHAIN 的顺序有关。
揭示的内容如下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
这样做是故意的,因为我需要合法用户能够 ping 某些服务器。
您可以在我的 iptables 文件中看到,我在其他链前面添加了“fail2ban-SSH”链,希望它能在所有其他规则之前被读取,但这并没有起作用。
我的目标是删除任何因任何原因被 Fail2Ban 阻止的 IP 的请求,包括 ICMP 请求。
有没有办法配置 iptables 来读取 Fail2Ban 规则(在所有其他 CHAINS 和规则之前),以便我可以真正地阻止所有端口和协议上的 IP?
答案1
如果我理解正确的话,SSH jail 中的 IP 应该被系统上的所有端口阻止,并且无法 ping 你。所有其他 IP 都应该能够 ping。
要禁止某个 IP 使用所有端口,您需要设置 SSH jail 以使用 iptables-allports 操作配置。您可以在 /etc/fail2ban/action.d/iptables-blocktype.conf 中配置是否使用 DROP、REJECT 等
[sshd]
enabled = true
action = iptables-allports[name=sshd]
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 300
bantime = 7200
如果您还想阻止此特定 IP 对您进行 ping 操作,同时允许不在 SSH jail 中的任何人进行 ping 操作,则需要向您的 SSH jail 添加另一个操作。
- 复制 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 并将 blocktype 更改为
REJECT --reject-with icmp-host-prohibited
。
Jails 可以有多个操作,因此在 iptables-allports[name=sshd] 下方直接列出新操作配置文件的名称 iptables-blockping.conf。
这应该可以满足您的目的 - 您的 SSH jail 中的 IP 将在 iptables 中具有特定条目以拒绝 ping 请求。这些规则将在您的规则之后读取以允许 ping。