Linux内核报错剖析

企业生产环境Linux服务器正常运行,由于某种原因会导致内核报 错或者抛出很多信息,根据系统SA可以快速定位Linux服务器故障, Linux内核日志一般存在messages日志中,可以通过命令tail-fn 100/var/log/messages查看,以下为Linux内核常见报错日志及生产环境解 决报错的方案

(1)Linux内核抛出net.ipv4.tcp_max_tw_buckets错误,代码如下:

Sep 23 04:45:55 localhost kernel:TCP:tine wait bucket table overflow
Sep 23 04:45:55 localhost kernel:TCP;tine wait bucket table overflow
Sep 23 04:45:55 localhost kernel:TCP:tine wait bucket table overflow
Sep 23 04:45:55 localtost kernel:TCP:tine wait bucket table overflow
Sep 23 04:45:55 localhost kernel:TCP:tine wait bucket table overflow
Sep 23 04:45:55 localhost kernel:TCP:tine wait bucket table overflow
Sep 23 04:45:55 localhost kernel:TCP:tine wait bucket table overflow
Sep 23 04:45:55 localhost kernel:TCe;tine wait bucket table overflow
Sep 23 04:45:55 localhost kernel:TCP:tine wait bucket table overflow
Sep 23 04:45:55 localhost kernel:TCP:tine wait bucket table overflow

根据TCP协议定义的三次握手及四次断开连接规定,发起socket主 动关闭的一方socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2 个MSL(max segment lifetime)。如果该值设置过小导致,当系统 TIME_WAIT数量超过默认设置的值时,即会抛出上述的警告信息,这 时需要增加net.ipv4.tcp_max_tw_buckets的值,警告信息才会消除。当然 这个值也不能设置过大,对于一个处理大量短连接的服务器,如果是由 服务器主动关闭客户端的连接,将导致服务器端存在大量的处于 TIME_WAIT状态的socket,甚至比处于established状态下的socket多得 多,严重影响服务器的处理能力,甚至耗尽可用的socket而停止服务, TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留 的延迟重发报文影响的机制,是TCP传输必要的逻辑保证。

(2)Linux内核抛出Too m any open files错误,代码如下:

Benchnarking localhost(be patient)
socket:Too many open files(24)
socket:Too sany open files(24)
socket:Too sany open files(24)
socket:Too many open files(24)
socket:Too many open files(24)

每个文件描述符与一个打开文件相对应,不同的文件描述符可以指 向同一个文件。相同的文件可以被不同的进程打开,也可以在同一个进 程中被多次打开。Linux内核对应每个用户打开的文件最大数一般为 1024,需要将该值调高满足大并发网站的访问。

Linux每个用户打开文件最大数永久设置方法,将以下代码加入内 核限制文件/etc/ security/limits.conf的末尾,退出终端,重新登录即生 效,代码如下:

 *  soft  noproc  65535
 *  hard  noproc  65535
 *  soft  nofile  65535
 *  hard  nofile  65535

(3)Linux内核抛出possible SYN flooding on port 80.Sending cookies错误,代码如下:

May 3114:20:14 localhost kernel:possible SYN flooding on port 80.Sending cookies.
May 3114:21:28 localhost kernel;possible SYN flooding on port 80.Sending cookies.
May 3114:22:44 localhost kernel:possible SYN flooding on port 80.Sending cookies.
May 31 14:25:33 localhost kernel:possible SYN flooding on port 80.Sending cookies.
Way 3114:27:06 localhost kernel:possible SYN flooding on port 80.Sending cookies.
May 3114:28:44 localhost kernel:possible SYN flooding on port 80.Sending cookies.
May 31 14:28:51 localhost kernel;possible SYN flooding on port 80.Sending cookies.
May 3114:31:01 localhost kernel:possible SYN flooding on port 80.Sending cookies.

此问题是由于SYN队列已满,而触发SYN cookies,一般是由于大 量的访问或者恶意访问导致,也称之为SYN flooding洪水攻击。

完整的TCP连接的三次握手,假设一个用户A向服务器发送了SYN 报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无 法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务 器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢 弃这个未完成的连接,这段时间的长度称为SYN timeout,一般来说这 个时间是分钟的数量级(大约为30s~2min)。

一个用户出现异常导致服务器的一个线程等待1m in并不是什么很 大的问题,但如果有恶意的攻击者大量模拟这种情况,服务器端将为了 维护一个非常大的半连接列表而消耗非常多的资源,数以万计的半连 接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况 还要不断对这个列表中的IP进行SYN+ACK的重试。

实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢 出崩溃,即使服务器端的系统足够强大,服务器端也将忙于处理攻击者 伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请 求比率非常之小),此时从正常客户的角度看来,服务器失去响应,服 务器拒绝提供服务,服务器受到了DDOS攻击,这里攻击的手段为 DDOS中SYN flooding攻击(SYN洪水攻击)。

防护DDOS攻击有两种手段:一是基于硬件专业防火墙;二是基于Linux内核简单防护。如果攻击流量特别大,单纯配置内核参数是无法 抵挡的,还得依靠专业级硬件防火墙,以下为Linux内核防护DDOS优化 参数,添加如下代码即可:

 net. ipv4. tcp fin timeout=30
 net. ipv4, tcp keepalive tine=1200
 net. ipv4. tcp_syncookies=1
 net. ipv4. tcp_tw_reuse=1
 net. ipv4. tcp_tw_recycle=1
 net. ipv4. ip_local_port_range=1024 65000
 net. ipv4. tcp_max_syn_backlog=8192
 net. ipv4. tcp_nax_tw_buckets= 8000
 net. ipv4. tcp_symack_retries=2
 net. ipv4. tcp_syn_retries=2

(4)Linux内核抛出nf_conntrack:table full,dropping packet.错 误,代码如下:

May 611:15:07 localhost kernel; nf_conntrack: table full, dropping packet. 
May 611:19:13 localhost kernel: nf_conntrack: table full, dropping packet. 
May 611:20:34 localhost kernel: nf conntrack; table full, dropping packet. 
May 611:23:12 localhost kernel: nf_conntrack: table ful1, dropping packet. 
May 611:24:07 localhost kernel: nf_conntrack: table full, dropping packet.
May 611:24:13 localhost kernel; nf_conntrack: table full, dropping packet. 
May 6 11:25:11 localhost kernel; nf_conntrack: table full, dropping packet.
May 6 11:26:25 localhost kernel; nf_conntrack: table full, dropping packet.

由于该服务器开启了iptables防火墙,Web服务器收到了大量的连 接,iptables会把所有的连接都做连接跟踪处理,这样iptables就会有一 个连接跟踪表,当这个表满的时候,就会出现上面的错误。 ip_conntrack是Linux NAT的一个跟踪连接条目的模块,ip_conntrack模块 会使用一个哈希表记录TCP通信协议的established connection记录。

如果是CentOS 6.X系统,需执行modprobe nf_conntrack命令,然后 在内核优化文件中加入如下代码,sysctl-p使其内核文件生效,即可解决 该报错

net. nf_conntrack_max=655360
net, netfilter. nf_conntrack_tcp_tineout_established =36000

如果是CentOS 5.X系统,需执行modprobe ip_conntrack命令,然后 在内核优化文件中加入如下代码,sysctl-p使其内核文件生效,即可解决 该报错。

 net.ipv4,ip_conntrack_max=655350
 net.ipv4.netfilter.ip_conntrack_tcp_tineout_established=10800

发表评论

后才能评论