前提
当你在 Linux 服务器上运行 dmesg -T
命令,看到下面输出,可能会猜测遭受到 SYN
洪水攻击。
上图只是可能遭受到 SYN
洪水攻击,但不一定是被攻击了。后面讲述如何判定这个问题?
简述 TCP SYN flood 攻击原理
TCP 协议要经过三次握手才能建立连接:
于是出现了对于握手过程进行的攻击。攻击者发送大量的 SYN
包,服务器回应 (SYN+ACK)
包,但是攻击者不回应 ACK
包,这样的话,服务器不知道 (SYN+ACK)
是否发送成功,默认情况下会重试5次(tcp_syn_retries)
。这样的话,对于服务器的内存,带宽都有很大的消耗。见下图:
判断方法
查看所有TCP连接数,按状态统计并排序
1
2
3
4
5
6
7
8
9
10$ netstat -ant | awk '/^tcp/{print $NF}' | sort -n | uniq -c | sort -nr
4913 TIME_WAIT
1726 ESTABLISHED
87 FIN_WAIT2
23 LISTEN
23 FIN_WAIT1
7 LAST_ACK
3 SYN_SENT
1 CLOSING从上面看,
SYN_SENT
数值很小,排除洪水攻击,可能是并发连接过多
。查看网络连接打开的文件数
1
2
3$ lsof -ni | wc -l
2207查看
SOCKET
状态,以及数量1
2
3
4
5$ cat /proc/net/sockstat
sockets: used 2273
TCP: inuse 1636 orphan 1039 tw 8795 alloc 3115 mem 873
UDP: inuse 2 mem 2查看内核参数
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog
半连接队列长度(默认为1024),加大SYN队列长度可以容纳更多等待连接的网络连接数,具体多少数值受限于内存1
2
3$ sysctl -a | grep tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 2048查看内核参数
net.ipv4.tcp_synack_retries
net.ipv4.tcp_synack_retries
表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包),进行重试的次数(默认为5)。1
2
3$ sysctl -a | grep tcp_synack_retries
net.ipv4.tcp_synack_retries = 5
结论
:tcp_max_syn_backlog(2048) 小于 2207(lsof -ni | wc -l),可能网络连接数不够了。
优化方法
1 | # 编辑 /etc/sysctl.conf 配置文件,修改参数 |
TCP SYN flood 攻击防御方法
下面列举部分方法,方法可以同时使用,也可以单独使用:
方法一:限制 SYN 并发数
1
$ iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT --limit 1/s
方法二:优化系统内核参数,具体可以参考上面
优化方法
方法三:网站上
CDN
,隐藏源站 IP,让CDN
抵抗攻击方法四:购买
高防IP
参考链接
- https://www.cnblogs.com/sunsky303/p/11811097.html
- https://blog.csdn.net/gaojinshan/article/details/40895767
---本文结束感谢您的阅读。微信扫描二维码,关注我的公众号---
本文链接: https://www.yp14.cn/2019/12/27/Linux系统日志报Possible-SYN-flooding处理方法/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!