Linux系统-抵御SYN洪水攻击

说明:

本文中所提到的这些内核配置参数应该在每台服务器上线之前配置好的,防止意外。

SYN攻击:

SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络SYN包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。

原理图:


正常情况下TCP三次握手:

PjulHP.png


SYN攻击情况:

Pju8N8.png


SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,常用假冒的IP或IP号段来发送海量的请求连接的第一个握手包(SYN包),被攻击服务器回应第二个握手包(SYN+ACK包),因为对方是假冒IP,对方永远收不到包且不会回应第三个握手包,导致被攻击服务器保持大量SYN_RECV状态的“办连接”,并且会重试默认5次回应第二个握手包,塞满TCP等待连接队列,耗尽资源(CPU满负荷或内存不足),让正常的业务请求连接不进来。

解决:

一、添加以下参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vim /etc/sysctl.conf
#在文件末尾添加:

net.ipv4.tcp_synack_retries = 0
net.ipv4.tcp_syn_retries = 0
net.ipv4.tcp_max_syn_backlog = 20480
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
fs.file-max = 819200
net.core.somaxconn = 65536
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 165536
net.ipv4.ip_local_port_range = 10000 65535

二、参数生效

1
sysctl -p

三、参数详解

1)net.ipv4.tcp_synack_retries = 0

表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包)后,不进行重试,加快回收“半连接”,不要耗光资源。不修改这个参数,模拟攻击,10秒后被攻击的80端口即无法服务,机器难以ssh登录; 用命令 netstat -na | grep SYN_RECV检测“半连接”hold住180秒;

2)net.ipv4.tcp_syn_retries = 0

默认是5,当没有收到服务器端的SYN+ACK包时,客户端重发SYN握手包的次数。

3)net.ipv4.tcp_max_syn_backlog = 20480

半连接队列长度,增加SYN队列长度到20480:加大SYN队列长度可以容纳更多等待连接的网络连接数,具体多少数值受限于内存。

4)fs.file-max = 819200

系统允许的文件句柄的最大数目,因为连接需要占用文件句柄

5)net.core.somaxconn = 65536

用来应对突发的大并发connect请求

6)net.core.wmem_max = 16777216

最大的TCP数据发送缓冲(字节)

7)net.core.netdev_max_backlog = 165536

网络设备接收数据包的速度比内核处理这些包的速度快时,允许送到队列的数据包的最大数目

8)net.ipv4.ip_local_port_range = 10000 65535

本机主动连接其他机器时的端口分配范围,比如说,在vdftpd主动模式会用到,如果只是开启22端口,不会使用到net.ipv4.ip_local_port_range这个功能

9)net.ipv4.tcp_syncookies = 1

表示开启SYN Cookies,当出现半链接队列溢出时启用cookies来处理,调大半链接队列,可防范少量SYN攻击,默认为0,改为1开启

10)net.ipv4.tcp_tw_reuse = 1

表示开启tcp连接重用,允许将TIME-WAIT sockets重新用于建立新的tcp连接,默认为0,改为1开启

11)net.ipv4.tcp_tw_recycle = 1

表示开启tcp连接中TIME-WAIT sockets的快速回收,默认为0,改为1开启

这个是什么意思呢,我来演示一下给大家看看,现在我先看看阿里云上边80端口的状态

Pjut3Q.png

接下来我访问我阿里云的网站,然后多刷新几次,刷新完了之后,我们再来看看80的状态是不是有TIME_WAIT状态的,那上边这个参数的作用就是快速释放这些TIMA_WAIT来达到快速回收的作用

PjuwBq.png

12)net.ipv4.tcp_fin_timeout = 10

对于本端断开的socket连接,tcp保持在FIN_WAIT_2状态的时间。对方可能会断开连接或一直不结束或不可预料的进程死亡

博主QQ:1012405802
技术交流QQ群:830339411
版权声明:网站内容有原创和转载,如有侵权,请联系删除,谢谢!!
感谢打赏,93bok因你们而精彩!!(支付宝支持花呗)
0%