【问题描述】
服务器负载正常,但服务器内存飙升影响了中间件的使用,查看/var/log/messages 日志存在大量
kernel: nf_conntrack: table full, dropping packet
【说明】
nf_conntrack 模块在 kernel 2.6.15(2006-01-03 发布) 被引入,工作在 3 层,支持 IPv4 和 IPv6,取代只支持 IPv4 的 ip_connktrack,用于跟踪连接的状态,供其他模块使用,它会使用一个哈希表来记录 established 的记录。需要 NAT 的服务都会用到它,例如防火墙、Docker 等。
开启nf_conntrack模块会导致不需要的CPU消耗,甚至可能导致table记录满产生丢包问题,因此可以考虑关闭nf_conntrack模块提升性能。
【解决方法】
1、不使用 nf_conntrack 模块【我用的这种方法,简单粗暴】
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#直接关闭iptables、ip6tables、firewalld等相关服务,并关闭开机自启动 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config #关闭SELinux setenforce 0 systemctl stop firewalld # CentOS 7 service iptables stop # CentOS 6/7 service ip6tables stop # CentOS 6/7 chkconfig --level 345 ip6tables off chkconfig --level 345 iptables off chkconfig | grep tables # 确定全部关闭 #查看nf_conntrack模块使用情况 lsmod |grep nf_conntrack #移除nf_conntrack模块 sudo rmmod iptable_nat sudo rmmod ip6table_nat sudo rmmod nf_defrag_ipv4 sudo rmmod nf_defrag_ipv6 sudo rmmod nf_nat sudo rmmod nf_nat_ipv4 sudo rmmod nf_nat_ipv6 sudo rmmod nf_conntrack sudo rmmod nf_conntrack_ipv4 sudo rmmod nf_conntrack_ipv6 sudo rmmod xt_conntrack # 需要开启模块就使用sudo modprobe
rmmod命令说明
1
2
3
4rmmod [-as] module_name -a 删除所有目前不需要的模块。 -s 把信息输出至syslog常驻服务,而非终端机界面。
modprobe命令说明
1
2
3
4
5
6
7
8
9
10modprobe [-lcfr] module_name -c :列出目前系统所有的模块 -l :列出目前在/lib/modules/`uname -r`/kernel当中的所有模块完整文件名 -f:强制加载该模块 -r:类似rmmod 就是删除某个模块 #未使用(Used by栏为0)的模块才能禁用 #如果Used by不为0,先禁用后面列出的模块 #如果后面没模块名,就是被进程使用。 #没有简单的方法能查到调用这些模块的都是什么进程,基本靠猜
2、使用防火墙要移除state模块,因为使用该模块需要加载 nf_conntrack。确保 iptables 规则中没有出现类似 state 模块的规则,如果有的话将其移除:
1
2-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
注释 /etc/sysconfig/iptables-config 中的:
1
2IPTABLES_MODULES="ip_conntrack_netbios_ns"
移除 nf_conntrack 模块:
1
2
3
4$ sudo modprobe -r xt_NOTRACK nf_conntrack_netbios_ns nf_conntrack_ipv4 xt_state $ sudo modprobe -r nf_conntrack $ # 现在 /proc/net/ 下面应该没有 nf_conntrack 了
3、使用 raw 表,不跟踪连接
iptables 中的 raw 表跟包的跟踪有关,基本就是用来干一件事,通过 NOTRACK 给不需要被连接跟踪的包打标记,也就是说,如果一个连接遇到了 -j NOTRACK,conntrack 就不会跟踪该连接,raw 的优先级大于 mangle, nat, filter,包含 PREROUTING 和 OUTPUT 链。
当执行 -t raw 时,系统会自动加载 iptable_raw 模块(需要该模块存在)。raw 在 2.4 以及 2.6 早期的内核中不存在,除非打了 patch,目前的系统应该都有支持:
1
2
3
4$ sudo iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT $ sudo iptables -t raw -A PREROUTING -p tcp -m multiport --dport 80,8080 -j NOTRACK $ sudo iptables -t raw -A PREROUTING -p tcp -m multiport --sport 80,8080 -j NOTRACK
最后
以上就是要减肥蜜蜂最近收集整理的关于Linux关闭nf_conntrack模块的全部内容,更多相关Linux关闭nf_conntrack模块内容请搜索靠谱客的其他文章。
发表评论 取消回复