本文出自 “李晨光原创技术博客” 博客,谢绝转载!
用iptables抗御SYN Flood攻击
1 引 言
网络安全是各种网络应用面临的一个首要问题。从网络普及的那天开始,网络犯罪就没有停止过,相反有愈演愈烈之势。研究发现,现今的网络攻击以分布式拒绝服务攻击(DDOS)为主 。其中,SYN Flood攻击由于易于实现,不易防范,已成为黑客攻击的终极工具。因此,研究如何防范和抵御SYN Flood攻击具有重要的现实意义。
Netfilter是Linux为用户提供的一个专门用于包过滤的底层结构,可以内建在L inux内核中; 而iptables则是Netfilter框架中的一个模块,使用户可以访问内核过滤规则和命令。与之前的防火墙体系比,Netfilter具有以下优点:
(1) iptables允许建立状态( stateful)防火墙,即在内存中保存穿过防火墙的每条连接。这种模式可以有效地配置FTP和DNS以及其它网络服务;
(2) iptables不仅能够过滤TCP标志任意组合报文,还能够过滤MAC地址;
(3) 系统日志比ipchains更容易配置,扩展性也更好;
(4) 对于网络地址转换(NAT)和透明代理的支持,Netfilter更为强大和易于使用;
(5 ) iptables能够阻止某些DOS 攻击, 例如SYN Flood攻击。
本文首先对传统的SYN Flood攻击防御方案进行简要分析,然后阐述利用Netfilter/ iptables的动态包过滤机制构建防火墙来抗御SYN Flood攻击的原理,最后提出iptables与入侵检测系统( IDS)的集成方案,利用文件作为两者之间数据传递的载体。实验结果表明, 这种方法可以有效对抗SYN Flood攻击。
2 传统的SYN Flood攻击防御方案
SYN Flood是当前最流行的DDoS攻击方式之一,它利用TCP协议缺陷发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU 满负荷或内存不足) 。由于SYN Flood是通过网络底层对服务器进行攻击的,攻击者可以任意改变自己的网络地址而不被网络上的其他设备所识别。
受攻击者一旦发现服务器不再接受请求,甚至是本地访问的速度也很慢,就应使用Netstat检查处于SYN_RECV (半连接)状态的连接。如果数量大于500或占总连接数的10%以上,可以认定其系统(或主机)遭到SYN Flood攻击。
通常,有两种简单的方法可以防御SYN Flood攻击。一是缩短等待时间( SYN Timeout)并增大队列的SYN包最大容量( tcp _max_SYN _backlog) ,二是设置SYN Cookie。但是,这两种方法只能对付比较原始的SYN Flood攻击。缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效,而SYNCookie依赖于对方使用真实的IP地址。如果攻击者以每秒数万条的速度发送SYN 报文,同时利SOCK_RAW等工具随机改写IP报文中的源地址,那么上述方法显然无法生效。
当然,也可以利用iptables编写功能完善的防火墙。iptables为模块化结构,管理方便,易于排错,是一种功能强大的实用防火墙工具。但是,利用ip t2ables建立的防火墙系统,即使能够快速发现网络出现问题的原因,也不可能在第一时间内调整防火墙规则来响应攻击者的攻击行为。因为在遇到SYNFlood攻击时再加载防火墙启动脚本,并使用vi对iptables规则进行编辑,以便阻塞那些发出恶意攻击数据的源地址的数据报,所有这些工作至少需要耗费一两分钟。对于SYN Flood攻击尤其是DDOS攻击,这种反应速度显然是跟不上的。而且一旦攻击者使用虚假的随机ip地址,上述方法会引起网络严重堵塞。若要再次修改防火墙启动脚本来阻止攻击,只能被动地跟在攻击者之后修补漏洞,收效甚微。因此,在网络受到攻击时,通过修改防火墙规则配置脚本被动慌乱地对攻击做出快速防范反应,这显然是不现实的。
3 基于iptables的动态包过滤防火墙
针对上述SYN Flood 攻击防御方案存在的不足,解决方案是创建一个特殊的脚本ipdrop,以便能动态插入一个规则来阻塞指定的IP。通过该脚本阻塞某个IP,只需几秒钟就可以实现,而且还可有效防止手工加入规则导致的人为错误。这样,阻塞攻击的主要任务就可以简化为攻击源地址的确定。
创建ipdrop脚本的关键,在于如何实现规则的动态添加和删除。例如,假设10. 10. 138. 224已经确定为攻击源地址,添加的规则会将该ip地址发送的数据报全部过滤;但是一段时间之后,很可能攻击停止并且该主机又发出正常的连接请求,此时则应删除之前已设定的规则。采取的方法是在终端中输入命令,格式为: ip 地址on /off,然后脚本在规则库中相应地自动添加如下规则:
iptables $OPERATION INPUT -s [ip地址] -j DROP 其中,$OPERATION变量的值取决于终端命令行参数中是使用“on”还是“off”模式。如果是“on”,$OPERATION变量的值即为“-I” (插入) ; 如果是“off”, $OPERATION变量的值即为“-D”(删除) 。当iptables行被执行时,特定的规则将动态地插入或删除。例如:
#ipdrop 10.10.138.224 on
IP 10.10.138.224.drop on
ipdrop脚本将立即阻塞10. 10. 138. 224。ipdrop脚本可以和任何类型的防火墙一起发挥作用,甚至在没有部署防火墙的系统上,需要的条件仅仅是支持iptables的L inux2. 4版本(或更高版本)的内核。通过该脚本阻塞某个IP将是非常容易的工作,只需要几秒钟就可以实现。但是如果发生大规模DDOS攻击,该脚本在响应速度上仍然存在局限。即使攻击方使用的都是真实ip地址,也需要一条一条从终端中输入大量的命令, 这将是极其费时费力的工作,显然远远跟不上攻击速度。因此,更好的办法是将ipdrop脚本与入侵检测集成在一起,由入侵检测软件锁定攻击源ip 地址,然后自动传递到ip tables中,进而实现地址过滤。
4 iptables和入侵检测软件的集成
由于Linux防火墙工作在网络层,因此防火墙只能对数据包的IP地址、端口、标准TCP / IP标志以及数据包的连接状态等信息进行检测。然而对于网络的总体安全来说,仅对网络层的协议进行安全防范是远远不够的,还必须提供基于内容的安全保障,也就是需要对应用层的数据进行进一步的检测。对于Netfilter/iptables构架来说,它的核心是一个基于网络层安全检测的系统,并不能完全满足安全需求,必须将这部分工作交给其他的入侵检测系统来完成;另一方面,工作在应用层的入侵检测系统虽然能提供高层协议的监控,但它不能对信息进行有效屏蔽。因此, Netfilter/iptables与入侵检测集成在一起,不仅能提高抗御攻击的响应速度,也是提高网络安全防御能力的需要。
iptables和入侵检测软件相结合,常见的方法是将iptables和snort联动。这种方法是利用snort和iptables的扩展机制,采用iptables的字符串匹配技术来转换snort的规则。字符串模式匹配技术,就是直接在TCP / IP的包体数据中用字符串模式匹配的方式检查是否包含有攻击信号的内容。这样就可以结合大多IDS系统(如snort)的规则模式匹配
引擎,将入侵规则信息直接加载到iptables的规则库中,用字符串模式匹配的方式来进行分析判断,从而实现高层内容监控。但是,字符串匹配技术过于复杂,对于IDS系统也有诸多要求,在一定程度上限制了其使用范围。
解决方案是采用文件作为传输数据的载体,将入侵检测系统和iptables结合起来,如图1所示。由于大部分编程语言都由文件操作,所以不论入侵检测系统采用什么语言编程,都可以与iptables进行数据传递。因此,采用文件作为入侵检测系统向iptables传送数据的方法是可行的。具体实现时,只需将入侵检测系统( snort或者自己编写的入侵检测系统)获取的非法ip 地址和合法的ip 地址分别写入文件,传递给iptables并由iptables写入规则库。一旦SYN Flood攻击发生时, iptables的任务就是将攻击源ip地址所发送的所有数据报全部丢弃,从而有效避免合法用户连接请求的大量丢失。最后将所有iptables规则都写入脚本,方便程序的执行。
5 测试结果和分析
5. 1 测试结果
实验环境:在局域网内进行了一系列攻击实验,其中两台攻击计算机(Win 2003) ,一台检测计算机(RedHatL inux) 。检测计算机内已有iptables规则脚本,主要测试文件到iptables的数据传递,故默认入侵检测系统发现攻击ip地址并写入文件列表。在发生攻击时,必定有大量的网络会话处在SYN_RECV状态,采用以下命令查看处于半连接状态的TCP会话:
#netstat -nat | grep SYN_RECV
tcp 0 0 10. 10. 138. 121: 1763 10. 10. 138. 52: 631 SYN_RECV
tcp 0 0 10. 10. 138. 121: 859 10. 10. 138. 52: 631 SYN_RECV
tcp 0 0 10. 10. 138. 121: 5278 10. 10. 138. 52: 631 SYN_RECV
tcp 0 0 10. 10. 138. 121: 1425 10. 10. 138. 52: 631 SYN_RECV
tcp 0 0 10. 10. 138. 121: 1698 10. 10. 138. 52: 631 SYN_RECV
tcp 0 0 10. 10. 138. 121: 8653 10. 10. 138. 52: 631 SYN_RECV
………………………………………………….
………………………………………………….
启动脚本后,再次输入以上命令: #netstat -nat |grep SYN_RECV。此时,查找不到在网络连接中处于SYN_RECV状态的会话(在WINDOWS系统中是SYN_RECEIVED状态),显示处于半连接状态的数据报都已经过滤,也就是系统成功地抵抗了SYNFlood攻击。在实际测试中,采用多台计算机同时对主机进行攻击来模拟大流量、高强度SYN Flood攻击的复杂环境,同样取得了比较理想的结果。
5. 2 性能优化
通常的安全策略一般可以基于以下两点制订:
(1) 准许除明确拒绝以外的全部访问--所有未被禁止的都是合法的;
(2) 拒绝访问除明确准许以外的全部访问--所有未被允许的都是非法的。
从合法的和非法的ip地址的数量来看,在发生SYN Flood攻击的时候,非法的ip 地址显然大大多于合法的ip 地址数量。因此,只要设置iptables的默认策略为拒绝iptables -P INPUT DROP、读取合法的ip地址的规则列表即可,可以明显提高响应的速度。不过,响应速度更大程度上还是取决于读文件的快慢。循环读取文件有很多种方法,速度大相径庭。在文献中列举了12 种循环读取文件的方法,并对每种方法进行了计时测试和比较。其中,使用底部循环的方法最佳。在本文提出的解决方案中,采用底部循环的文件读取方法之后,程序性能显著提高。
6 结束语
SYN Flood攻击虽然原理简单,但是造成的危害却十分严重。通过修改内核参数或使用TCP Cookie技术只能在一定程度上减轻SYN Flood攻击的影响;单独使用iptables建立包过滤防火墙则显得势单力薄,而且只有在遭受到攻击后才能根据数据报的特征(如源ip地址)进行包过滤,这种“亡羊补牢”对于大规模的DDOS更是收效甚微。将入侵检测系统和包过滤系统相结合,是一种比较好的抗SYN Flood攻击方法。文件的灵活性使得大多数入侵检测系统与iptables能够进行良好的集成。不过,使用文件仍然存在响应速度上的缺陷,在实时性方面还有待于进一步提高。