首页 »Unix/FreeBsd » ddos防火墙:基于freebsd5.3下 PF synproxy的DDOS防范方案(... »正文ddos防火墙:基于freebsd5.3下 PF synproxy的DDOS防范方案(...来源: 发布时间:星期二, 2008年12月9日 浏览:2次 评论:0
出自http://shidongxue.blogdriver.com/shidongxue/699924.html
[Copy to clipboard] [ - ] CODE:基于freebsd5.3下 PF synproxy的DDOS防范方案- - 基于freebsd下 PF synproxy的DDOS防范方案 [摘要] 本文讲述了基于freebsd5.3 下PF synproxy的DDOS防范方案,对于中小型企业抵挡每秒3万个包的攻击不失为一种可用方案。 [环境] 防火墙:台式机P4 2G,512内存。 FREEBSD5.3 WEB服务器:笔记本PIII 700 256m, suse linux enterprise server 9 攻击机器:笔记本:PIII 700 256M, WIN2000 SERVER 攻击工具:HGOD v0.4 测试机:笔记本:PIII 700 拓朴: ===== 防火墙:xl0 外网卡:172.16.0.1; sis0 内网卡:192.168.100.1 WEB服务器:eth0 192.168.100.2 攻击机:172.16.0.194 测试机:172.16.0.195 一、编译内核 #cd /usr/src/sys/i386/conf #cp GENERIC billy-pf #vi billy-pf 添加: device pf device pflog device pfsync options ALTQ options ALTQ_CBQ # Class Bases Queuing (CBQ) options ALTQ_RED # Random Early Detection (RED) options ALTQ_RIO # RED In/Out options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC) options ALTQ_PRIQ # Priority Queuing (PRIQ) options ALTQ_NOPCC # Required for SMP build #config billy-pf #cd ../compile/billy-pf #make depend;make make install 二、编辑启动脚本/etc/rc.conf pf_enable="YES" # Enable PF (load module if required) pf_rules="/etc/pf.conf" # rules definition file for pf pf_flags="" # additional flags for pfctl startup pflog_enable="YES" # start pflogd(8) pflog_logfile="/var/log/pflog" # where pflogd should store the logfile pflog_flags="" # additional flags for pflogd startup gateway_enable="YES" 三、修改/etc/pf.conf ext_if="xl0" int_if="sis0" internal_net="192.168.100.1/24" external_addr="172.16.0.1" web_server="192.168.100.2" nat on $ext_if from $internal_net to any ->; ($ext_if) #($ext_if) 括起来的原因:如果你使用DHCP还配置外部地址,不括起来会存在问题。如果你分配的IP地址改变了,NAT仍然会使用旧的IP地址转换出去的数据包。这会导致对外的连接停止工作。为解决这个问题,应该给接口名称加上括号,告诉PF自动更新转换地址。 rdr on $ext_if proto tcp from any to $external_addr/32 port 80 ->; $web_server port 80 #这一行重定向了TCP端口80(web服务器)流量到内部网络地址$web_server。因此,即使$web_server在网关后面的内部网络,外部仍然能够访问它。 pass in on $ext_if proto tcp from any to $web_server port 80 flags S/SA synproxy state #连到外部地址的80端口,作SYNPROXY,以防DDOS攻击 四、修改192.168.100.2的网关IP为192.168.100.1 五、修改/etc/sysctl.conf net.inet.ip.forwarding=1 使防火墙进行IP转发 重启 六、测试 攻击前先访问http://172.16.0.1/index.html,正常打开了WEB服务器上的主页 攻击: 往防火墙的外部IP172.16.0.1的80端口发动DDOS攻击。 hgod 172.16.0.1 80 观察WEB服务器192.168.100.2上的80端口连接情况和收到的包数。 统计防火墙上受攻击强度(包/每秒)。 speed.sh #!/bin/sh oldval=0 curval=0 while true do curval=`netstat -i | grep xl0 | head -1 | awk '{print $5}' if [ $oldval = 0 ]; then old=$curval else echo `date`" pkg inbound rate on xl0: $(($curval-$oldval)) pps" oldval=$curval fi sleep 1 done ` 七、测试结果 DDOS攻击下,防火墙接收到的包速率为:2.6万-2.8万个包每秒 在PF的保护下,仅DDOS攻击时,WEB服务器没有收到一个包,说明防火墙全挡住了非法包。 去掉SYNPROXY的保护,即最后一条规则时,WEB服务器收到的包速成率与防火墙收到的包相当。访问WEB服务器时被拒绝。 在PF保护下,WEB_server的访问正常。 结论: 基于PF的防DDOS攻击对于每秒3万个包以下的攻击抵挡效果出色。对于更大流量的攻击,有待进一步测试。 进一步的工作: 结合ALTQ中RED算法的连接耖尽攻击防范。 尽管对于非法IP的拦截PF可以大显身手,但对于完整TCP连接的消耖攻击,同样非常重要,下一篇将讲述如何利用RED(Random Early Detection)算法来适当保护合法用户。利用二八原则来区分用户的合法性。在表面上区分不了连接的合法性时,只能作适当的牺牲,牺牲突然前来地访问的用户。 作为保护服务器的不停机运行的第三把利剑,还可结合负载均衡来增强WEB服务器的高可用性. ##################write by zjzf_1####################### pf的synproxy 实现在nat 上 这可不是 个好的选择 低效呀 而且要改变网络拓扑 我粗略的看了看pf 发表点看法 不当之处希望高手指出 pf对每一个连接要用struct pf_state这个数据结构保存连接状态 pf通过调用RB_FIND RB_INSETR... ...完成对连接状态表的操作(openbsd/src/sys/tree.h) 这是一个树形结构好像叫什么red-black trees 我要说的是 我觉得 对防火墙这种 实时要求比较高的东西上 我觉得这种做法不是很妥当 我建议用hash 分段 来处理这个问题 以上两点 我个人认为 是pf synproxy 不怎么样的关键原因 我个人实在ethernet bridge上面实现的 效果还不错哈 已经有产品出了 ###########加精后修改################## 我上面 只是借转载文章粗略的说了一下pf的synproxy 如果朋友们愿意 深入讨论这不 0
相关文章
读者评论
发表评论 |