1. SYN攻击简介
所谓SYN攻击,即利用TCP三次握手原理,向服务器发送大量的SYN数据包,却不响应服务器反馈的SYN+ACK数据包,导致服务器的网络、内存等资源被大量占用,从而导致正常用户无法访问,起到了拒绝服务攻击的目的。
如果想要杜绝SYN攻击,那么我们应该设置服务器减少对ACK数据包的等待时间,减少对SYN+ACK数据包的重发次数,增大网络连接队列的长度等等,
防止SYN攻击的相关内核参数如下所示:
(1)net.ipv4.tcp_synack_retries
该参数表示服务器在收到客户端的SYN数据包并发送SYN+ACK数据包后,如果没有收到客户端的ACK数据包的重发SYN+ACK数据包的次数。在默认情况下,该值设置为5,即表示服务器会尝试发送5次SYN+ACK数据包,如果依旧没有收到响应,则中断链接,不再进行尝试。
(2)net.ipv4.tcp_max_syn_backlog
该参数表示SYN队列的长度,默认为128,可以将该参数设置为20480,以容纳更多的网络链接数。
(3)fs.file-max
该参数表示系统允许的文件句柄的最大数目,TCP连接的建立需要占用文件句柄,因此可以将该参数设置的大一点以应对大量的TCP链接请求。
(4)net.core.somaxconn
该参数表示socket监听队列长度,系统在默认情况下会将已经收到但是还没有处理的request请求放入到该队列中,当该队列满后就无法处理其他的request请求。因此增大该队列的长度可以应对更多的TCP连接请求。但是也会消耗系统的内存。
(5)net.core.wmem_max
该参数表示最大的TCP数据发送缓存,单位为字节。
(6)net.core.netdev_max_backlog
该参数表示当网络设备接收数据包的速率大于内核处理数据包速率时,允许将数据包送入队列的最大数目。
(7)net.ipv4.ip_local_port_range
该参数表示本机主动连接其他设备时的端口分配范围,通常设置为10000-65535,防止占用知名端口。
(8)net.ipv4.tcp_syncookies
该参数默认为0,表示关闭SYN Cookies,可以将该参数设置为1,表示开启该功能。SYN Cookies表示当出现SYN等待队列溢出时,启用Cookies来处理,可以防范少量的SYN攻击。
(9)net.ipv4.tcp_tw_reuse
该参数如果设置为1,则表示允许将TIME-WAIT sockets重新应用于新的TCP连接,如果设置为0,则表示关闭该功能。在默认情况下,该参数设置为0。
(10)net.ipv4.tcp_syn_retries
表示当该设备向其他设备发送TCP SYN包尝试建立TCP连接时,如果对方不响应(有可能是网络丢包或者是对方服务忙),则重新发送TCP SYN数据包的次数。
(11)net.ipv4.tcp_fin_timeout
该参数表示对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间,默认为60。
(12)net.ipv4.tcp_tw_recycle
该参数表示是否开启TCP连接中TIME-WAIT sockets快速回收,在默认情况下设置为0,表示不回收,如果设置为1,则表示回收。
2. 解决策略
(1)开启SYN cookie,防止SYN洪水攻击,修改配置文件/etc/sysctl.conf。
配置文件添加参数,如下所示:
# vi /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
生效修改配置,命令如下:
[root@controller ~]# sysctl -p
net.ipv4.tcp_syncookies = 1
(2)允许将TIME-WAIT sockets重新用于新的TCP连接;开启TCP连接中TIME-WAIT sockets的快速回收;修改系統默认的TIMEOUT时间为30。如下所示:
# vi /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
生效修改配置,命令如下:
# sysctl -p
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30