您的位置:首页 > 其它

使用iptables应对SYN攻击、CC攻击、ACK攻击

2015-11-01 08:54 375 查看
1、前言
笔者想总结一些应对常见的网络攻击的方法,特参阅网络上的文档,以便整理出一套可以应对SYN、CC、ACK等攻击的方案。
2、理论基础
[b][b][b]2.1、[/b]TCP/IP的三次握手理论[/b][/b]
TCP/IP协议使用三次握手来建立连接,过程如下:
1)第一次握手,客户端发送数据包syn到服务器,并进入SYN_SEND状态,等待回复
2)第二次握手,服务器发送数据报syn/ack,给客户机,并进入SYN_RECV状态,等待回复
3)第三次握手,客户端发送数据包ACK给客户机,发送完成后,客户端和服务器进入ESTABLISHED状态,链接建立完成
[b]2.2、TCP/IP三次握手服务器过程分析[/b]
1)三次握手协议中服务器维护一个等待队列
2)收到一个syn包就在队列中建立一个条目,并分配一定的资源
3)对应的每一个条目表示已经收到一个syn请求,并已经回复syn/ack
4)服务器上对应的连接已经进入SYN_RECV状态,等待客户端响应
5)收到客户端的响应包以后,该连接进入 ESTABLISHED状态,队列中对应的条目被删除。
[b]2.3、TCP/IP三次握手相关参数[/b]
[b][b]2.3.1、backlog[/b][/b]
1)参数的作用:
设定等待队列的最大数目。
2)对应内核参数:
net.ipv4.tcp_max_syn_backlog = 1024
[b][b]2.3.2、syn-ack[/b][/b]
1)参数的作用:
重传次数,服务器发送syn/ack包,如果没有收到客户端的相应,就会重传syn/ack,超过一定时间之后会进行第二次重传,超过设定 次数以后将该条目从队列中删除。每次重传的间隔时间并不确定。
2)对应内核参数:
net.ipv4.tcp_synack_retries = 5
[b][b]2.3.3、syn[/b][/b]
1)参数的作用:
重传次数,概念和syn/ack重传次数类似
2)对应内核参数:
net.ipv4.tcp_syn_retries = 5
[b][b]2.3.4、等待存活时间[/b][/b]
指等待队列的条目存活时间,即从服务器收到syn包到确认这个包无效的最长时间,该时间是所有重传包请求的最长等待时间。
3、攻击类型与防御
[b]3.1、DDOS攻击[/b][b][b]3.1.1、DDOS攻击的概念[/b][/b]DDOS攻击又称流量攻击一群恶霸试图让对面那家有着竞争关系的商铺无法正常营业,他们会采取什么手段呢?(只为举例,切勿模仿)恶霸们扮作普通客户一直拥挤在对手的商铺,赖着不走,真正的购物者却无法进入;或者总是和营业员有一搭没一搭的东扯西扯,让工作人员不能正常服务客户;也可以为商铺的经营者提供虚假信息,商铺的上上下下忙成一团之后却发现都是一场空,最终跑了真正的大客户,损失惨重。此外恶霸们完成这些坏事有时凭单干难以完成,需要叫上很多人一起。嗯,网络安全领域中DoS和DDoS攻击就遵循着这些思路。[b][b]3.1.2、一般的DDOS解决方法[/b][/b]
1)设置方法1vim编辑/proc/sys/net/ipv4/tcp_max_syn_backlog
8000
默认500,建议改为8000以上2)设置方法2
vim编辑/proc/sys/net/ipv4/tcp_fin_timeout
15
默认值60,建议改为15
3)syncooies
sysctl -w net.ipv4.icmp_echo_ignore_all=1
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
sysctl -w net.ipv4.tcp_max_syn_backlog="2048"
sysctl -w net.ipv4.tcp_synack_retries="3"
iptables -A INPUT -i eth0 -p tcp --syn -j syn-flood
# Limit 12 connections per second (burst to 24)
iptables -A syn-flood -m limit --limit 12/s --limit-burst 24 -j RETURN
4)limit
iptbales -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
[b]3.2、SYN攻击[/b]
[b][b]3.2.1、SYN攻击的概念[/b][/b]
syn攻击属于DDOS攻击中的一种,利用TCP/IP的缺陷进行网络攻击,可以使用很小的资源取得十分显著的效果。
[b][b]3.2.2、攻击原理[/b][/b]
1)服务器收到客户端的syn包,之后进入SYN_RECV状态
2)服务器的等待队列中增加一个条目
3)服务器未收到客户端的确认包,进行重传一直到超时之后,该条目从未链接队列中删除。
以上行为被攻击者利用:
客户端不断地发送syn包,而不响应来自服务器的syn/ack,等待队列的条目迅速增长,最后服务器的等待队列达到最大数目,之后就不能再接受新的连接,一直到链接超时才从队列中删除对应的条目。
配合ip地址欺骗技术,该方法可以取得十分良好的效果,基本上在攻击期间,服务器将不能给正常的用户提供服务。
这个攻击办法利用了TCP/IP协议的缺陷,攻击的目标不止于服务器,任何网络设备,只要开启了网络服务器,都可能会受到这种攻击,导致处理器资源被大量占用,内存被用完,大量队列等待处理,针对网络设备的攻击往往会导致整个网络瘫痪。
[b][b]3.2.3、相关指令[/b][/b]
1)查询syn相关参数
sysctl -a | grep syn
[b][b]3.2.4、应对方法[/b][/b]

