Freebsd+IPFW结合使用防小规模DDOS攻击的配置方法
程序员文章站
2022-06-18 11:02:50
使用Freebsd+IPFW 防小规模DDOS攻击笔者公司共有10台Web服务器,使用Redhat Linux 9作为操作系统,分布在全国各大城市,主要为用户提供HTTP服务。曾经有一段时间不少用户反映有的服务... 13-05-25...
由于服务器分布太散,不能采用硬件防火墙的方案,虽然iptables功能很强大,足以应付大部分的攻击,但 linux系统自身对ddos攻击的防御力本来就弱,只好另想办法了。
一、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的服务器上进行了测试。
二、配置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文件并退出。
三、编译系统内核 由于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 installstep2:开始编译内核
根据系统性能差异,时间也有不同,普通双p4 xeon 1gb内存的服务器大约5分钟左右即可完成。
四、加载启动项
编译完成了,我们要让系统自动启动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文件里,当然,你也可以为日志文件指定其他目录。
以上步骤完成后重启电脑。
五、使用并保存规则
完成后,你就会发现你能用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的所有信息全部都会被拒绝。
一、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的服务器上进行了测试。
二、配置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文件并退出。
三、编译系统内核 由于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 installstep2:开始编译内核
根据系统性能差异,时间也有不同,普通双p4 xeon 1gb内存的服务器大约5分钟左右即可完成。
四、加载启动项
编译完成了,我们要让系统自动启动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文件里,当然,你也可以为日志文件指定其他目录。
以上步骤完成后重启电脑。
五、使用并保存规则
完成后,你就会发现你能用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的所有信息全部都会被拒绝。
上一篇: 机器学习实战之决策树算法学习心得(下)
下一篇: BIOS常见词语小结