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