iptables 多端口和否定

iptables 多端口和否定

我想使用 iptables 记录所有可能泛滥的内容,但 Web 和 IRC 端口除外。所以我这样做了:

iptables -A INPUT -p tcp -m multiport ! --dports 80,443,6667,6697 -m hashlimit --hashlimit-above 10/sec --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-name aflood --hashlimit-srcmask 8 -j LOG --log-prefix "[IP FLOOD ALL]"
iptables -A INPUT -p udp -m multiport ! --dports 80,443,6667,6697 -m hashlimit --hashlimit-above 10/sec --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-name aflood --hashlimit-srcmask 8 -j LOG --log-prefix "[IP FLOOD ALL]"
iptables -A INPUT -p icmp -m hashlimit --hashlimit-above 10/sec --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-name aflood --hashlimit-srcmask 8 -j LOG --log-prefix "[IP FLOOD ALL]"

但是当我查看日志时,我得到(MAC 和 IP 混淆):

Aug  3 16:49:00 server kernel: [IP FLOOD ALL]IN=eth0 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=107 TOS=0x00 PREC=0x00 TTL=61 ID=6765 DF PROTO=TCP SPT=6667 DPT=40605 WINDOW=10818 RES=0x00 ACK PSH URGP=0
Aug  3 16:49:00 server kernel: [IP FLOOD ALL]IN=eth0 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=104 TOS=0x00 PREC=0x00 TTL=61 ID=54214 DF PROTO=TCP SPT=6667 DPT=49484 WINDOW=10815 RES=0x00 ACK PSH URGP=0
Aug  3 16:50:00 server kernel: [IP FLOOD ALL]IN=eth0 OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:00:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=40 TOS=0x00 PREC=0x00 TTL=60 ID=9024 DF PROTO=TCP SPT=80 DPT=36729 WINDOW=123 RES=0x00 ACK FIN URGP=0

您可以看到 SPT 具有我通常保护的值 (6667 和 80)。

有人知道这个问题吗?

答案1

这些数据包是从与外部 IRC 服务器建立的连接返回的(它们来自源端口 6667)。您的设置旨在仅解除对入站 IRC 连接的限制(入站目标端口 6667 等)。

答案2

回答:日志文件中显示的所有数据包都完全符合防火墙规则。您的规则从未尝试匹配来源端口。

那么,日志文件告诉了您什么?要么您的机器与其他服务器保持有效连接,要么有人向您的机器发送欺骗数据包。正如其他评论中所建议的,您的机器很可能已经与其他 irc 服务器建立了传出连接,并且记录的数据包是来自这些服务器的答案。

以下是我得到答案的方法:我刚刚把你的规则扔进了哎呀并稍微手动调整了输出。我将您的LOG操作重写为,ACCEPT并将默认策略重写为,以查看简化DROP后将接受(即编辑)什么。LOG

这是规则集简化后的输出,所有端口上的否定匹配都重写为非否定匹配。由于我之前用 替换了LOGACCEPT下面防火墙接受的所有内容也将被我们的原始规则集记录下来:

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0    dports: 0:79
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0    dports: 81:442
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0    dports: 444:6666
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0    dports: 6668:6696
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0    dports: 6698:65535
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0    dports: 0:79
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0    dports: 81:442
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0    dports: 444:6666
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0    dports: 6668:6696
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0    dports: 6698:65535
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0    
DROP       all  --  0.0.0.0/0            0.0.0.0/0

现在,您可以轻松地将日志文件中的数据包与这个简化的防火墙进行匹配。它们全部匹配。

免责声明:我是哎呀,我的观点可能有偏见,哎呀还不完美(目前)。但是嘿,它是免费的,我希望它能有所帮助 :-)


可重复性

以下是我所做的详细操作,如果你想重现的话:

我将LOG操作重写为ACCEPT,使用iptables-save格式并将其保存为foo.txt

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -p tcp -m multiport ! --dports 80,443,6667,6697 -m hashlimit --hashlimit-above 10/sec --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-name aflood --hashlimit-srcmask 8 -j ACCEPT
-A INPUT -p udp -m multiport ! --dports 80,443,6667,6697 -m hashlimit --hashlimit-above 10/sec --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-name aflood --hashlimit-srcmask 8 -j ACCEPT
-A INPUT -p icmp -m hashlimit --hashlimit-above 10/sec --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-name aflood --hashlimit-srcmask 8 -j ACCEPT
COMMIT

然后我就运行fffuu --chain INPUT foo.txt以获取上面的输出。

(fffuu 仍在开发中,我使用 fffuu fb858bcf95268451772ca9156a04b9fc229d3578 的 repo 开发快照发表此评论)

相关内容