1)修改等待数
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
2)启用syncookies
sysctl -w net.ipv4.tcp_syncookies=1
注意:启用syncookies可以大幅减小syn攻击带来的影响,但是却引入了新的安全缺陷(ACK攻击)
syncookie基本原理1)仔细处理连接的初始序列号而不是随机选择一个序列号。2)一旦server接收到SYN报文,将关键信息仔细编码并作为state存储在SYN队列中。3)这种经过编码的信息是用一个秘钥进行加密hash,形成SYN-ACK报文中的序列号并发送给client。在合法握手的第三个报文中,即从client返回给server的ACK报文中,在acknowledgment number字段中包含该序列号(加1)。这样,open双向连接所必须的所有信息又返回给server,而server在三次握手完成之前不必维护state。syn-cookies解决了SYN的基本问题,但是随之带来一个新的问题,就是服务器需要对收到的ACK报文进行计算,提高了三次握手需要的系统资源。一种新的攻击方式随之而来,即ACK攻击,发送大量的ACK数据报,导致服务器忙于计算最终导致服务器停止相应。Linux上的实际应用中,有等待数被占满的时候才会启用 syncookies的方式(syncookies摘自网文)。
3)修改重试次数
sysctl -w net.ipv4.tcp_syn_retries = 0
重传次数设置为0,只要收不到客户端的响应,立即丢弃该连接,默认设置为5次
4)限制单IP并发数
使用iptables限制单个地址的并发连接数量:
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT
5)限制C类子网并发数
使用iptables限制单个c类子网的并发链接数量:
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 24 -j REJECT
6)限制单位时间内连接数
设置如下:
iptables -t filter -A INPUT -p tcp --dport 80 -m --state --state NEW -m recent --set --name access --resource
iptables -t filter -A INPUT -p tcp --dport 80 -m --state --state NEW -m recent --update --seconds 60 --hitcount 30 --name access -j DROP
或者使用如下两条策略
iptables -t filter -A INPUT -p tcp --dport 80 -m --state --syn -m recent --set
iptables -t filter -A INPUT -p tcp --dport 80 -m --state --syn -m recent --update --seconds 60 --hitcount 30 -j DROP
7)修改modprobe.conf
为了取得更好的效果,需要修改/etc/modprobe.conf
options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60
作用:记录10000个地址,每个地址60个包,ip_list_tot最大为8100,超过这个数值会导致iptables错误
8)限制单个地址最大连接数
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP
[b]3.3、ACK攻击[/b]
[b][b]3.3.1、ACK攻击的概念[/b][/b]
ACK 攻击是针对syn-cookies而发产生的,通过发送大量的ACK数据报,使目标服务器忙于计算,达到拒绝服务的目的。
[b][b]3.3.2、应对ACK攻击[/b][/b]
1)并发连接数限制
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP
限制并发连接数不大于50

2)限制并发ACK
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK ACK -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT
限制并发ACK不大于50
3)限制单位时间链接次数
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK ACK -m recent --set --name drop
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK ACK -m recent --update --seconds 60 --hitcount 30 -j DROP
一分钟内大于30次的连接全部丢弃
[b]3.4、CC攻击[/b]
[b][b]3.4.1、CC攻击的概念[/b][/b]
普通的CC攻击特点是所有的连接都是正常的完整的连接,这样的连接一般的防火墙是很难预防的。但是既然是网络攻击必然也具有网络攻击的共同特点,也就是每一个攻击源都会发起尽量多的连接,因此我们仍然可以使用限制单个地址并发链接数量的办法来实现对CC攻击的抵御。
具体命令同上
[b]3.5、webcc[/b]
想必之下似乎更加难以预防,但是由于所有的访问都是由相同的一个或几个网站中转而来,这些访问请求的http_reffer都会带有这些中转站的地址。我们只要在web服务器上设置http_reffer过滤即可大幅减小webcc攻击的影响,具体的设置这里就略过不表了。
附:如何为RHEL5增加connlimit模块
-------------------------------------------------------
原文出处:
http://blog.chinaunix.net/uid/108431/year-200912-list-1.html
http://security.ctocio.com.cn/tips/228/7769728.shtml
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iptables SYN CC ACK