DDoS攻击难于防范,但是防范DDoS也不是绝对不可行的事情。本文从DDoS的原理入手,从网络管理员、ISP/ICP管理员和骨千网络运营商等不同角度详细说明如何检查和防范Linux下的DDoS攻击。到目前为止,进行分布式拒绝服务攻击(DDoS)的防御还是比较困难的。因为这种攻击的特点是利用TCP/IP协议的漏洞。除非不用TCP/IP,才有可能完全抵御DDoS攻击。即使DDoS难于防范,我们也不应该“逆来顺受”。实际上,防范DDoS也不是绝对不可行的事情。
一、DDoS攻击原理
俗话说:“知己知彼,百战百胜。”要想理解分布式拒绝服务攻击的概念, 我们首先了解一下何谓是DoS攻击。最基本的DoS攻击通过操纵单台攻击机连接服务器,利用TCP连接的三次握手原理,发出大量合理但非正常的请求来占用过多的服务器资源,从而导致服务器无法N-为其他用户提供正常服务。随着现代计算机硬件与网络技术的飞速发展,CPU 的处理能力迅速增长,大容量(G级)内存的普及, 以及千兆级网络的出现,使得目标机器对恶意攻击包的“消化能力”大大加强。因此,现在几乎没有人再用DoS这种单打独斗的攻击方法。
DDoS是DoS攻击的加强,如果把DoS比喻为“单挑”,那么DDoS就像是“群殴”。DDoS的攻击原理与DoS类似,但是相对于DOS攻击,DDoS需要更多的准备工作。首先,它会在攻击目标之前在网络上收集足够多的“有漏洞机器” (俗称“肉鸡”)作为攻击机, 能力强的甚至可以在已经控制的一级“肉鸡” 中扩大收集更多有漏洞的机器, 形成如图1

图1  DDOS攻击示意图
所示的、具有多级主从关系的攻击链。一旦发起攻击,所有可利用的攻击机器会同时对目标服务器展开进攻,攻击规模大,破坏力更强。最为可恶的是,攻击者并不在乎这些“肉鸡”的暴露, 即使“肉鸡” 被追踪、破坏或无法使用,他总可以找到更多的替代品。
DDoS的兴起与网络的高速发展密切相关。高速连接的网络虽然给大家交流信息带来了方便, 同时也为DDoS攻击创造了极为有利的条件。利用便捷的网络,攻击者可以更大程度地寻找和控制世界各地有漏洞的机器, 而且保证其速度。由于分布范围广,管理员追踪的难度也更高。
自问世以来,DoS衍生出多种形式。这里只详细介绍在网络上使用频繁、也最流行的攻击方法TCP-SYN Flood的攻击原理和防范措施。
前面提到DoS攻击会发出大量合理但非正常的请求,为什么请求可以是合理的却是非正常的呢?我们知道, 每当进行一次标准的TCP连接,例如W WW 浏览或下载文件,TCP、IP中的TCP协议将提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送SYN包(syn:x)到服务器,并进入SYN-SEND状态,等待服务器确认。
第二次握手: 服务器收到SYN 包,必须确认客户的SYN(ACk=X+1), 同时发送一个SYN 包(syn=y), 即SYN+ACK 包, 此时服务器进入SYN-RECV状态。
第三次握手: 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态。
完成三次握手后,一次成功的TCP连接由此建立,可以展开后续工作了(如图2中的实线所示)。

