APP下载

处理Linux服务器异常丢包

2018-03-03

网络安全和信息化 2018年7期
关键词:报文命令端口

故障现象

单位的一台Linux服务器为外网提供Web服务,最近当客户进行访问时,经常出现连接失败或者端口访问超时等问题,给公司业务造成不利影响。在内网对该服务器进行大量连接检测时,发现频频丢包。使用“vi”工 具 查 看“/var/log/messages”日志文件,发现“Kernel:nf_conntrack:table full,dropping packet”,kernel: printk:1 messages suppressed之类的错误信息,这些信息说明,该故障与Linux的连接追踪机制相关。

故障分析

我们知道,在Linux中内置了NetFilter防火墙模块,使用IPtables工具可以对其进行灵活调整。IPtables允许管理员使用连接跟踪(connection tracking) 功能来检查和限制到内部网络中可用服务的连接,并在一个内存数据结构中记录了连接状态。因为Netfilter防火墙使用了nf_conntrack内核模块实现连接跟踪功能,而上述Linux服务器不仅开启了防火墙功能,而且在网站流量非常高的时候最容易会出现上述问题。

其原因就在于,该Linux服务器收到了大量的连接,IPtables会把所有连接信息都做连接跟踪处理,其中包括源 IP、目的 IP、源端口、目的端口、协议类型、协议状态和超时等。这样,IPtables就会有一个链接跟踪表,利用这些信息,可以让管理员更加灵活地设置过滤策略。

执 行“cat /proc/net/nf_conntrack命令,可以查看当前连接追踪信息。对该表中的内容进行分析,可以看到实际上使用了IPtables的state模块进行匹配,并执行了特定的过滤规则,Iptables支 持 基 于INVALID(无效的报文请求),ESTABLISHED(已建立的连接),NEW(新连接发送的第一个包)和RELATED(数据连接和命令连接之间的关系)等状态的过滤规则。但是,一旦该连接跟踪表被填满以后,就会发生丢包,导致网络不稳定。执行“sysctl net.netfilter.nf_conntrack_max” 和“sysctl net.netfilter.nf_conntrack_count”命令,对比预设的最大追踪数和已存在的追踪条目,可以发现两者几乎相等。

初步解决故障

为了解决该问题,可以 执 行“vi /etc/sysctl.conf” 命 令,在 目 标 配置文件中将输入“net.nf_conntrack_max =65000”,“net.netfilter.nf_conntrack_max =65000”行,增大连接追踪表的容量,当然具体数值可以根据实际情况更改。

经过这样的调整,虽然暂时解决了上述故障,但是经过一段时间,尤其是访问量加大后,又会导致追踪表被填满,进而重新出现上述故障。

为 此 执 行“vi /etc/sysctl.conf” 命 令, 输入“net.nf_conntrack_max = 855360”,“net.netfilter.nf_conntrack_max = 855360”,“net.netfilter.np_conntrack_tcp_timeout_established= 1000”等内容,进一步增大追踪表容量,并调整追踪表超时时间。执行“vi /etc/modprobed/netfilter.conf”命令,在其中输入“options nf_conntrack hashsize=855360”行,调整存储跟踪连接条目列表的哈希表的数量。之后执行“/etc/init.d/iptable restart”命令,重新加载跟踪连接模块,更新跟踪连接条目列表的哈西表的数量。执行“sysctl-p”命令,使得上述修改生效。

虽然经过以上修改,可以在一定程度上解决问题,但要想彻底解决问题,必须关闭连接追共功能。

故障解决

在开启了Netfilter防火墙的情况下,如果激活了连接追踪功能,在应对比较大的访问流量时,就容易出现网络访问不畅的问题,最好的处理方法是关闭连接追踪功能。关闭的方法有多种,例如重新编译Linux内核,在其中取消“Netfilter connection tracking support”项目。在编写防火墙规则时,在IPtable语句中禁用“-m state”模块,并修改“/etc/init.d/iptables”文 件, 在“NF_MODULES_COMMON=”栏中删除其中的“nf_nat nf_conntrack” 关键字等。不过最简单直接的办法是在RAW表中使用“NOTRACK”关键字来禁用连接追踪功能。我们知道,在Netfilter模块的RAW表中为IPtable提供了一种不经过状态追踪的机制,在访问流量较大的服务器上使用RAW表,可以有效避免连接追踪功能引发的问题。

例如在本案例中,对外提供Web服务的Linux主机的IP为 xxx.xxx.xxx.xxx,那么在命令行中执行“iptable–t raw -A PREROUTING -p tcp -j NOTRACk”,“iptable–t raw -A OUTPUT -p tcp-j NOTRACk”,“iptable –A INPUT -p tcp xxx.xxx.xxx.xxx --sport 80 -j ACCEPT”,“iptable –A OUTPUT -p tcp -j ACCEPT”。

经过测试,说明如果在OUTPUT链中进行了相关设置,那么在PREROUTING链中也必须针对特定端口配置规则,否则数据封包无法出去。其原因在于,连接跟踪的状态主要在PREROUTING和OUTPUT两个链被触发,分别对应外来报文和本级产生报文。当禁用了连接追踪工后,执行“vi /var/log/messages”命令,在日志中就不再出现上述错误提示。执行“lsmod | gerp nf_conntrack”命令,不会显示任何内容。

应该特别注意的是,当使用Netfilter开启了NAT地址转换能后,是不允许禁用连接追踪功能的,只能采用提高连接追踪表容量的方法加以应对。

猜你喜欢

报文命令端口
基于J1939 协议多包报文的时序研究及应用
只听主人的命令
一种端口故障的解决方案
CTCS-2级报文数据管理需求分析和实现
硬件解耦三端口变换器的软开关分析与仿真
浅析反驳类报文要点
交换机生成树安全
移防命令下达后
ATS与列车通信报文分析
这是人民的命令