nf_conntrack: table full, dropping packet问题的解决思路 |
本文标签:table,full,dropping,packet 介绍:nf_conntrack 工作在 3 层,支持 IPv4 和 IPv6,而 ip_conntrack 只支持 IPv4 。目前,大多的 ip_conntrack_* 已被 nf_conntrack_* 取代,很多 ip_conntrack_* 仅仅是个 alias,原先的 ip_conntrack 的 /proc/sys/net/ipv4/netfilter/ 依然存在,但是新的 nf_conntrack 在 /proc/sys/net/netfilter/ 中,这个应该是做个向下的兼容: 复制代码 代码如下:$ pwd /proc/sys/net/ipv4/netfilter $ ls ip_conntrack_buckets ip_conntrack_tcp_loose ip_conntrack_tcp_timeout_syn_recv ip_conntrack_checksum ip_conntrack_tcp_max_retrans ip_conntrack_tcp_timeout_syn_sent ip_conntrack_count ip_conntrack_tcp_timeout_close ip_conntrack_tcp_timeout_syn_sent2 ip_conntrack_generic_timeout ip_conntrack_tcp_timeout_close_wait ip_conntrack_tcp_timeout_time_wait ip_conntrack_icmp_timeout ip_conntrack_tcp_timeout_established ip_conntrack_udp_timeout ip_conntrack_log_invalid ip_conntrack_tcp_timeout_fin_wait ip_conntrack_udp_timeout_stream ip_conntrack_max ip_conntrack_tcp_timeout_last_ack ip_conntrack_tcp_be_liberal ip_conntrack_tcp_timeout_max_retrans $ pwd /proc/sys/net/netfilter $ ls nf_conntrack_acct nf_conntrack_tcp_timeout_close nf_conntrack_buckets nf_conntrack_tcp_timeout_close_wait nf_conntrack_checksum nf_conntrack_tcp_timeout_established nf_conntrack_count nf_conntrack_tcp_timeout_fin_wait nf_conntrack_events nf_conntrack_tcp_timeout_last_ack nf_conntrack_events_retry_timeout nf_conntrack_tcp_timeout_max_retrans nf_conntrack_expect_max nf_conntrack_tcp_timeout_syn_recv nf_conntrack_generic_timeout nf_conntrack_tcp_timeout_syn_sent nf_conntrack_icmp_timeout nf_conntrack_tcp_timeout_time_wait nf_conntrack_log_invalid nf_conntrack_tcp_timeout_unacknowledged nf_conntrack_max nf_conntrack_udp_timeout nf_conntrack_tcp_be_liberal nf_conntrack_udp_timeout_stream nf_conntrack_tcp_loose nf_log/ conntrack_tcp_max_retrans 查看当前的连接数: 复制代码 代码如下:# grep ip_conntrack /proc/slabinfo ip_conntrack 38358 64324 304 13 1 : tunables 54 27 8 : slabdata 4948 4948 216 查出目前 ip_conntrack 的排名: 复制代码 代码如下:$ cat /proc/net/ip_conntrack | cut -d -f 10 | cut -d = -f 2 | sort | uniq -c | sort -nr | head -n 10 nf_conntrack/ip_conntrack 跟 nat 有关,用来跟踪连接条目,它会使用一个哈希表来记录 established 的记录 。nf_conntrack 在 2.6.15 被引入,而 ip_conntrack 在 2.6.22 被移除,如果该哈希表满了,就会出现: 复制代码 代码如下:nf_conntrack: table full, dropping packet 解决此问题有如下几种思路 。 1.不使用 nf_conntrack 模块 注释 /etc/sysconfig/iptables-config 中的: 复制代码 代码如下:IPTABLES_MODULES="ip_conntrack_netbios_ns" 移除 nf_conntrack 模块: 复制代码 代码如下:$ sudo modprobe -r xt_NOTRACK nf_conntrack_netbios_ns nf_conntrack_ipv4 xt_state $ sudo modprobe -r nf_conntrack 现在 /proc/net/ 下面应该没有 nf_conntrack 了 。 2.调整 /proc/ 下面的参数 对于 HASHSIZE,默认的有这样的转换关系: 可以通过 echo 直接修改目前系统 CONNTRACK_MAX 以及 HASHSIZE 的值: 复制代码 代码如下:$ sudo su -c "echo 100000 > /proc/sys/net/netfilter/nf_conntrack_max" $ sudo su -c "echo 50000 > /proc/sys/net/netfilter/nf_conntrack_buckets" 还可以缩短 timeout 的值: 复制代码 代码如下:$ sudo su -c "echo 600 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established" 3.使用 raw 表,不跟踪连接 上面三种方式,最有效的是 1 跟 3,第二种治标不治本 。 参考文档: |