Linux内核中影响tcp三次握手的一些协议配置

Syn攻击是最常见又最容易被利用的一种攻击手法,利用TCP协议的缺陷,发送大量伪造TCP连接请求,常用假冒的IP发来海量的SYN包,被攻击的服务器回应SYN+ACK,因为对方是假冒的IP,永远收不到包并且不会回应,导致被攻击服务器保持大量SYN_RECV状态的半连接,并且会重试默认5次回应握手包,塞满TCP等待连接队列,资源耗尽,让正常的业务请求连接不进来。

在Linux的发行版本中,都存在一个/proc/目录,有的也称它为Proc文件系统。在 /proc 虚拟文件系统中存在一些可调节的内核参数。这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 cat 工具进行读取,或使用 echo 命令进行修改。下面给出了几个可调节的参数是关于Linux TCP/IP 栈的参数,相关的帮助可以通过man tcp或info tcp获取。在这个目录中,包括了一些特殊的文件,不仅能用来反映内核的现行状态和查看硬件信息,而且,有些文件还允许用户来修改其中的内容,以调节内核的现行工作状态,例如/proc/sys/子目录下的文件。与/proc/目录中其它目录不相同的是,/proc/sys/目录下的文件不仅能提供系统的有关信息,而且还允许用户立即停止或开启内核的某些特性及功能。在/proc/sys/目录中的/proc/sys/net/子目录更是与网络息息相关,我们可以通过设置此目录下的某些文件来开启与网络应用相关的特殊功能,同时,也可以通过设置这个目录下的某些文件来保护我们 的网络安全。本文主要介绍 会影响tcp建立连接三次握手的一些因素:

Syn攻击常见于应用服务器,而数据库服务器在内网中,应该很难碰到类似的攻击,但有时候应用程序如果和数据库建连姿势不正确,在数据库端,也会被认为是Syn攻击,并拒绝连接建立。

1  /proc/sys/net/ipv4/tcp_max_syn_backlog    (1024) 

数据库突发的拒绝链接,应用报错,出问题的时间点上,数据库服务器的操作系统日志里,即/var/log/messages,可看到如下报错信息:

  该变量控制每个监听端口接收的客户端发送的SYN队列的长度,输入的SYN报文段连接请求需要排队,直到本地服务端接收,如果连接数多于默认值,则新来的连接请求会被丢弃,在服务端会维护一个未连接队列,该队列为每个客户端发送的SYN包开设一个条目,说明已经收到SYN包,并且向客户端发出SYN+ACK包,等待客户端的确认SYN包,这时服务端出于SYN_RECV状态,如果tcp_max_syn_backlog过小,一直收不到客户端最后发来的SYN确认包,服务端就会一直出于SYN_RECV状态,查看netstat -an的时候如果SYN_RECV过多有可能就是tcp_max_syn_backlog过小。www.169it.com

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

2  /proc/sys/net/ipv4/tcp_synack_retries    (5)

出问题的点上,从数据库的监控指标来看,Threads Connected 这个指标有增长。这个也是很明显,因为对数据库来说,Syn Flooding就是应用程序突发的对数据库发起建连,操作系统处理不过来,所以报Syn Flooding, 从数据库的性能指标来看,连接数肯定是会有一个突发的增长。应对方案就是需要分析这些突发的增长是怎么来的,削峰填谷,让连接更平稳。

  该变量控制内核向某个输入的SYN/ACK段重新发送响应的次数,降低取值可以更早的检测到客户端连接失败的尝试。

在数据库服务端,做如下调整:这个调整的意思是说:增加TCP半连接的缓冲,默认值是2048,我们调整到8192,让系统的抗突发压力增大一些。Tcp_syn_retires和Tcp_synack_retires默认是5,也就是服务器端要发送五次包,才会终止重试,我们把这个参数调整为2. 只重试一次,让出错的包尽量提早出错,以减少缓存的连接数。

3  /proc/sys/net/ipv4/tcp_retries2   (15)

echo 8192 /proc/sys/net/ipv4/tcp_max_syn_backlogecho 2 /proc/sys/net/ipv4/tcp_syn_retriesecho 2 /proc/sys/net/ipv4/tcp_美高梅官方网站,synack_retries

   该变量控制内核向已经建立连接的远程主机重新发送数据的次数,降低取值可以更早的检测到与远程主机的连接失效,从而可以快速释放该链接的资源。

这个参数调整,即时生效,无需重启。当然服务器重启后,这些参数也会回退到默认值。经此调整,数据库端的抗压能力得到加强,但并没有完全解决问题。

4  /proc/sys/net/ipv4/ip_local_port_range   (32768   61000)

本文由美高梅官方网站发布于数据统计,转载请注明出处:Linux内核中影响tcp三次握手的一些协议配置

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。