今天早上一起床,就上服务器看了下,猛然发现 CPU 飙升 99%。排查了一会,发现是被 CC 攻击了。网络连接里出现大量 SYN 连接,占用了所有的资源,导致前端无法打开网站。经过许久,我终于找到了解决方案:屏蔽 SYN 的连接。这样可以隔绝大部分攻击。下面分享一下我的思路。
解决方案
SYN 攻击是利用 TCP/IP 协议 3 次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。
在 SSH 中用命令 sysctl -a | grep syn
可以看到以下内容:
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5
tcp_max_syn_backlog
是 SYN 队列的长度。tcp_syncookies
是一个开关,用于是否打开 SYN Cookie 功能。该功能可以防止部分 SYN 攻击。tcp_synack_retries
和tcp_syn_retries
定义了 SYN 的重试次数。
加大 SYN 队列长度可以容纳更多等待连接的网络连接数;打开 SYN Cookie 功能可以阻止部分 SYN 攻击;降低重试次数也有一定效果。
推荐值:
text 代码:net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_syn_retries = 3
设置完这些参数后,就能有效隔绝 SYN 连接带来的 CC 攻击了。