几乎所有的主机平台都有抵御DDoS的设置。以Linux操作系统为例,其防范技术主要分为三大类,第一类是通过合理配置系统,达到资源最优化和利用最大化,第二类是通过加固TCP/IP协议栈来防范DDoS;第三类是通过防火墙、路由器等过滤网关,有效地探测攻击类型并阻击攻击。
必须明确的是,DDoS攻击在TCP连接原理上是合法的,除非TCP协议重新设计, 明确定义DDoS和其他正常请求有何不同,否则不可能完全阻止DDOS攻击,我们所做的只是尽可能地减轻DDoS攻击的危害。
1.服务器设置
除了防范他人攻击外, 也要提防不要成为被人利用的对象。可以通过以下方法来实现:
◆ 安全配置系统,杜绝攻击漏洞,及时安装系统补丁程序;
◆ 关闭不必要的服务,并优化服务;
◆ 有规律地查看日志;
◆ 利用工具检查文件完整陛
2.加固TCP/IP协议栈
这里通过修改TCP/IP参数来控制连接资源的利用。
◆ SYN cookies技术
限制同时打开的SYN 半连接数。
以Red Hat Linux为例,通过在启动环境中设置以下命令来启用SYN cookies
#echo 1> /proc/sys/net/ipv4/tcp_syncookies
也可以通过修改其他参数,或者使用/proc/sys/net/ipv4/netfilter/ip_contrack_*来实现。
◆ 增加最大半连接数
加大未连接队列空间。
Linux 使用变量tcp-max-syn_backlog来定义backlog队列容纳的最大半连接数。在Red Hat Linux中,该变量的默认值为256,在RHEL AS Linux中则是1024。该数值是远远不够的,一次强度不大的SYN攻击就能使半连接队列占满。通过以下命令可以修改此变量值:
#sysctl -W net.ipv4.tcp_max_syn_backlog="2048"
◆ 缩短SYN半连接的Timeout时间
Red Hat Linux使用变量tcP_synack_retries定义重传次数,其默认值是5,总超时时间需要3分钟。
#sysctl -W net.ipv4.tcp_synack_retries="0"
◆ 及时更新系统补丁
可以添加如下脚本到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攻击的效果,必须更具所处的网络环境来设置参数。
◆ SYN 网关:SYN网关的原理是代替客户端发送ACK消息,然后转发数据。SYN网关收到服务器的SYN/ACK包后,将该包转发给客户端,同时以客户端的名义给服务器发ACK确认包。此时,服务器由半连接状态进入连接状态。当客户端确认包到达时,如果有数据则转发,否则丢弃。一般服务器所能承受的连接数量比半连接数量要大得多,所以这种方法能有效地减轻对服务器的攻击。
◆ 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状态
REPEAT_CONNECT_NUM='grep $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
fi
done
#统计所有状态为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地址,时间可以根据具体网络连接情况设置。

文章如转载,请注明转载自:http://www.5iadmin.com/post/339.html