iptables 记录但不丢弃数据包

iptables 记录但不丢弃数据包

我正在尝试为我的 Web 服务器创建一些简单的 iptables DOS 保护规则。我正在对以下规则进行测试:

iptables -N LOGDROP > /dev/null 2> /dev/null
iptables -F LOGDROP
iptables -A LOGDROP -j LOG --log-prefix "LOGDROP "
iptables -A LOGDROP -j DROP

iptables -I INPUT -p tcp --dport 8000 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 8001 -i eth0 -m state --state NEW -m recent --set

iptables -I INPUT -p tcp --dport 8000 -i eth0 -m state --state NEW -m recent --update --seconds 1 --hitcount 4 -j LOGDROP
iptables -I INPUT -p tcp --dport 8001 -i eth0 -m state --state NEW -m recent --update --seconds 1 --hitcount 4 -j LOGDROP

我在另一台机器上创建了一个简单的脚本来执行 wget,然后休眠 0.2 秒。我在端口 8000 和 8001 启动了这个脚本,正如预期的那样,我看到 /var/log/messages 中开始出现丢弃消息:

Jul 30 20:03:57 Server kernel: LOGDROP IN=eth0 OUT= MAC=08:00:27:d5:52:24:08:00:27:6d:cf:2f:08:00 SRC=192.168.56.102 DST=192.168.56.101 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=31049 DF PROTO=TCP SPT=44071 DPT=8000 WINDOW=14600 RES=0x00 SYN URGP=0
Jul 30 20:04:00 Server kernel: LOGDROP IN=eth0 OUT= MAC=08:00:27:d5:52:24:08:00:27:6d:cf:2f:08:00 SRC=192.168.56.102 DST=192.168.56.101 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=63571 DF PROTO=TCP SPT=38876 DPT=8001 WINDOW=14600 RES=0x00 SYN URGP=0
Jul 30 20:04:00 Server kernel: LOGDROP IN=eth0 OUT= MAC=08:00:27:d5:52:24:08:00:27:6d:cf:2f:08:00 SRC=192.168.56.102 DST=192.168.56.101 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=63984 DF PROTO=TCP SPT=44075 DPT=8000 WINDOW=14600 RES=0x00 SYN URGP=0

一切似乎都很好,但当我检查 wireshark 时,我发现来自源端口 44071 的连接成功了,这意味着我看到了完整的 tcp 握手、HTTP GET 和套接字关闭。日志中的其他两个条目被成功删除,这意味着我在 wireshark 中只看到了一个 SYN 数据包。

有人知道为什么源端口 38876 上的连接会被记录为拒绝但实际上并没有被丢弃吗?

答案1

您的规则首先从 INPUT 表跳转到 LOGDROP 表,然后再跳转到 LOG 表,因此 LOGDROP 表中的最后一项永远不会被调用,因为您已经将执行移至 LOG 表。

答案2

我在查看 wireshark 时注意到,我确实看到了被阻止的流量,我的脚本只是重复使用了套接字。因此,对于我的日志中的任何被阻止的套接字条目,我都会看到多个初始 SYN。

此外,为了使上述规则有效,我需要为每行 iptable 添加 --name 属性。如果没有 --name,来自同一 IP 地址的所有连接都将计入命中数,无论它到达哪个端口。

综上所述,问题已经解决。

相关内容