FreeBSD+IPFW防小规模DDoS攻击配置方法
FreeBSD的优势,是在一次偶然的局域网测试中发现的。当时模拟了一个互联网环境,用一台Windows客户端分别向Windows Server、Linux Server和一台FreeBSD发送Syn Flood数据包——这是DDoS攻击中最常用的手段。测试结果令人意外:Windows这边,仅10个数
FreeBSD的优势,是在一次偶然的局域网测试中发现的。当时模拟了一个互联网环境,用一台Windows客户端分别向Windows Server、Linux Server和一台FreeBSD发送Syn Flood数据包——这是DDoS攻击中最常用的手段。测试结果令人意外:Windows这边,仅10个数据包就导致系统瘫痪;Linux呢?10个包,连接开始出现异常;而FreeBSD却硬生生扛住了100个以上的攻击包。这一表现当时确实让人眼前一亮。很快,这个方案被全面采纳,公司所有Web服务器都换成了FreeBSD平台。
换上FreeBSD后,安稳日子确实过了一阵。不过好景不长,近期又有用户反映网站访问不正常,症状是页面加载缓慢,甚至直接显示“找不到网站”。用 netstat -a 查看,发现来自某个IP的连接正好是50个,状态清一色全是 FIN_WAIT 1——典型的DDoS攻击特征。看来,没有防火墙的FreeBSD也并非万能,于是安装防火墙再次提上日程。
翻阅大量资料后发现,FreeBSD下最常见的防火墙是IP FireWall,简称IPFW。但问题在于,要启用IPFW,必须先编译系统内核。而且出于安全考虑,IPFW在刚编译出来时,默认会拒绝所有网络服务——包括对系统本身的访问。这就麻烦了:外地的服务器,总不能伸手够得着吧?这里需要特别提醒,配置稍不注意,就可能让服务器拒绝一切服务。测试是在一台安装了FreeBSD 5.0 Release的服务器上进行的。
二、配置IPFW
其实,可以把安装IPFW理解成一次软件升级。在Windows里升级软件,无非是下载安装包然后运行;在FreeBSD里也类似,只不过这次要启用的功能是系统自带的,只需要把开关打开。但在打开之前,还得做些准备工作。
下面进入配置环节。
第一步:准备工作
在命令提示符下执行以下操作:
# cd /sys/i386/conf
如果提示没有这个目录,说明系统没安装ports服务,需要先装上。
# cp GENERIC ./kernel_IPFW
第二步:内核规则
用编辑器打开 kernel_IPFW 文件,在末尾加入以下四行内容:
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=10
options IPFIREWALL_DEFAULT_TO_ACCEPT
简单解释一下这些选项的作用:
- options IPFIREWALL:把包过滤部分的代码编译进内核。
- options IPFIREWALL_VERBOSE:启用通过Syslogd记录的日志。如果不加这一项,就算在规则里设置了记录,也不会真的记下来。
- options IPFIREWALL_VERBOSE_LIMIT=10:限制每条规则通过Syslogd记录的条数。如果服务器正遭受攻击,防火墙日志会大量生成,这个选项能防止日志刷爆系统。
- options IPFIREWALL_DEFAULT_TO_ACCEPT:这一句是关键。它把默认规则从“拒绝”改成了“允许”。也就是说,在默认状态下,IPFW就像不存在一样,接受一切数据。待安装完成,再根据需要添加具体规则。
保存文件并退出。
三、编译系统内核
FreeBSD和Linux一样,都是开放源代码的操作系统,不像Windows那样代码是封死的。系统内核一直在迭代升级,为了使用新功能或定制更高效的系统,通常需要编译内核。在这里编译的目的,是得到一个更稳定、性能更好的系统,而不是非要追求新版本功能。
编译过程中可能会遇到一些错误提示。为了减少报错,配置文件已经尽可能精简了。如果还有提示,就仔细检查一下有没有拼写错误之类的小问题。
接下来在命令行执行:
# /usr/sbin/config kernel_IPFW
执行完后会看到这样的提示:
Kernel build directory is ../compile/kernel_IPFW
Don't forget to do a `make depend`
# cd ../compile/kernel_IPFW
这里要注意:FreeBSD 4.x 版本是 ../../compile/kernel_IPFW,而 FreeBSD 5.0 版本则是 ../compile/kernel_IPFW,路径不同。
# make
# make install
编译时间取决于系统性能,双P4 Xeon、1GB内存的服务器大约5分钟左右就能完成。
四、加载启动项
编译完成后,还需要让系统在启动时自动运行IPFW并记录日志。
第一步:编辑 /etc/rc.conf
加入以下参数:
firewall_enable="YES" # 激活防火墙
firewall_script="/etc/rc.firewall" # 防火墙默认脚本
firewall_type="/etc/ipfw.conf" # 防火墙自定义脚本
firewall_quiet="NO" # 是否显示规则信息;如果规则不再改动,可设为"YES"
firewall_logging_enable="YES" # 启用日志记录
第二步:编辑 /etc/syslog.conf
在文件末尾加入:
!ipfw
*.* /var/log/ipfw.log
这条规则的作用是把IPFW的日志写入 /var/log/ipfw.log,当然也可以指定其他路径。
完成以上步骤后,重启系统。
五、使用并保存规则
重启后,你会发现已经可以用SSH登录远程服务器了。
第一步:测试
刚登录时可能感觉不到什么变化。但试着运行一下:
# ipfw show
会看到类似这样的输出:
65535 322 43115 allow ip from any to any
这说明IPFW已经成功启用,并且目前允许所有连接。
第二步:使用
在命令提示符下输入:
# ipfw add 10001 deny all from 218.249.20.135 to any
这条命令会拒绝来自IP 218.249.20.135 的所有服务。执行之后,来自这个IP的任何请求都会被拦下。
第三步:保存
把上面的规则添加到 /etc/rc.firewall 文件中:
ipfw add 10001 deny all from 218.249.20.135 to any
注意,保存到 rc.firewall 时,前面不要加#。然后运行:
# sh /etc/rc.firewall
这个命令会重新载入IPFW规则。或者直接重启系统,IPFW就会生效。只要不手动解除规则,来自 218.249.20.135 的所有信息都会被拒绝。
