解决nf_conntrack: table full问题方法

在web服务器上经常会出现nf_conntrack: table full的问题,解决方法有三个:

1.优化nf_conntrack模块相关内核参数(可作为临时解决办法,治标不治本)

1
2
3
4
5
6
7
8
#加大 ip_conntrack_max 值
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
#降低 ip_conntrack timeout时间
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

2.移除nf_conntrack模块

1
2
3
4
5
[root@git ~]# lsmod | egrep 'ip_tables|conntrack'
nf_conntrack_ipv4 9506 2
nf_defrag_ipv4 1483 1 nf_conntrack_ipv4
nf_conntrack 79758 3 xt_NOTRACK,nf_conntrack_ipv4,xt_state
ip_tables 17831 2 iptable_raw,iptable_filter

A.先将/etc/sysconfig/iptables 中包含state的语句移除,service iptables restart
B.移除模块
modprobe -r xt_NOTRACK nf_conntrack_netbios_ns nf_conntrack_ipv4 xt_state
modprobe -r nf_conntrack

3.使用raw表对特定端口访问不进行跟踪(推荐)
4个表的优先级由高到低的顺序为:raw–>mangle–>nat–>filter

iptablesiptables

1
2
3
4
5
iptables -A INPUT -m state --state RELATED,ESTABLISHED, UNTRACKED -j ACCEPT
iptables -t raw -A PREROUTING -p tcp -m multiport --dports 80,443 -j NOTRACK
iptables -t raw -A PREROUTING -p tcp -m multiport --sports 80,443 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -m multiport --dports 80,443 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -m multiport --sports 80,443 -j NOTRACK

通过观察cat /proc/net/nf_conntrack条目来测试是否更改生效

参考文档:

http://www.361way.com/%E5%86%8D%E7%9C%8Bnf_conntrack-table-full%E9%97%AE%E9%A2%98/2404.html
https://wiki.khnet.info/index.php/Conntrack_tuning
https://timanovsky.wordpress.com/2009/04/10/tuning-linux-firewall-connection-tracker-ip_conntrack/

坚持原创分享,您的支持将鼓励我继续创作