原文:http://bao3.pdx.cn/blog/diary,440761.html
使用Freebsd+IPFW 防小规模DDOS攻击
笔者公司共有10台Web服务器,使用Redhat Linux 9做为操做系统,分布在全国各大城市,主要为用户提供HTTP服务。曾经有一段时间很多用户反映有的服务器访问速度缓慢,甚至不能访问,检查后发现是受到了DDoS攻击(分布式拒绝服务攻击)。因为服务器分布太散,不能采用硬件防火墙的方案,虽然IPtables功能很强大,足以应付大部分的攻击,但 Linux系统自身对DDoS攻击的防护力原本就弱,只好另想办法了。
1、Freebsd的魅力
发现Freebsd的好处是在一次偶然的测试中,在LAN里虚拟了一个Internet,用一台Windows客户端分别向一台Windows Server、Linux Server和一台Freebsd在无任何防范措施的状况下发送Syn Flood数据包(常见的DDoS攻击主要靠向服务器发送Syn Flood数据完成)。Windows在达到10个包的时候就彻底中止响应了,Linux在达到10个数据包的时候开始链接不正常,而Freebsd却能承受达100个以上的Syn Flood数据包。笔者决定将公司全部的Web服务器全换为Freebsd平台。
在使用Freebsd后,的确过了一段时间的安稳日子。不过近日又有用户再次反映网站不能正常访问,表现症状为用户打开网页速度缓慢,或者直接显示为找不到网站。用netstat ?a查看到来自某IP的链接恰好50个,状态均为FIN_WAIT 1,这是属于明显的DDoS攻击,看来Freebsd没有防火墙也不是万能的啊,因而就想到了装防火墙。
看了N多资料,了解到Freebsd下最多见的防火墙叫IP FireWall,中文字面意思叫IP防火墙,简称IPFW。但若是要使用IPFW则须要编译Freebsd系统内核。出于安全考虑,在编译结束后, IPFW是默认拒绝全部网络服务,包括对系统自己都会拒绝,这下我就完全“寒”了,我放在外地的服务器可怎么弄啊?
你们这里必定要当心,配置稍不注意就可能让你的服务器拒绝全部的服务。笔者在一台装了Freebsd 5.0 Release的服务器上进行了测试。
2、配置IPFW 其实咱们彻底能够把安装IPFW看做一次软件升级的过程,在Windows里面,若是要升级一款软件,则须要去下载升级包,而后安装;在Freebsd中升级软件过程也是如此,但咱们今天升级的这个功能是系统自己已经内置了的,咱们只须要利用这个功能便可。打开这个功能以前,咱们还要作一些准备工做。
下面开始配置IPFW的基本参数。
Step1:
准备工做
在命令提示符下进行以下操做:
#cd /sys/i386/conf
若是提示没有这个那说明你的系统没有安装ports服务,要记住装上。
#cp GENERIC ./kernel_IPFW
Step2:
内核规则
用编辑器打开kernel_IPFW这个文件,在该文件的末尾加入如下四行内容:
options IPFIREWALL
将包过滤部分的代码编译进内核。
options IPFIREWALL_VERBOSE
启用经过Syslogd记录的日志;若是没有指定这个选项,即便你在过滤规则中指定了记录包,也不会真的记录它们。
options IPFIREWALL_VERBOSE_LIMIT=10
限制经过Syslogd记录的每项包规则的记录条数。若是你受到了大量的攻击,想记录防火墙的活动,但又不想因为Syslog洪水通常的记录而致使你的日记写入失败,那么这个选项将会颇有用。有了这条规则,当规则链中的某一项达到限制数值时,它所对应的日志将再也不记录。
options IPFIREWALL_DEFAULT_TO_ACCEPT
这句是最关键的。将把默认的规则动做从 “
deny
” 改成 “
allow
”。这句命令的做用是,在默认状态下,IPFW会接受任何的数据,也就是说服务器看起来像没有防火墙同样,若是你须要什么规则,在安装完成后直接添加就能够了。
输入完成后保存kernel_IPFW文件并退出。
3、编译系统内核 因为Freebsd和Linux同样,都是公开源代码的操做系统,不像Windows那样代码是封装了的,出了问题咱们只能猜想,或者咨询微软公司;因为Freebsd系统内核在不断升级,咱们为了使用新版本中的功能,或者定制一个更高效、更稳定的系统,一般须要编译系统内核。
固然,咱们在这里编译内核,是为了能获得一个更高效的系统,而不是使用新版本的功能;
在编译的过程当中,可能会提示一些错误,为了尽量减小错误提示,咱们已将配置文件缩减到了最少,若是再出现什么错误提示,请仔细检查是否有输入错误等细小问题。所需的命令
在命令行上执行以下命令:
#/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
Step2
:开始编译内核
根据系统性能差别,时间也有不一样,普通双P4 XEON 1GB内存的服务器大约5分钟左右便可完成。
4、加载启动项
编译完成了,咱们要让系统自动启动IPFW并记录日志,须要进行以下操做:
Step1:编辑器编辑/etc/rc.conf
加入以下参数:
firewall_enable=`YES`
激活Firewall防火墙
firewall_script=`/etc/rc.firewall`
Firewall防火墙的默认脚本
firewall_type=`/etc/ipfw.conf`
Firewall自定义脚本
firewall_quiet=`NO`
启用脚本时,是否显示规则信息;假如你的防火墙脚本已经不会再有修改,那么就能够把这里设置成“YES”了。
firewall_logging_enable=`YES`
启用Firewall的Log记录
Step2:编辑/etc/syslog.conf文件
在文件最后加入以下内容:
!ipfw
*.* /var/log/ipfw.log
这行的做用是将IPFW的日志写到/var/log/ipfw.log文件里,固然,你也能够为日志文件指定其余目录。
以上步骤完成后重启电脑。
5、使用并保存规则
完成后,你就会发现你能用SSH登陆你的远程服务器了。
Step1:测试
刚登陆的时候你不会发现你的系统发生了什么变化,但你能够试试如下这个命令:#ipfw show,将输出如下结果:65535 322 43115 allow ip from any to any。它告诉咱们,IPFW已经成功启用,并且容许任何的链接。
Step2:使用
在命令提示符下输入以下命令:#ipfw add 10001 deny all from 218.249.20.135 to any。
拒绝来自218.249.20.135的任何服务,执行完成后,你就会发现来自IP218.249.20.135的全部服务都会被拒绝。
Step3:保存
把这句代码加在/etc/rc.firewall文件里:ipfw add 10001 deny all from 218.249.20.135 to any,运行以下这个命令:#sh /etc/rc.firew
all
表示保存到rc.firewall里面时,不须要前面的#号,而后从新载入IPFW规则。
或者重启一次你的系统,你的IPFW就生效了,只要你不手动解除,来自218.249.20.135的全部信息所有都会被拒绝。