双保险避免iptables_nf_conntrack table full问题

20161215162039
总结了下网上对该问题的处理方式有三种。
方法一:修改参数法
如下:
centos6、centos7使用:
vi /etc/sysctl.conf
net.nf_conntrack_max = 6553500
net.netfilter.nf_conntrack_max = 6553500
net.netfilter.nf_conntrack_tcp_timeout_established = 180

增加完以上内容后,通过sysctl -p 使配置生效 。
不过该方法有两个缺点:一是重启iptables后,ip_conntrack_max值又会变成65535默认值,需要重新sysctl -p ,如果是高并发服务器,很快就会再次出现iptables_nf_conntrack table full问题。

方法二:使用RAW表,跳过记录法
首先先认识下什么是raw表?做什么用的?
iptables有5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING,4个表:filter,nat,mangle,raw 。
4个表的优先级由高到低的顺序为:raw–>mangle–>nat–>filter
举例来说:如果PRROUTING链上,即有mangle表,也有nat表,那么先由mangle处理,然后由nat表处理 。
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。
RAW表可以 style=”color:#E53333;”>应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪处理,以提高用户的访问速度 。

具体操作方法如下:
1、修改/etc/sysconfig/iptables 文件中的-A RH-Firewall-1-INPUT -m state –state RELATED,ESTABLISHED,UNTRACKED -j ACCEPT 行。增加以下部分,保存并restart iptables 。
2、运行下面的语句:
iptables -t raw -A PREROUTING -p tcp -m multiport –dports 80,3128 -j NOTRACK
iptables -t raw -A PREROUTING -p tcp -m multiport –sports 80,3128 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -m multiport –dports 80,3128 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -m multiport –sports 80,3128 -j NOTRACK
如果只是一个端口,改为下面的语句:
iptables -t raw -A PREROUTING -p tcp -m tcp –dport 80 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -m tcp –sport 80 -j NOTRACK
iptables -t raw -A PREROUTING -p tcp -m tcp –sport 80 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -m tcp –dport 80 -j NOTRACK
注:第1步很重要,如果第1处没改,执行后面的语句会造成相应的端口不能访问。我使用该方法时,就因为没有执行第一步的操作,造成web访问不能使用。
nginx服务器建议使用:
/sbin/iptables -A INPUT -m state –state ESTABLISHED,RELATED,UNTRACKED -j ACCEPT
/sbin/iptables -t raw -A PREROUTING -p tcp –dport 80 -j NOTRACK
/sbin/iptables -t raw -A PREROUTING -p tcp –dport 443 -j NOTRACK
/sbin/iptables -t raw -A OUTPUT -p tcp –sport 80 -j NOTRACK
/sbin/iptables -t raw -A OUTPUT -p tcp –sport 443 -j NOTRACK

方法三:移除模块法
[root@localhost log]# /sbin/lsmod | egrep ‘ip_tables|conntrack’
nf_conntrack_ipv6 8748 2
nf_defrag_ipv6 12182 1 nf_conntrack_ipv6
nf_conntrack 79453 2 nf_conntrack_ipv6,xt_state
ipv6 322541 209 ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
执行上面的语句,不难发现state模块和nf_conntrack之间是有依赖关系的。所以想要卸载nf_conntrack模块的话,必须也要把state模块移除,不然,其会自动启用nf_conntrack模块。

操作方法如下:
1、先将/etc/sysconfig/iptables 中包含state的语句移除,并restart iptables 。
2、执行语句

modprobe -r xt_NOTRACK nf_conntrack_netbios_ns nf_conntrack_ipv4 xt_state
modprobe -r nf_conntrack
执行完查看/proc/net/ 下面如果没用了 nf_conntrack ,就证明模块移除成功了。

总结:
以上三种方法种,推荐同时采用第一种和第二种方法,双保险,避免iptables_nf_conntrack table full问题。

配置文件总结:
/etc/sysctl.conf 增加如下
net.nf_conntrack_max = 6553500
net.netfilter.nf_conntrack_max = 6553500
net.netfilter.nf_conntrack_tcp_timeout_established = 180

如果是NGINX代理iptables设置
/sbin/iptables -F
/sbin/iptables -t raw -F
/sbin/iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
/sbin/iptables -A INPUT -s 127.0.0.1 -j ACCEPT
/sbin/iptables -A INPUT -s 192.168.1.11 -j ACCEPT
/sbin/iptables -A INPUT -m state –state ESTABLISHED,RELATED,UNTRACKED -j ACCEPT
/sbin/iptables -A INPUT -p tcp –dport 22 -j ACCEPT
/sbin/iptables -A INPUT -p tcp –dport 80 -j ACCEPT
/sbin/iptables -A INPUT -p tcp –dport 443 -j ACCEPT
/sbin/iptables -t raw -A PREROUTING -p tcp –dport 80 -j NOTRACK
/sbin/iptables -t raw -A PREROUTING -p tcp –dport 443 -j NOTRACK
/sbin/iptables -t raw -A OUTPUT -p tcp –sport 80 -j NOTRACK
/sbin/iptables -t raw -A OUTPUT -p tcp –sport 443 -j NOTRACK
/sbin/iptables -A OUTPUT -j ACCEPT
/sbin/iptables -A INPUT -j REJECT
/sbin/iptables -A FORWARD -j REJECT
/sbin/service iptables save
echo ok
查看 iptables RAW链命令
/sbin/iptables -t raw -L -n
此类问题,也可以通过BOYURL工具(https://git.oschina.net/aqztcom/boyurl),进行iptables初始化

未经允许不得转载:Ppabc博客 » 双保险避免iptables_nf_conntrack table full问题