如何防御 SYN 攻击?
这里给出几种防御 SYN 攻击的方法:
-
增大半连接队列;
-
开启 tcp_syncookies 功能
-
减少 SYN+ACK 重传次数
方式一:增大半连接队列
在前面源码和实验中,得知要想增大半连接队列,我们得知不能只单纯增大 tcp_max_syn_backlog 的值,还需一同增大 somaxconn 和 backlog,也就是增大全连接队列。否则,只单纯增大 tcp_max_syn_backlog 是无效的。
增大 tcp_max_syn_backlog 和 somaxconn 的方法是修改 Linux 内核参数:
增大 backlog 的方式,每个 Web 服务都不同,比如 Nginx 增大 backlog 的方法如下:
最后,改变了如上这些参数后,要重启 Nginx 服务,因为半连接队列和全连接队列都是在 listen() 初始化的。
方式二:开启 tcp_syncookies 功能
开启 tcp_syncookies 功能的方式也很简单,修改 Linux 内核参数:
方式三:减少 SYN+ACK 重传次数
当服务端受到 SYN 攻击时,就会有大量处于 SYN_REVC 状态的 TCP 连接,处于这个状态的 TCP 会重传 SYN+ACK ,当重传超过次数达到上限后,就会断开连接。
那么针对 SYN 攻击的场景,我们可以减少 SYN+ACK 的重传次数,以加快处于 SYN_REVC 状态的 TCP 连接断开。
方式四:使用iptables 防止syn泛洪攻击
问题1:iptables 限制的syn洪水攻击是不是就不会让syn进入半链接队列了?
回复:是的
问题2:如果已经用iptables 限制的syn洪水攻击,syn洪水攻击的时候仍然会使服务器的cpu占用率升高吗?我实际测试是升上去的,但是没有使用hping3测试,只是使用jmeter测试的
回复:
那你的这测试结果,跟hping3应该没什么差别,有大量的网络包进入系统,虽然能阻止SYN攻击进入半连接队列,但是大量的流量是会导致CPU过高,大量有网络包进入系统可能会一直触发中断信号。
这个iptables软件防火墙理论上只要有大量包过来,即使执行过滤判断也会消耗CPU。如果是硬件级别的防火墙就不用占用主机的CPU了,自己里面有芯片进行运算
[1] 系统性能调优必知必会.陶辉.极客时间.
[2] https://blog.cloudflare.com/syn-packet-handling-in-the-wild