禁用内核不安全网络协议模块须从加载源头、运行时控制和协议栈移除三方面同步收紧:通过modprobe黑名单+install /bin/true永久阻止sctp/dccp/rds加载,sysctl关闭运行时开关,彻底移除ipv6需blacklist ipv6+更新initramfs并重启验证,同时启用modules_disabled=1等机制防止后期注入。

禁用内核中不安全的网络协议模块,不是为了“关端口”本身,而是从协议栈源头移除攻击面——端口只是上层服务暴露的入口,而协议模块一旦加载进内核,即使没开服务、没监听端口,也可能被构造报文触发漏洞(比如 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 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;lsmod | grep sctp 应无输出
彻底移除 IPv6 协议栈(非仅禁用功能)
很多环境只配 net.ipv6.conf.all.disable_ipv6 = 1,这仅关闭接口行为,IPv6 协议栈仍在内存里,不满足等保三级或高安全场景要求。
- 新建 /etc/modprobe.d/blacklist-ipv6.conf,写入:
blacklist ipv6 - 更新启动镜像:
Debian/Ubuntu 执行 sudo update-initramfs -u
RHEL/CentOS 执行 sudo dracut -f - 重启后检查:ls /proc/sys/net/ 不应出现 ipv6 目录;lsmod | grep ipv6 无任何输出
配套加固:防止模块后期被注入
禁用是起点,锁定才是闭环。否则攻击者可能通过提权后加载恶意模块绕过前期配置。
- 启动时加内核参数:modules_disabled=1(写入 GRUB 的 kernel 行),系统启动后无法再用 modprobe 加载任何模块
- 运行时锁定(慎用):echo 1 | sudo tee /sys/module/kernel/parameters/modules_disabled,该操作不可逆
- 同步收紧调试接口:
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1










