SYN flooding引发的网络故障

故障现象:

1.应用无法通过外网访问,应用服务器所在的内网网段之间(web和db数据库之间访问丢包严重)不能互相访问
其他网段正常


2.怀疑是网络设备问题,将连接该网段设备的交换机重启后故障依旧,通过查看个端口的IP报文数据
发现28号口疑似出现环路现象,接收INPUT数据大大超出发送OUTPUT数据


28号口连接的是OA服务器,OA服务器是一台放在centos6.3下的apache web服务器


怀疑连接该服务器端口或者网线有问题,更换网线和交换机接口后问题依旧




3.拔掉该机器的网线后发现内网恢复正常,问题出在OA服务器上


但单台服务器引起类似环路问题令人费解


4.重启服务器后内网恢复正常


5.通过查看该OA服务器的日志/ var/log/messages 发现了部分报错日志:

localhost kernel: possible SYN flooding on port 8888. Sending cookies




可能是遭到了syn flood流量恶意访问




=======================================




SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,常用假冒的IP或IP号段发来海量的请求连接的第一个握手包(SYN包),被攻击服务器回应第二个握手包(SYN+ACK包),因为对方是假冒IP,对方永远收不到包且不会回应第三个握手包。导致被攻击服务器保持大量SYN_RECV状态的“半连接”,并且会重试默认5次回应第二个握手包,塞满TCP等待连接队列,资源耗尽(CPU满负荷或内存不足),让正常的业务请求连接不进来。

SYN攻击是最常见又最容易被利用的一种攻击手法,也应该算为DDOS攻击的一种,我们都知道,TCP协议有一个缺陷,华三交换机是经过三次握手后面需要等待确认,发送很多这样的连接通信数据包请求华三交换机,使得CPU资源和内存被耗尽,SYN攻击不但影响着网速和路由器,还对主机本身也产生影响,这种攻击威力强大,不管对方是什么系统,只要这些系统打开了TCP这个端口服务华三交换机就可以进行攻击。如果在配合IP欺骗,这种攻击方式会达到非常好的效果。


此次处攻击的对象为OA服务器由两台centos组成,OA系统本身没有什么大的影响,通过内网可以继续访问。流量同时打在了连接OA系统的交换机上,该交换机性能较差,导致同网段的windows服务器如tomcat web服务和sqlserver数据库服务器收到牵连掉包验证而不能正常提供服务,可能是windows服务器对网络的要求比较高,此时应该更换交换机

后续诊断:

检查系统syslog:


# tail -f /var/log/messages
Feb 23 09:48:15 localhost kernel: possible SYN flooding on port 8888. Sending cookies


检查连接数增多,并且SYN_RECV 连接特别多:
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'


TIME_WAIT 16855
CLOSE_WAIT 21
SYN_SENT 99
FIN_WAIT1 229
FIN_WAIT2 113
ESTABLISHED 8358
SYN_RECV 48965
CLOSING 3
LAST_ACK 313


根据经验,正常时检查连接数如下: 
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'


TIME_WAIT 612
CLOSE_WAIT 2
FIN_WAIT1 3
FIN_WAIT2 535
ESTABLISHED 257
SYN_RECV 4


应急处理


根据netstat查看到的对方IP特征:
# netstat -na |grep SYN_RECV|more


利用iptables临时封掉最大嫌疑攻击的IP或IP号段,例如对方假冒173.*.*.*号段来攻击,短期禁用173.*.*.*这个大号段(要确认小心不要封掉自己的本地IP了!)
# iptables -A INPUT -s  173.0.0.0/8  -p tcp  –dport 80 -j DROP


再分析刚才保留的罪证,分析业务,用iptables解封正常173.*.*.*号段内正常的ip和子网段。这样应急处理很容易误伤,甚至可能因为封错了导致ssh登陆不了服务器,并不是理想方式。


tcp_synack_retries = 0是关键,表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包)后,不进行重试,加快回收“半连接”,不要耗光资源。


总结:


对于SYN flood攻击,调整下面三个参数就可以防范绝大部分的攻击了。




增大tcp_max_syn_backlog  /proc/sys/net/ipv4目录下tcp_max_syn_backlog文件
减小tcp_synack_retries   /proc/sys/net/ipv4目录下tcp_synack_retries
启用tcp_syncookies
现在的内核默认都是开启tcp_syncookies的
可以统一通过调整 /etc/sysctl.conf 文件来调整三个参数:


net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_syn_retries = 2


使配置生效:

# sysctl -p


posted @ 2016-02-24 12:09  reblue520  阅读(738)  评论(0编辑  收藏  举报