Linux关闭nf_conntrack模块

【问题描述】

服务器负载正常,但服务器内存飙升影响了中间件的使用,查看/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 模块【我用的这种方法,简单粗暴】

#直接关闭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命令说明

rmmod [-as] module_name

-a  删除所有目前不需要的模块。
-s  把信息输出至syslog常驻服务,而非终端机界面。

modprobe命令说明

modprobe [-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 模块的规则,如果有的话将其移除:

-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

注释 /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 了

3、使用 raw 表,不跟踪连接
iptables 中的 raw 表跟包的跟踪有关,基本就是用来干一件事,通过 NOTRACK 给不需要被连接跟踪的包打标记,也就是说,如果一个连接遇到了 -j NOTRACK,conntrack 就不会跟踪该连接,raw 的优先级大于 mangle, nat, filter,包含 PREROUTING 和 OUTPUT 链。
当执行 -t raw 时,系统会自动加载 iptable_raw 模块(需要该模块存在)。raw 在 2.4 以及 2.6 早期的内核中不存在,除非打了 patch,目前的系统应该都有支持:

$ 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

猜你喜欢

转载自blog.csdn.net/change_can/article/details/108325089