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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码定义了两个结构体,分别是 nf_conn 和 nf_conntracknf_conn 结构体包含了以下成员: - ct_general:一个 nf_conntrack 结构体,用于跟踪连接的一般信息。 - lock:自旋锁,用于保护对 nf_conn 结构体的并发访问。 - cpu:一个 16 位的无符号整数,表示该连接所在的 CPU 编号。 - zone:一个 nf_conntrack_zone 结构体,在 CONFIG_NF_CONNTRACK_ZONES 宏开启时有效。 - tuplehash:一个包含了 IP_CT_DIR_MAX 个元素的 nf_conntrack_tuple_hash 数组,用于存储连接的原始和回复的元组信息。 - status:一个无符号长整型数,用于表示连接的状态。 - timeout:一个 32 位的无符号整数,表示连接被认为已经死亡的时间戳(以 jiffies32 表示)。 - ct_net:一个 possible_net_t 类型的变量,表示连接所属的网络命名空间。 - nat_bysource:一个 hlist_node 结构体,在 CONFIG_NF_NAT 宏开启时有效。 - __nfct_init_offset:一个空结构体,用于初始化其他成员。 - master:一个指向 nf_conn 结构体的指针,表示该连接的期望连接(expectation)。 - mark:一个 32 位的无符号整数,在 CONFIG_NF_CONNTRACK_MARK 宏开启时有效。 - secmark:一个 32 位的无符号整数,用于安全标记,在 CONFIG_NF_CONNTRACK_SECMARK 宏开启时有效。 - ext:一个指向 nf_ct_ext 结构体的指针,表示连接的扩展信息。 - proto:一个联合体,用于存储其他模块保留的数据。 nf_conntrack 结构体包含了一个名为 use 的 atomic_t 类型成员,用于记录 nf_conntrack 结构体的使用计数。atomic_t 是一个原子类型,用于实现原子操作的计数器。 需要注意的是,这段代码只是结构体的定义,没有展示结构体成员的具体实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值