nf_conntrack: table full, dropping packet 解决方案

简介:

“连接跟踪表已满,开始丢包”!相信不少用iptables的同学都会见过这个错误信息吧,这个问题曾经也困扰过我好长一段时间。此问题的解决办法有四种(nf_conntrack 在CentOS 5 / kernel <= 2.6.19中名为 ip_conntrack ):

nf_conntrack一般存放在/proc/net目录下,当防火墙关闭时,这个目录不会出现。

[root@web02 sysconfig]# cd /proc/net/

[root@web02 net]# ls

anycast6   if_inet6       ip_mr_vif   packet     rt6_stats  softnet_stat  udplite6

arp        igmp           ipv6_route  protocols  rt_acct    stat          unix

connector  igmp6          mcfilter    psched     rt_cache   tcp           wireless

dev        ip6_flowlabel  mcfilter6   ptype      snmp       tcp6          xfrm_stat

dev_mcast  ip6_mr_cache   netfilter   raw        snmp6      udp

dev_snmp6  ip6_mr_vif     netlink     raw6       sockstat   udp6

icmp       ip_mr_cache    netstat     route      sockstat6  udplite

[root@web02 net]# /etc/init.d/iptables start

iptables: Applying firewall rules:                         [  OK  ]

防火墙打开后,nf_conntrack出现在/proc/net目录下面

[root@web02 net]# ls

anycast6   igmp6              ipv6_route           protocols  snmp          udp6

arp        ip6_flowlabel      mcfilter             psched     snmp6         udplite

connector  ip6_mr_cache       mcfilter6            ptype      sockstat      udplite6

dev        ip6_mr_vif         netfilter            raw        sockstat6     unix

dev_mcast  ip_mr_cache        netlink              raw6       softnet_stat  wireless

dev_snmp6  ip_mr_vif          netstat              route      stat          xfrm_stat

icmp       ip_tables_matches  nf_conntrack         rt6_stats  tcp

if_inet6   ip_tables_names    nf_conntrack_expect  rt_acct    tcp6

igmp       ip_tables_targets  packet               rt_cache   udp

[root@web02 net]# 

查看nf_conntrack

[root@web02 net]# cat nf_conntrack

ipv4     2 tcp      6 431999 ESTABLISHED src=10.0.0.7 dst=10.0.0.253 sport=22 dport=51326 src=10.0.0.253 dst=10.0.0.7 sport=51326 dport=22 [ASSURED] mark=0 secmark=0 use=2

[root@web02 net]# 

注:nf_conntrack为防火墙记录用户连接的状态连接表


解决方法:


一、关闭防火墙。 简单粗暴,直接有效

chkconfig iptables off 
chkconfig ip6tables off 
service iptables stop 
service ip6tables stop
  切记:在防火墙关闭状态下,不要通过iptables指令(比如 iptables -nL)来查看当前状态!
  因为这样会导致防火墙被启动,而且规则为空。虽然不会有任何拦截效果,但所有连接状态都会
  被记录,浪费资源且影响性能 并可能导致防火墙主动丢包!



二、加大防火墙跟踪表的大小,优化对应的系统参数

  1、状态跟踪表的最大行数的设定,理论最大值 CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)

    以64G的64位操作系统为例,CONNTRACK_MAX = 64*1024*1024*1024/16384/2 = 2097152

    即时生效请执行:

sysctl –w net.netfilter.nf_conntrack_max = 2097152

  2、其哈希表大小通常为总表的1/8,最大为1/2。CONNTRACK_BUCKETS = CONNTRACK_MAX / 8

    同样64G的64位操作系统,哈希最佳范围是 262144 ~ 1048576 。

    运行状态中通过 sysctl net.netfilter.nf_conntrack_buckets 进行查看,通过文件 /sys/module/nf_conntrack/parameters/hashsize 进行设置

    或者新建 /etc/modprobe.d/iptables.conf ,重新加载模块才生效:

options nf_conntrack hashsize = 262144

  3、还有些相关的系统参数`sysctl -a | grep nf_conntrack`可以调优(/etc/sysctl.conf ):

net.netfilter.nf_conntrack_max  =   1048576  
net.netfilter.ip_conntrack_tcp_timeout_established  =   3600  
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



三、使用祼表,添加“不跟踪”标识。如下示例更适合桌面系统或随意性强的服务器。因为它开启了连接的状态机制,方便和外部通信。修改 /etc/sysconfig/iptables 文件:

*raw 
# 对TCP连接不启用追踪,解决ip_contrack满导致无法连接的问题 
-A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK -A PREROUTING -p tcp -m tcp --dport 22 -j NOTRACK 
-A PREROUTING -p tcp -m tcp --dport 21 -j NOTRACK -A PREROUTING -p tcp -m tcp --dport 11211 -j NOTRACK
 -A PREROUTING -p tcp -m tcp --dport 60000:60100 -j NOTRACK -A PREROUTING -p tcp -s 192.168.10.1 -j 
 NOTRACK -A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK -A OUTPUT -p tcp -m tcp --sport 22 -j NOTRACK
  -A OUTPUT -p tcp -m tcp --sport 21 -j NOTRACK -A OUTPUT -p tcp -m tcp --sport 11211 -j NOTRACK -A
   OUTPUT -p tcp -m tcp --sport 60000:60100 -j NOTRACK -A OUTPUT -p tcp -s 192.168.10.1 -j NOTRACK
    COMMIT 
*filter 
# 允许ping 
-A INPUT -p icmp -j ACCEPT # 对本地回路、第5张网卡放行 
-A INPUT -i lo -j ACCEPT -A INPUT -i eth4 -j ACCEPT # 连接状态跟踪,已建立的连接允许传输数据 
-A INPUT -m state --state ESTABLISHED,RELATED,INVALID,UNTRACKED -j ACCEPT # filter表里存在但在raw里不
存在的,默认会进行连接状态跟踪 
-A INPUT -s 192.168.10.31 -p tcp --dport 2669 -j ACCEPT -A INPUT -j REJECT --reject-with 
icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT

或者干脆对所有连接都关闭跟踪,不跟踪任何连接状态。不过规则就限制比较严谨,进出都需要显式申明。示例 /etc/sysconfig/iptables :

四、删除连接跟踪模块`lsmod | grep nf_conntrack`,不使用连接状态的跟踪功能。
本文转自写个博客骗钱博客51CTO博客,原文链接http://blog.51cto.com/dadonggg/1947523如需转载请自行联系原作者

菜鸟东哥
相关文章
|
6月前
|
网络安全 Docker 容器
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule
|
11月前
|
网络协议 数据库
nf_conntrack模块导致服务器Drop Packet
nf_conntrack模块导致服务器Drop Packet
115 0
|
SQL 关系型数据库 MySQL
Packets larger than max_allowed_packet are not allowed(mysql数据查询提示:不允许超过允许的最大数据包)解决方案
Packets larger than max_allowed_packet are not allowed(mysql数据查询提示:不允许超过允许的最大数据包)解决方案
244 0
|
Docker 容器 Kubernetes
解决kubeadm init /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
解决kubeadm init /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1 记录
17310 0