11 - 内核参数与模块管理(sysctl、modprobe)
前提条件
- 已完成第一阶段所有内容 + SSH 安全加固 + fail2ban + 服务管理基础
- 以 root 身份登录,或 ops 用户执行
sudo -i切换至 root 环境 - 系统运行在 Debian 12 Bookworm
- 虚拟机环境:VMware Workstation Pro(建议 4 GB+ 内存以观察参数效果)
全局参数
主机名 linuxdc,IP 192.168.1.100/24,SSH 端口 2222,运维用户 ops
详细步骤
1. sysctl 简介与查看当前内核参数
sysctl 用于在运行时读取和修改内核参数(无需重启),生产环境用于优化性能、网络安全、防止 DoS 等。
sysctl vm.swappiness # 查看单个参数
sysctl -a | grep net.ipv4 # 查看所有 IPv4 相关参数
sysctl -a | grep vm # 查看所有内存管理参数
2. 临时修改内核参数(立即生效,重启后丢失)
# 降低 swap 使用倾向(适合内存充足的服务器)
sysctl vm.swappiness=10
# 验证
sysctl vm.swappiness
临时修改的局限性
通过 sysctl key=value 直接修改只在当前运行时生效,系统重启后恢复默认值。生产环境必须使用持久化配置文件。
3. 永久修改内核参数(推荐方式)
创建自定义配置文件(/etc/sysctl.d/ 目录下,不要修改 /etc/sysctl.conf):
vim /etc/sysctl.d/99-production.conf
推荐生产安全与性能参数集合:
# === 网络安全加固 ===
# 拒绝接收 ICMP 重定向(防止路由欺骗)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# 关闭 IP 转发(非路由器/NAT 主机必须关闭)
net.ipv4.ip_forward = 0
# 防 SYN Flood 攻击
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
# 忽略伪造的 ICMP 广播(防止 Smurf 攻击)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# === 内存管理优化 ===
# 降低 swap 使用倾向(0=尽量不用,100=积极使用,服务器推荐 10)
vm.swappiness = 10
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
# === 文件与连接资源 ===
fs.file-max = 1000000
net.ipv4.ip_local_port_range = 1024 65535
# === 系统安全 ===
# ASLR 地址空间布局随机化(2 = 完全随机化,最安全)
kernel.randomize_va_space = 2
# panic 后 10 秒自动重启(生产服务器推荐)
kernel.panic = 10
应用配置:
# 应用所有 /etc/sysctl.d/ 和 /etc/sysctl.conf 下的配置
sysctl --system
# 或只加载指定文件
sysctl -p /etc/sysctl.d/99-production.conf
检查点
sysctl vm.swappiness # 应输出 vm.swappiness = 10
sysctl net.ipv4.tcp_syncookies # 应输出 net.ipv4.tcp_syncookies = 1
sysctl net.ipv4.ip_forward # 应输出 net.ipv4.ip_forward = 0
4. 内核模块管理(modprobe)
查看已加载模块:
lsmod # 列出所有已加载模块
lsmod | grep ipv6 # 查看 IPv6 模块状态
modinfo ipv6 # 查看模块详细信息
临时卸载模块(重启后恢复):
modprobe -r ipv6
永久禁用模块(推荐方式):
vim /etc/modprobe.d/blacklist-ipv6.conf
内容:
# 禁用 IPv6 模块(如果环境确认不需要 IPv6)
blacklist ipv6
# install 行确保即使其他模块请求加载也不会生效
install ipv6 /bin/true
更新 initramfs 并重启验证:
update-initramfs -u
reboot
重启后确认:
lsmod | grep ipv6 # 应无输出
其他常见需要禁用的模块(按需选择):
# 禁用 USB 存储(高安全环境)
echo "blacklist usb-storage" > /etc/modprobe.d/blacklist-usb-storage.conf
# 禁用蓝牙(服务器通常不需要)
echo "blacklist bluetooth" > /etc/modprobe.d/blacklist-bluetooth.conf
禁用模块前确认依赖
执行 modprobe --show-depends <模块名> 确认无其他模块依赖后再禁用,否则可能导致相关功能失效。VMware 虚拟机中禁用 IPv6 通常无影响,但某些应用程序(如 Docker)可能依赖 IPv6 接口。
5. 验证与监控
sysctl -a | grep -E "swappiness|syncookies|accept_redirects|ip_forward"
cat /proc/sys/net/ipv4/tcp_syncookies # 直接读取 procfs(与 sysctl 等价)
cat /proc/sys/vm/swappiness
检查点
所有关键安全参数(accept_redirects=0、tcp_syncookies=1、ip_forward=0、randomize_va_space=2)均符合预期值。
实践任务
- 创建
/etc/sysctl.d/99-production.conf,添加vm.swappiness=10和net.ipv4.tcp_syncookies=1,执行sysctl --system应用并验证 - 检查当前所有 IPv4 转发相关参数,确保
ip_forward=0 - 永久禁用 ipv6 模块(如果你的环境不需要 IPv6),重启后用
lsmod确认 - 用
sysctl -a | grep syn查看 SYN flood 防护参数是否全部生效
自测问题
1. sysctl --system 命令会加载哪些位置的配置文件?
按照优先级从低到高依次加载(后加载的同名参数会覆盖前面的):
/etc/sysctl.conf(全局默认配置)/etc/sysctl.d/*.conf(用户自定义配置,按文件名字母序加载)/run/sysctl.d/*.conf(运行时动态配置)/usr/lib/sysctl.d/*.conf(发行版提供的默认配置)
因此 99-production.conf 的数字前缀确保它在大多数其他配置之后加载,优先级最高。
2. 为什么生产环境通常把 vm.swappiness 设置为 10 或更低?
vm.swappiness 控制内核将内存页换出到 swap 的倾向,默认值 60 表示内存使用率达到 40% 时就开始积极使用 swap。对于数据库、中间件等对延迟敏感的服务,频繁 swap 操作会导致响应时间从毫秒级跳升到秒级(磁盘 I/O 比内存慢几个数量级)。设置为 10 表示只有在内存极度紧张时才使用 swap,优先将内存留给进程使用。设为 0 则表示几乎不使用 swap(OOM 时直接 kill 进程),生产服务器通常不建议设为 0。
3. 禁用 ipv6 模块的两种常见方法是什么?哪种更彻底?
方法一:/etc/modprobe.d/blacklist-ipv6.conf 中 blacklist ipv6 + install ipv6 /bin/true,然后 update-initramfs -u 并重启。这种方法更彻底,模块不会被加载进内核,lsmod 中不会出现 ipv6 条目。
方法二:通过 sysctl 禁用 IPv6 功能(不禁用模块本身):
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
方法二只是关闭 IPv6 协议栈,模块仍然加载在内核中,安全性略低于方法一,但配置更简单且可动态切换。
4. tcp_syncookies=1 的作用是什么?在什么攻击场景下最有效?
TCP SYN Cookie 是防御 SYN Flood 攻击的机制。正常 TCP 三次握手中,服务器收到 SYN 包后会在内存中分配半连接(SYN_RECV 状态)等待 ACK,SYN Flood 攻击通过海量伪造 SYN 包耗尽服务器半连接队列,使合法连接无法建立。启用 SYN Cookie 后,服务器不再为每个 SYN 分配内存,而是将连接信息编码进 ISN(初始序列号)作为 Cookie 发回,只有收到合法的带正确 Cookie 的 ACK 才完成握手,完全消除了半连接队列耗尽的风险。最有效的场景是大规模分布式 SYN Flood(DDoS)攻击。
总结
通过 sysctl 和 modprobe 对内核进行安全与性能调优是服务器硬化的重要一环。本章配置的 99-production.conf 可作为生产模板复用,后续防火墙、容器等章节会进一步依赖这些参数(如 net.ipv4.ip_forward 在容器网络中需要开启)。