禁用不需要的内核模块是收敛网络攻击面的关键动作,须从加载源头(modprobe黑名单+install /bin/true)、运行时控制(sysctl开关)和协议栈启用(如彻底移除IPv6模块)三方面同步收紧,避免仅停服务或配防火墙导致的残留风险。

禁用不需要的内核模块是收敛网络攻击面的关键动作,不能只靠停服务或配防火墙——那些协议模块一旦加载进内核,即使没运行对应服务,也可能被利用(比如 SCTP 的 CVE-2021-20322 堆溢出)。必须从加载源头、运行时控制、协议栈启用三方面同步收紧。
确认哪些模块正在运行或可加载
先摸清底数,避免误禁关键模块:
- 查已加载的协议模块:运行 lsmod | grep -E '(sctp|dccp|rds|ipv6)',有输出说明模块活跃
- 查系统是否具备但未加载的模块:执行 find /lib/modules/$(uname -r) -name '*sctp*' -o -name '*dccp*' -o -name '*rds*' -o -name 'ipv6.ko*'
- 用 modinfo 模块名 看描述和依赖,比如 modinfo sctp 能看到它被 nf_conntrack_sctp 引用,贸然卸载可能断连接
永久禁用非必要协议模块(SCTP/DCCP/RDS)
这些协议在绝大多数业务中完全不用,却显著扩大内核攻击面。仅黑名单不够,必须双保险:
- 在 /etc/modprobe.d/disable-uncommon-proto.conf 中写入:
install sctp /bin/true
install dccp /bin/true
install rds /bin/true - 同时在 /etc/sysctl.conf 加运行时开关:
net.sctp.enabled = 0
net.dccp.enabled = 0 - 执行 sudo sysctl -p 生效,并重启后验证:cat /proc/sys/net/sctp/enabled 应返回 0
彻底禁用 IPv6 协议栈(高安全场景适用)
如果业务确定不用 IPv6(如等保三级环境、隔离网),建议移除整个协议栈,而非仅关闭接口:
- 编辑 /etc/modprobe.d/blacklist-ipv6.conf,加入:
blacklist ipv6 - 更新 initramfs:sudo update-initramfs -u(Debian/Ubuntu)或 sudo dracut -f(RHEL/CentOS)
- 重启后检查:ls /proc/sys/net/ 不应再出现 ipv6 目录;lsmod | grep ipv6 无输出
- 注意:sysctl net.ipv6.conf.all.disable_ipv6=1 只是禁用功能,协议栈仍在,不满足高安全要求
加固内核模块加载机制
防止攻击者后期注入恶意模块:
- 启动时加参数 modules_disabled=1(写入 GRUB 配置 kernel 行),使系统启动后无法再 modprobe 加载任何模块
- 或运行时锁定:echo 1 | sudo tee /sys/module/kernel/parameters/modules_disabled(需 root 权限且不可逆,慎用)
- 配合 sysctl 关键防护项:
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
vm.mmap_min_addr = 65536


