图2 三次握手
在上述过程中还有一些重要的概念:
◆ 未连接队列
在三次握手协议中,服务器维护一个未连接队列。该队列为每个客户端的SYN包(syn=y)开设一个条目,条目表明服务器已收到SYN包,并向客户发出确认,等待客户的确认包。这些条目所标识的连接在服务器处于SYN-RECV状态,当服务器收到客户的确认包时删除这些条目,服务器进入ESTABLISHED状态。
◆ Backlog参数
表示未连接队列的最大容纳数目。
◆ SYN+ACK 重传次数
服务器发送完SYN+ACK包,如果未收到客户确认包, 则服务器进行首次重传。再等待一段时间后仍未收到客户确认包,则进行第二次重传。如果重传次数超过系统规定的最大重传次数,则系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
◆ 半连接存活时间
指半连接队列条目存活的最长时间,即服务从收到SYN包到确认这个报文无效的最长时间。该时间值是所有重传请求包的最长等待时间总和,有时也称半连接存活时间为Timeout时间或SYN-RECV存活时间。
TCP-SYN Flood又称半开式连接攻击。攻击者会利用一些特殊工具制造大量的非法数据包,把源地址伪装成一个实际不存在的地址。在它的实现过程中只有前两个步骤,当服务方收到请求方的SYN 并回送SYN+ACK确认消息后,请求方由于采用源地址欺骗等手段,致使服务方根本得不到ACK回应
事实上,请求方除了立即响应SYN+ACK消息外,也可能因为正在处理某些数据,而暂时无法响应服务端消息, 这是正常的。因此,在系统设计中考虑让服务器持续一段时间保留此SYN+ACK信息片断,等待接收请求方ACK 消息的设计是很有必要的。但是,一台服务器可用的TCP连接是有限的,如果恶意攻击方快速、连续地发送此类连接请求,则服务器的可用TCP连接队列很快会被阻塞,系统可用资源、网络可用带宽将急剧下降,因而无法向其他用户提供正常的网络服务。TCP-SYN Flood就是利用这一原理实施攻击的。
这种方式有它的局限性。虽然攻击者可以将IP伪造为不存在的源地址,但不存在的源地址也相对容易被管理员识别。有经验的管理员可以通过查看连接状态, 把连接频繁的攻击源用iptables脚本直接过滤。所以,此类攻击方式现在也有所改变。有心的攻击者往往会精确,准备一群攻击机, 同时发动攻击,这样就会有成百上千个攻击源,每个攻击源都在不同的网络。再将每一个攻击源伪装上随机的IP源地址,这样管理员就更难应付了。
二、DDoS的检测方法
下面介绍如何判断服务器是否受到DDoS攻击。使用如下几个简单的步骤可以进行判断。
◆ 最明显的感觉是服务器响应缓慢,一般直接可以从服务器提供的页面显示速度上察觉。
◆ 登录服务器,用“netstat”命令查看,发现服务器有大量等待的TCP连接。
◆ 利用Sniffer、Tcpdump等嗅探工具会发现网络中充斥着大量源地址为假的伪装数据包。
◆ 从ISPtgi控上可以看出服务器的数据流量猛增,造成网络拥塞,服务器甚至不能正常地与外界通信。
◆ 严重时会造成系统死机。下面以一台RHEL AS 4.0的服务器为例,使用系统自带的netstat工具来检测DDoS攻击。
#netstat -n -p TCP
tcp 0 0 10.11.11.11:23 124.173.152.8:25882 SYN_RECV-
tcp 0 0 10.11.11.11:23 236.15.133.204:2577 SYN_RECV-
tcp 0 0 10.11.11.11:23 127.160.6.129:51748 SYN_RECV-
tcp 0 0 10.11.11.11:23 222.220.13.25:47393 SYN_RECV-
tcp 0 0 10.11.11.11:23 212.200.204.182:60427 SYN_RECV-
tcp 0 0 10.11.11.11:23 232.115.18.38:27811 SYN_RECV-
tcp 0 0 10.11.11.11:23 239.116.95.96:5122 SYN_RECV-
上面是在Linux系统中看到的输出结果,很多连接处于SYN-RECV状态(在Windows系统中是SYN-RECEIVED状态), 源IP地址都是随机的(也可能是同一个IP的很多SYN—RECV连接状态),表明这是一种带有IP欺骗的SYN攻击。通过下面的命令也可以直接查看Linux环境下某个端口的未连接队列条目数:
#netstat -atun |grep SYN_RECV |grep:80 |wc –l
结果显示了TCP 80端口的未连接数请求及个数, 虽然还远未达到系统极限, 但应该引起管理员的注意。
三、防范DDoS攻击
几乎所有的主机平台都有抵御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地址,时间可以根据具体网络连接情况设置。
四、基于角色的防范
互联网上的用户各种各样,不同角色有着不同的任务。下面以企业网络管理员/系统管理员、ISP/ICP管理员和骨干网络运营商三种角色为例分别谈谈如何防范Linux下的DDoS攻击。
1.企业网络管理员/系统管理员
作为企业网络/系统管理员, 有责任做到对系统了如指掌, 以下几项工作是必须的。
(1)时刻留意安全站点公布的、与Linux 系统和软件有关的最新安全漏洞和报告;及早发现系统存在的攻击漏洞,及时安装系统补丁程序;对一些重要信息(例如系统配置信息)建立并完善备份机制;对一些特权账号(例如管理员账号)的密码设置要谨慎。通过这样的一系列举措可以把攻击者的机会降到最小。
(2)在网络管理方面,要经常检查系统的物理环境, 禁止那些不必要的网络服务; 充分了解系统和服务器软件是如何工作的; 经常检查系统配置和安全策略, 并注意查看每天的安全日志。
(3)利用工具检查文件完整性。在确定系统未曾被入侵时,应该尽快为所有二进制程序和其他重要系统文件产生文件签名,并且周期性地进行比较以确保没有被非法修改。另外,强烈推荐将文件检验和保存到另一台主机或可移动介质中。工具可以使用免费的的tripwire和aide等文件/目录完整性检查程序;有条件也可以选择购买商业软件包。如果使用基于RPM 的软件包,可以直接使用RPM 的检验功能来校验软件特征码。
(4)利用网络安全设备(例如防火墙)来加固网络的安全性,配置好这些设备的安全规则,过滤掉所有可能的伪造数据包。一般商业公司都会配备相应的防火墙设备。目前市场上无论IDS还是IPS都具备防范DDoS攻击的功能,购买时多比较相关数据处理能力、数据包吞吐量和转发等性能指标来进行选择。
(5)经常与IDC中心管理员沟通, 以及与主要互联网服务供应商(ISP)的协助和合作是非常重要的。因为DDoS攻击主要是耗用带宽,虽然攻击来自四面八方,但进入上游ISP网络的入口点是有限的。个人管理的网络无法单独对付这些攻击,可以与ISP协商,通过他们帮助实施正确的路由访问控制策略来保护带宽和内部网络,实现路由访问控制和对带宽总量的限制。
(6) 当发现自己正在遭受DDoS攻击时,应当启动应对策略,如采用网络数据包嗅探工具,尽可能快地追踪攻击包,保存好攻击日志文件,并且及时联系ISP和应急组织,分析受影响系统,确定涉及的其他节点, 从而阻挡来自已知攻击节点的流量。
2.ISP/ICP管理员
ISP/ICP为中小型企业提供各种规模的主机托管业务,所以在防范DDoS时,除了需要与企业网络管理员一样管理好主机外,还要特别注意自己管理范围内的客户托管主机不要成为“肉鸡”,同时注意保护自己的网络设备。
针对ISP的网络攻击越来越多,应付这些攻击除了自身技术水平高之外,还需要丰富的攻防经验和事倍功半的工作设备,分析网络流量,采取应对措施。
目前,比较流行的防范方法是网络下水道技术。网络下水道技术应用网络上的Honey Pot收集发向ISP 的垃圾流量, 并通过对这些垃圾信息的分析来判断是否有人在扫描网络或进行攻击,从而实现预警和防范功能。如果有攻击者正在对ISP 网络展开攻击,网络下水道技术可将攻击的网络流量引导“下水道”通过一台路由来实现,可以是缺省的路由,也可以是一个特定的子网,ISP网络无法识别的网络流量都会送到这里。对于ISP来说,这些网络流量可能隐藏着许多有用的信息,想要获取这些信息可以在路由后面加上一个网络分析器, 如Linux下著名的IDS软件Snort,并配合Tcpdump协议分析工具,就可实现数据的截取和分析。如果ISP在监视过程中发现有攻击者正在攻击一个子网的网段,可以用BGP通知其他路由,把指向该子网的网络流量都送到下水道路由,从而改变攻击方向。下水道技术如图3和图4所示

