洪水***是网络***里比较常见的一种,一般体现就是机器慢(CPU居高不下),ssh等网络服务登陆缓慢甚至会出现登陆不上的情况,甚至在# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 的命令里,发现SYN_RECV 的数量要远远大于ESTABLISHED的数量(几乎是5~8倍以上),然后查看系统的日志或者使用#dmesg的时候,就会出现如下的语句:

possible SYN flooding on port 80. Sending cookies.



原理了解

洪水***的原理就是利用了TCP三次握手的漏洞,坏人们仿造了大量的假IP地址,这些IP一股脑的类似洪水一样向你的服务器发起请求,然后服务器老老实实按部就班的接收到SYN,然后一个一个的返回ACK,但是因为这些IP都是实际不存在的,所以这一步就卡住了,然后需要在对应的数据区里等若干时间,过了时间限制之后,服务器才会认为这些链接是坏死的,彻底放弃他们。然后再接纳新的链接,但是由于“洪水”过大,会造成系统负担过重,于是就出现cpu过高等现象。


针对这种情况,linux默认情况下是以发送cookies的形式进行自我保护,cookies的原理是当服务器接收到客户端的SYN包的时候不会特意建立一个数据区来返回syn+ack,而是根据syn来设定一个cookies,服务器会根据cookies来检查这个链接的合法性,如果链接不合法直接丢弃,如果合法在设定一个数据区来保存整套链接。


应该怎么办?

发现这种情况要使用# netstat -na |grep SYN_RECV|more在第一时间把问题IP迅速定位,然后iptables全部drop掉。


如果发现洪水***并不是来自恶意IP***,而是普通的多用户访问,那么就是自身服务器的问题,这时候需要把/proc/sys/net/ipv4/tcp_syncookies的值由1改成0,这个意思是关闭掉洪水***的防范。


如果觉得关闭了整个阀门,整个服务器就好像会不太安全(的确是有副作用的),那么是可以适当扩大一些阈值的,具体可以更改的文件如下:

1)/proc/sys/net/ipv4/tcp_max_syn_backlog这个文件是规定系统可以缓存多少syn请求,这个值普遍默认是512,有些服务器比较强势的可能是1024,但是要注意,请不要把这个数字轻易改超过1024,可能会出现忽略广播的现象;

2)/proc/sys/net/ipv4/tcp_synack_retries,这个意思是当客户端不返回ack+syn的时候,服务器会给几次机会继续尝试与客户端的链接,默认是5次。可以适当改小,或者干脆就成0,加快回收半连接。当然,改成0的话,也是有弊端,就是用户可能会连接不上网站,不过一般正常智商的用户会刷新一下,这样就会重新连接上的,所以这个弊端不算啥;

3)/proc/sys/net/ipv4/tcp_abort_on_overflow ,这个值默认是0,如果改成1的话,服务器就会在链接变慢的时候,发送一个reset包来快速重启链接,这个值根据情况开启;


扩展

/proc/sys/net/core 和/proc/sys/net/ipv4里面有很多文件,这里简单说明部分文件用途。

1)/proc/sys/net/ipv4/ip_local_port_range:本机主动连接其他机器时的端口分配范围;

2)/proc/sys/net/core/netdev_max_backlog:网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目;

3) /proc/sys/net/core/wmem_max:最大的TCP 数据发送缓冲(字节);

4) /proc/sys/net/core/rmem_max:最大的TCP 数据接收缓冲(字节);

5) /proc/sys/net/ipv4/tcp_timestamps = 0:时间戳选项,与前面net.ipv4.tcp_tw_reuse参数配合,是个布尔值,0 or 1。