sysctl 内核安全加固是 Linux 服务器安全基线中最基础也最容易被忽略的一环。通过调整 /proc/sys 下的内核运行时参数,可以关闭 IP 转发、防 IP 欺骗、缓解 SYN 洪水、禁止内核转储敏感信息等,从系统层降低被攻击面。本文给出可直接复制使用的完整配置与验证流程。
适用场景
- 服务器上线前的安全基线加固
- 公网暴露的 Web、数据库、网关服务器
- 需要满足等保/合规要求的系统配置审计
前置条件
- Linux 系统(本文以 CentOS 7+/Ubuntu 22.04 为例)
- root 权限
- 备份原有 /etc/sysctl.conf
原理说明
Linux 内核将运行参数暴露在 /proc/sys 虚拟文件系统中,sysctl 命令是这些参数的统一管理接口。修改参数后是否立即生效取决于参数类型:net 类参数大多可热更新,kernel 类部分参数需重启。持久化配置写入 /etc/sysctl.conf,开机由 systemd-sysctl 自动加载。合理配置可显著降低 IP 欺骗、SYN 洪水、ICMP 重定向劫持、内核信息泄露等攻击面。
操作步骤
第一步:备份现有配置
cp /etc/sysctl.conf /etc/sysctl.conf.bak
sysctl -a | wc -l # 查看当前参数总数
第二步:写入安全加固配置
编辑 /etc/sysctl.conf,追加以下完整配置:
# ===== 网络层加固 =====
net.ipv4.ip_forward = 0 # 关闭 IP 转发
net.ipv4.conf.all.accept_redirects = 0 # 拒绝 ICMP 重定向
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0 # 不发送重定向
net.ipv4.conf.all.accept_source_route = 0 # 禁用源路由
net.ipv4.conf.all.rp_filter = 1 # 开启反向路径过滤,防 IP 欺骗
net.ipv4.conf.default.rp_filter = 1
# ===== SYN 洪水防御 =====
net.ipv4.tcp_syncookies = 1 # 开启 SYN Cookies
net.ipv4.tcp_syn_retries = 2 # 减少 SYN 重试次数
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_max_syn_backlog = 2048 # 加大半连接队列
# ===== 内核防护 =====
kernel.kptr_restrict = 1 # 限制 /proc/kallsyms 暴露内核地址
kernel.dmesg_restrict = 1 # 禁止普通用户读 dmesg
kernel.core_uses_pid = 1
fs.suid_dumpable = 0 # 禁止 SUID 程序 core dump
# ===== 资源限制 =====
net.core.somaxconn = 1024
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
第三步:加载并验证
sudo sysctl -p # 加载配置(跳过注释与未知参数)
sudo sysctl net.ipv4.tcp_syncookies # 验证输出 net.ipv4.tcp_syncookies = 1
sudo sysctl -p --system 2>/dev/null | grep -c error # 检查加载报错数
配置验证
逐项确认关键参数已生效:
sysctl net.ipv4.conf.all.rp_filter net.ipv4.tcp_syncookies kernel.kptr_restrict kernel.dmesg_restrict
输出中所有参数值为 1 即为加固成功。可用 sysctl -a | grep 'key' 精确检索。注意:部分网络参数对已有连接不生效,生产环境建议在维护窗口执行并观察业务连接。
常见问题
FAQ 1:开启 rp_filter 后部分正常流量被丢弃?
rp_filter=1 对多网卡、多路由场景可能误伤不对称路由流量。若出现丢包,可先评估业务路由结构,必要时对特定网卡设为 2(松散模式)或按接口单独调整,同时配合防火墙白名单兜底。
FAQ 2:sysctl -p 报 “No such file or directory”?
说明内核未编译该参数(多见于精简内核或容器环境)。此类参数会被跳过不影响其余配置加载,可先用 sysctl -a | grep 参数名 确认内核支持后再写入。
FAQ 3:这些参数修改后如何回滚?
恢复备份文件后重新 sysctl -p 即可:cp /etc/sysctl.conf.bak /etc/sysctl.conf && sysctl -p。net 类参数即时生效,kernel 类部分参数(如 kptr_restrict)需重启后回退。
总结
sysctl 内核安全加固是成本最低、见效最快的基础防护手段,建议与 fail2ban、iptables、SELinux 组合使用。将本文配置纳入服务器初始化脚本或 Ansible 基线任务,可实现新服务器一键加固,避免人工漏配。