+86 135 410 16684Mon. - Fri. 10:00-22:00

possible SYN flooding on port 80. Sending cookies问题处理

possible SYN flooding on port 80. Sending cookies问题处理

possible SYN flooding on port 80. Sending cookies问题处理

服务器的syslog里出现里大量以下警告。大概的意思就是说,服务器的80端口有大量的SYN请求并且超过了可分配的记忆领域容量,因此启用了SYN cookies功能。

kernel: possible SYN flooding on port 80. Sending cookies.

SYN cookies

SYN cookies是,为了防止TCP SYN flood攻击开发的对应方法之一。

SYN Flood攻击是在TCP连接开始之前服务器的记忆领域被客户端的SYN请求全部占领。通常这个记忆领域会存放客户端的IP地址、端口号、连接时的序列号 及客户端指定的各种TCP选项(TCP Window等)。而服务器端是在接收客户端的SYN请求之后,给客户端返回SYN ACK包(这里包含TCP连接相关的TCP序列号)。服务器端和客户端在以后的TCP通信中使用这个TCP序列号。因此客户端在返回ACK时,会包含针对 服务器端SYN ACK包的TCP序列号。

利用这个TCP三次握手的特性,如果服务器端能够把应该存储在记忆领域的信息,写入到SYN ACK包的序列号的话,服务器端在接收客户端的SYN请求之后无需消费记忆领域,这么做的好处是TCP三次握手完成之后分配记忆领域就可以了。

一般使用伪装IP进行大量SYN flood攻击的客户端无法接收这个序列号(服务器端SYN ACK的序列号),因此也无法返回给服务器端正确的ACK包。其结果是服务器端的记忆领域可用于正常主机的连接请求。

开启SYN cookies功能的服务器端在没有受到SYN flood攻击时,在接收客户端的SYN请求时会分配记忆领域给这个连接请求(和没有开启SYN cookies时一样)。但是当受到SYN flood攻击时(可分配的记忆领域不足),不再给客户端的SYN请求分配记忆领域,而是直接给客户端返回SYN ACK包。这时的SYN ACK包的序列号是用特殊的方法计算的。

用以下命令查看有没有SYN cookies功能有没有开启。0是无效,1是有效。

# cat /proc/sys/net/ipv4/tcp_syncookies

修改内核参数

以下是相关的几个内核参数。

参数名 默认值 简介
tcp_max_syn_backlog 1024 服务器端在接受客户端的SYN请求之后,在记忆领域可存储的客户端SYN请求数
tcp_synack_retries 5 服务器端处于SYN_RECV状态之后,在一定时间没有收到客户端的SYN时,再次发送SYN ACK的次数
tcp_abort_on_overflow 0(无效) 当服务器端高负荷时,给客户端发送RST切断连接来保护服务器

可使用sysctl -a命令确认,现在的参数值。

# sysctl -a | grep tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 1024
# sysctl -a | grep tcp_synack_retries
net.ipv4.tcp_synack_retries = 2
# sysctl -a | grep tcp_abort_on_overflow
net.ipv4.tcp_abort_on_overflow = 0