我正在使用“最近”模块来防止端口扫描,例如:
-A INPUT -i eth0 -m recent --name PORTSCAN --update --seconds 60 -j DROP
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -m recent --name PORTSCAN --set -j DROP
该--update
选项与其名称相反(即用新值更新旧值),不会更新最后看到的条目,而是添加另一个条目。在我的简单设置中,我只对最后一个条目感兴趣。我不需要看到的数据包的整个历史记录(即用于统计)。
有没有办法,我只能保留最后看到的数据包?曾经有一个选项--reap
,但据我所知已被删除。
我担心的是,在繁忙的服务器上,PORTSCAN 列表可能会很快变得相当大。我不知道限制是什么,但我确信一定有限制。
答案1
如果您查看 iptables 的手册页,特别是recent
模块部分,有几个参数看起来可以为您提供所需的控制:
摘自 iptablesrecent
模块部分
模块本身接受参数,默认显示:
ip_list_tot=100 Number of addresses remembered per table. ip_pkt_list_tot=20 Number of packets per address remembered.
recent
因此,根据这两个参数,您可以控制模块将“记住”的IP地址数量和数据包数量。
请记住,这是一个内核模块,因此要应用这些设置,您需要在模块加载时设置它们,如下所示:
/sbin/modprobe ipt_recent ip_list_tot=2000 ip_pkt_list_tot=255
在我的 Fedora 14 系统上,该模块实际上被调用xt_recent
,您可以使用以下命令查看它可以采用哪些类型的参数modinfo
:
$ modinfo xt_recent
filename: /lib/modules/2.6.35.14-106.fc14.x86_64/kernel/net/netfilter/xt_recent.ko
alias: ip6t_recent
alias: ipt_recent
license: GPL
description: Xtables: "recently-seen" host matching
author: Jan Engelhardt <[email protected]>
author: Patrick McHardy <[email protected]>
srcversion: 00B9A3AB999488BFEB4FA6A
depends:
vermagic: 2.6.35.14-106.fc14.x86_64 SMP mod_unload
parm: ip_list_tot:number of IPs to remember per list (uint)
parm: ip_pkt_list_tot:number of packets per IP address to remember (max. 255) (uint)
parm: ip_list_hash_size:size of hash table used to look up IPs (uint)
parm: ip_list_perms:permissions on /proc/net/xt_recent/* files (uint)
parm: ip_list_uid:default owner of /proc/net/xt_recent/* files (uint)
parm: ip_list_gid:default owning group of /proc/net/xt_recent/* files (uint)
检查 xt_recent 设置
该模块的所有设置都保存在/sys/module/xt_recent
.具体来说,您传递给它的参数保存在这里:
$ ls -1 /sys/module/xt_recent/parameters/
ip_list_gid
ip_list_hash_size
ip_list_perms
ip_list_tot
ip_list_uid
ip_pkt_list_tot
任何参数都可以通过简单地cat'ing此目录中的文件来检查,例如:
cat /sys/module/xt_recent/parameters/ip_pkt_list_tot
所以这告诉我们参数的默认值为ip_pkt_list_tot
20。
答案2
除了上面给出的答案之外,我建议您在 PORTSCAN 陷阱之前填充一个额外的 BADGUYS 表,并使用它来防止溢出后者。
然后,当触发 PORTSCAN 时,向 BADGUYS 表添加一条记录。
像这样的东西:
-A INPUT --name PORTSCAN --rcheck --seconds 60 --reap --hits 20 -j set_bad
-A INPUT --name BADGUYS --rcheck --seconds 3600 --reap -j noway
-A INPUT <trap case> --name PORTSCAN --set
-A set_bad --name BADGUYS --set
-A noway -p tcp -j REJECT --reject-with tcp-reset
-A noway -j DROP