nf_conntrack: table full, dropping packet 解决方案
一、概述
nf_conntrack一般存放在/proc/net目录下,当防火墙关闭时,这个目录不会出现。防火墙打开后,nf_conntrack出现在/proc/net目录下面。
查看nf_conntrack(nf_conntrack为防火墙记录用户连接的状态连接表)
cat nf_conntrack
ipv4 2 tcp 6 86 TIME_WAIT src=10.16.104.60 dst=10.0.32.107 sport=36226 dport=22 src=10.0.32.107 dst=10.16.104.60 sport=22 dport=36226 [ASSURED] mark=0 zone=0 use=2
二、解决方案
1、关闭防火墙
systemd stop iptables
systemd disable iptables
切记:在防火墙关闭状态下,不要通过iptables指令(比如 iptables -nL)来查看当前状态!因为这样会导致防火墙被启动,而且规则为空。虽然不会有任何拦截效果,但所有连接状态都会被记录,浪费资源且影响性能 并可能导致防火墙主动丢包!
2、内核参数优化
2.1、状态跟踪表
理论最大值 CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)
以64G的操作系统为例,CONNTRACK_MAX = 6410241024*1024/16384/2 = 2097152
sysctl –w net.netfilter.nf_conntrack_max = 2097152
2.2、哈希表
哈希表大小通常为总表的1/8,最大为1/2。
CONNTRACK_BUCKETS = CONNTRACK_MAX / 8
同样以64G的操作系统,哈希最佳范围是 262144 ~ 1048576 。
运行状态中通过 sysctl net.netfilter.nf_conntrack_buckets 进行查看,通过文件 /sys/module/nf_conntrack/parameters/hashsize 进行设置。
或者新建 /etc/modprobe.d/iptables.conf ,重新加载模块才生效:
options nf_conntrack hashsize = 262144
2.3、完整参数
net.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
3、使用裸表
添加“不跟踪”标识。如下示例更适合桌面系统或随意性强的服务器。因为它开启了连接的状态机制,方便和外部通信。
修改 /etc/sysconfig/iptables 文件:
#raw表
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
iptables -t raw -A PREROUTING -p tcp -m multiport --dport 80,81,82 -j NOTRACK
iptables -t raw -A PREROUTING -p tcp -m multiport --sport 80,81,82 -j NOTRACK
4、删除nf_conntrack模块
对所有连接都关闭跟踪,不跟踪任何连接状态。不过规则就限制比较严谨,进出都需要显式申明。
lsmod | grep nf_conntrack
modprobe -r xt_NOTRACK nf_conntrack_netbios_ns nf_conntrack_ipv4 xt_state
modprobe -r nf_conntrack
网友评论