故障描述:
全新的Linux服务器配置iptables开启DNAT后,用户通过公网访问内网服务器很慢,具体表现是下载只有1Kb/s ,服务器网页加载也是相当的慢...但通过局域网访问正常
系统环境:
Dell PowerEdge R620、4块博通网卡、RHEL5.8 x64 2.6.18-308.el5
故障分析:
1.通过eth1从内网访问正常,说明后台服务是OK的
2.停用iptables后发现故障不再,初步判定是iptables引起的问题,刚开始怀疑是规则写错了,调试几次仍然不行,索性把iptables规则全重写,默认策略先全部开启,主要规则如下:(ip和端口已和谐···)
3.发现开启iptables后故障依旧,这下纠结了,很明显是iptables引起的问题...查看系统日志也没有发现什么异常的信息,突然想到iptables有个调试跟踪模块,说不定可以帮忙定位问题,于是在iptables脚本中加入了如下几行:(主要是第二行ip_conntrack,由于此功能比较耗空间,所以一般调试时才开启)
再查看系统日志这下有发现了...
提示:received packets cannot be forwarded while LRO is enabled....
(当开启LRO模式时,eth1上收到的包不能被转发...)
经过查询资料发现是网卡BNX2X驱动的TPA模式所致...
参考:http://docs.oracle.com/cd/E20065_01/doc.30/e18546/toc.htm
于是参考Oracle的解决方案,修改/etc/modprobe.conf文件,添加options bnx2x disable_tpa=1关闭网卡的TPA模式,重启网络服务问题得到解决...
关于TPA:http://ieeexplore.ieee.org/xpl/articleDetails.jsp?reload=true&arnumber=1493706