Truman Boyes零与一

存档 · 新闻

ipfw 防火墙与 ICMP 限速

作者:Truman Boyes · · 2 分钟阅读

我很高兴能够让 FreeBSD 的 ipfw 防火墙对 ICMP 进行速率限制,并且基本上已经在最近的服务器上应用了一套基本的过滤规则。

已经有一段时间没有花太多时间做系统管理或真正的 Unix 工作了。如今我倾向于远离这些东西,因为它们已经不像以前那样让我感兴趣。不过,偶尔我仍会发现一些古怪的配置或程序,它们是很好的挑战,可以让我动手搭建并学习。

我想为这台服务器学习 IPFW 是值得的,因为它也是 OS X 自带的防火墙。(我不确定 DUMMYNET 内核选项是否包含在 OSX/Darwin 的通用内核中)……

如果你在使用 FreeBSD,看看 /etc/rc.firewall,了解它是如何处理一系列选项的。基本上它会从 /etc/rc.conf 读取定义;这些选项决定了防火墙的类型。例如,它可以是独立的盒子、NAT 路由器,或者保护整个子网的防火墙。对我而言,我只是把防火墙规则套用到一台互联网服务器上。

我最终修改了 /etc/rc.firewall 以满足我的需求,虽然大多数人可能会自己编写规则文件,然后交给 ipfw 使用。我打开了必要的端口,然后拒绝其它所有流量。

随后我想到 ICMP,在模板中没有任何关于它的说明。制定一套关于 ICMP 的策略可能是合理的。我认识到 ping 的用处,虽然过去我对 ping 的过滤相当严格,但这次我决定对它进行速率限制而不是直接过滤。

添加了一段速率限制规则,例如:

#Rate Limit ICMP
${fwcmd} pipe 1 config bw 5Kbit/s queue 5Kbytes
${fwcmd} add pipe 1 icmp from 1.1.1.1/32 to any frag
${fwcmd} add pipe 1 icmp from any to 1.1.1.1/32 frag

${fwcmd} pipe 2 config bw 10Kbit/s queue 10Kbytes
${fwcmd} add pipe 2 icmp from 1.1.1.1/32 to any
${fwcmd} add pipe 2 icmp from any to 1.1.1.1/32

我本以为系统现在会允许 ICMP 通过,只是进行速率限制。然而 ICMP 完全没有通过,但每条规则的统计数据似乎在累加。随后在执行 ipfw pipe 1 show 时收到了严重错误信息,我才发现自己遗漏了非常重要的东西。

我的内核没有编译进 DUMMYNET 选项,所以 ipfw 中的速率限制功能不可用。我跑到 /usr/src/sys/i386/conf/;把 GENERIC 内核复制成我服务器的名字,然后在内核配置里加入以下行:

options IPFIREWALL
options DUMMYNET
options HZ=1000

随后我配置内核,编译,安装新内核并重启。成功!

/t/


最初发表于 truman.net。查看存档副本。