更改读取 IPTABLE CHAIN 的顺序(使用 Fail2Ban)

更改读取 IPTABLE CHAIN 的顺序(使用 Fail2Ban)

我有一些使用 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。

相关内容