图3

图4

假设攻击者正在对一个子网进行攻击,网络流量经过ISP网络后被ISP管理员发现ISP管理员及时采取措施,利用网络下水道技术向相邻BGP发送一个下水道路由记录。于是针对该子网的攻击被改向,从而保护该子网。
3.骨干网络运营商IDC
骨干网络运营商IDC提供互联网的物理基础。通过骨干网络运营商,DDoS攻击可以很好地被预防。2000年Yahoo等知名网站被攻击后,美国网络安全研究机构就提出了骨干网络运营商联手解决DDoS攻击的方案。该方法其实很简单,就是在每家运营商的出口路由器上进行源IP地址验证,如果在自己的路由表中没有这个数据包源IP 的路由就丢弃这个包。这种方法可以阻止攻击者利用伪造的源I P 进行DDoS攻击。但是,这样会降低路由器的效率,而这是骨干运营商非常关注的问题,所以该方案真正实施起来还很困难。
事实上,IDC更多地是通过高端设备,例如高端路由器、网络监控设备和事件告警应急设备等来防范DDoS等攻击,保证网络完全。
五、总结:
DDOS防范需要不断改进,对DDoS的原理与应对方法需要持续性的关注和研究。目前已有证据显示DDoS攻击方式已经改进,因此防范工作也要随之不断改进。

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