防范DDoS 攻击
几乎所有的主机平台都有抵御DDoS 的设置。以Linux 操作系统为例,其防范技术主要分为3 大类:第一类是通过合理配置系统,达到资源最优化和利用最大化;第二类是通过加固TCP/IP 协议栈来防范DDoS ;第三类是通过防火墙、路由器等过滤网关,有效地探测攻击类型并阻击攻击。
必须明确的是,DDoS 攻击在TCP 连接原理上是合法的,除非TCP 协议重新设计,明确定义DDoS 和其他正常请求有何不同,否则不可能完全阻止DDoS 的攻击,我们所做的只是尽可能地减轻DDoS 攻击所带来的危害。
1. 服务器设置
除了防范他人攻击外,也要提防不要成为被人利用的对象。可以通过以下方法来实现:
(1)安全配置系统,杜绝攻击漏洞,及时安装系统补丁程序。
(2)关闭不必要的服务,并优化服务。
(3)有规律地查看日志。
(4)利用相关工具检查文件完整性。
2、加固TCP / IP 协议栈
这里通过修改TCP / IP 参数来控制连接资源的利用。
(1)SYN Cookies 技术
限制同时打开的SYN半连接数。以RedHat Linux 为例,通过在启动环境中设置以下命令来启用SYN Cookies :
- #echo 1> /proc/sys/net/ipv4/tcp_
- syncookies
也可以通过修改其他参数, 或者使用/proc/sys/net/ipv4/netfilter/ip_contrack_* 来实现。
(2)增加最大半连接数
加大未连接队列空间。Linux 使用变量tcp-max-syn_backlog 来定义backlog 队列容纳的最大半连接数。在RedHat Linux 中,该变量的默认值为256,在RHEL AS Linux中则是1024。该数值是远远不够的,一次强度不大的SYN 攻击就能使半连接队列占满。通过以下命令可以修改此变量值:
- #sysctl -W net.ipv4.tcp_max_syn_
- backlog="2048"
(3)缩短SYN 半连接的Timeout 时间
RedHat Linux 使用变量tcP_synack_retries 定义重传次数,其默认值是5,总超时时间需要3 分钟。
- #sysctl -W net.ipv4.tcp_ synack_
- retries="0"
(4)及时更新系统补丁
可以添加如下脚本到Linux 的/etc/sysctl.conf 文件,重启后会自动启动,达到防御DDoS 的效果。
- ## add by geminis for syn crack
- net.ipv4.tcp_syncookied=1
- net.ipv4.tcp_max_syn_backlog="2048"
- net.ipv4.tcp_synack_ retries="1"
3. 防火墙防御
在网关超时设置处,将防火墙SYN 转发超时参数设置为小于服务器的Timeout。如果客户端在防火墙的Timeout时间内无响应,防火墙将发送终止RST 消息给服务器,使服务器从队列中删除该半连接,节省开销。
需要注意的是,网关超时参数设置不宜过小也不宜过大,超时参数设置过小会影响,正常的通信,设置过大则会影响防范SYN drome 攻击的效果,必须根据所处的网络环境来设置参数。
(1)SYN 网关:SYN 网关的原理是代替客户端发送ACK 消息,然后转发数据。SYN 网关收到服务器的SYN/ACK 包后,将该包转发给客户端,同时以客户端的名义给服务器发ACK 确认包。此时,服务器由半连接状态进入连接状态。当客户端确认包到达时,如果有数据则转发,否则丢弃。一般服务器所能承受的连接数量比半连接数量要大得多,所以这种方法能有效地减轻对服务器的攻击。
(2)SYN 代理:当客户端SYN 包到达过滤网关时,SYN 代理并不转发SYN 包,而是以服务器的名义主动回复SYN+ACK 包给客户。收到客户的ACK 包表明是正常访问,此时防火墙向服务器发送ACK 包,并完成三次握手。这里的防火墙作为独立的服务器,需要有较强的抵抗DDoS 攻击的能力。使用专用NP(网络处理器)及专用操作系统的高档防火墙都会具备这种功能。
- #!/bin/sh
- #定义变量
- MAX_TOTAL_SYN_RECV="1000"
- MAX_PER_IP_SYN_RECV ="20"
- MARK="SYN_RECV"
- #定义链接状态为"SYN_ RECV"
- PORT="80"
- LOGFILE="/var/og/netstat_$MARK-
- $PORT"
- LOGFILE_IP="/var/log/netstat_
- connect_ip.log"
- DROP_IP_LOG="/var/log/netstat_syn_
- drop_ip.log"
- #iptables初始化,拒绝非法包和不明状态包
- ,允许请求包和已连接的包进入
- iptable -F -t filter
- iptable -A INPUT -p TCP --syn -m
- stat --state NEW -j DROP
- iptables -A INPUT -p ALL - m state
- --state INVALID -j DROP
- iptables -A INPUT -p ALL -m state
- -state ESTABLISHED,RELATED -j ACCEPT
- #初始化变量
- if [-z $MARK];then
- MARK="LISTEN"
- fi
- if [-z $PORT];then
- SPRT="tcp"
- else
- SPORT=":$PORT"
- fi#
- end
- #保存netstat结果到指定记录文件中便于分析
- netstat -atun|grep $MARK |grep
- $SPORT 2>/dev/null >$LOGFILE
- if [-s $DROP_IP_ LOG]; then
- for i in `less$DROP_IP_ LOG|awk
- '{print $1}`;
- do
- /sbin/iptables -A INPUT -p ALL -s
- $i -j DROP
- done
- fi
- for i in 'less $LOGFILE_ IP';
- #统计同一IP的SYN-RECV状态
- R E P E A T _ C O N N E C T _ N U M = ' g r e p $ i
- $LOGFILE|wc -l
- #如果超过预设的统一IP连接数,则拒绝此IP连
- 接包进入
- if [$REPEAT_CONNECT_ NUM -gt $MAX_
- PER_IP_SYN_RECV];then
- echo "$I $REPEAT_ CONNEC_NUM" >>
- $DROP_ IP_LOG
- iptables -A INPUT -p ALL -s $i -j
- DROP
- fid
- one
- #统计所有状态为SN_ RECV的数据包,如果数
- 量超过预设则重置状态
- ALL_CONNETC='uniq -u $LOGFILE|wc -l '
- echo $ALL_CONNECT
- if [$ALL_CONNECT -gt $MAX_TOTAL_
- SYN_ REC];then
- echo $ALL_CONNECT
- exit
- fi
该脚本一旦发现有恶意连接的IP 地址后,会马上生效,利用Iptables 命令阻止该IP 地址的任何请求,直到管理员手动去除为止。但是这种做法在某些情况下显得过于严格,因为该IP 也可能是一个公共出口。
解决方法是再配合一个释放IP,运行于cron 服务中,设置成每隔一段时间自动从Iptables 规则中去掉该IP 地址,时间可以根据具体网络连接情况设置。
【责任编辑: 云霞 TEL:(010)68476606】 |