我有一个带有自定义防火墙脚本和Fail2ban的虚拟机。
我已经确定了一些会进行永久入侵尝试的 IP 范围,因此我直接在防火墙脚本中阻止了它们。以下是简化的概述:
#!/bin/sh
### BEGIN INIT INFO
# Provides: Custom firewall
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short Description: Firewall init script
# Description: Custom firewall
### END INIT INFO
## Lock everything
# Clear current tables
iptables -t filter -F
iptables -t filter -X
# Deny all connexions (input and output)
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
## Common configurations
# Preserve established connexions
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Allow loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
# Allow ICMP (ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
## Custom rules
# SSH
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
# HTTP
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
## JAIL
iptables -A INPUT -s 61.147.80.0/24 -j DROP
iptables -A INPUT -s 61.167.49.0/24 -j DROP
iptables -A INPUT -s 61.174.50.0/24 -j DROP
iptables -A INPUT -s 61.174.51.0/24 -j DROP
iptables -A INPUT -s 103.41.124.0/24 -j DROP
iptables -A INPUT -s 122.225.97.0/24 -j DROP
iptables -A INPUT -s 122.225.103.0/24 -j DROP
iptables -A INPUT -s 122.225.109.0/24 -j DROP
Fail2ban 运行良好,但令我惊讶的是,它仍然检测到来自被禁止 IP 的尝试,因为122.225.109.107
它们应该被我的防火墙脚本禁止。这怎么可能呢?
答案1
数据包按照规则出现的顺序通过 iptables 规则。
您在规则集末尾禁止了所提到的 IP,并且在禁止之前,您接受了到端口 80 和 ssh 22 的所有流量。因此,您的禁止规则没有捕捉到。
您应该让 fail2ban 管理禁止,因为他将禁止规则放在 iptables 规则集的开头,或者将您的禁止规则放在脚本的开头,使用命令将iptables -I INPUT 1 rule
规则放在集合中的第一个规则之前。
并且由于您有 DROP 的默认策略,因此将带有 DROP 目标的规则放在规则集末尾是没有用的。