我想使用 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
这是规则集简化后的输出,所有端口上的否定匹配都重写为非否定匹配。由于我之前用 替换了LOG
,ACCEPT
下面防火墙接受的所有内容也将被我们的原始规则集记录下来:
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 开发快照发表此评论)