防火墙与内核加固:把好第三道门
0. 元信息
- 主题路径:
docs/topics/linux-hardening/subtopics/network-and-kernel/ - 父主题:
linux-hardening - 主分类:安全与可靠性
- 辅助分类:工程技术
- 适合对象:理解 TCP/IP 基础、
ip addr/ip route、能读 iptables 规则的运维 / 后端 / 安全工程师 - 建议周期:1.5~2 周(每周 8~10 小时,含 nftables 实验与 sysctl 验证)
- 前置知识:
network(TCP/UDP/CIDR/conntrack 概念);permissions-and-mac - 最终目标:能用 nftables 给一台 Web 服务器搭出”默认 DROP、放行 22/80/443、限速 SSH、限 conntrack”的规则集;能按 CIS 把 20+ 个 sysctl 字段写进
/etc/sysctl.d/99-hardening.conf并在重启后持久;能解释 kernel lockdown 行为并设为integrity;能禁用不用的 module 与危险系统调用
1. 学习路线
nftables 范式(tables / chains / sets / maps / verdict)
→ INPUT/OUTPUT/FORWARD chain 与 default policy
→ conntrack(ct state established,related / new / invalid)
→ rate-limit(limit / meter)
→ TCP Wrappers(hosts.allow / hosts.deny)
→ sysctl 基础(net.ipv4.* / net.ipv6.* / kernel.* / fs.*)
→ 反欺骗(rp_filter、accept_redirects、send_redirects、source_route)
→ ASLR 与信息泄露(randomize_va_space、kptr_restrict、dmesg_restrict)
→ Kernel lockdown(integrity / confidentiality)
→ Secure Boot 与 MOK
→ Module 禁用(blacklist / install <mod> /bin/true)
→ 危险系统调用(kexec_load、kexec_file_load、SYS_PTRACE、Yama ptrace_scope)
按”先收网络入口,再锁内核”的顺序:网络层先拒绝默认,限速已知服务;内核层先 ASLR / kptr 收信息,再 lockdown 改 root 信任,再禁危险调用。
2. 阶段周数分配(1.5~2 周,建议 2 周)
| 阶段 | 1.5 周速通 | 2 周稳推 | 备注 |
|---|---|---|---|
| 1. nftables 范式(tables / chains / hooks) | 0.5 天 | 1 天 | nft list ruleset 起步 |
| 2. INPUT / OUTPUT / FORWARD + policy | 0.5 天 | 0.5 天 | 默认 DROP;放行 lo |
| 3. conntrack 状态机 | 0.5 天 | 1 天 | established,related accept |
| 4. rate-limit + sets | 0.5 天 | 1 天 | limit rate 6/minute + ssh_blacklist |
| 5. TCP Wrappers(hosts.allow/deny) | 0.5 天 | 0.5 天 | tcpdmatch sshd 10.0.0.5 |
| 6. sysctl 基线 | 1 天 | 1 天 | /etc/sysctl.d/99-hardening.conf |
| 7. ASLR / kptr / dmesg / Yama | 0.5 天 | 0.5 天 | cat /proc/kallsyms 验证 |
| 8. Kernel lockdown + Secure Boot | 0.5 天 | 1 天 | grub cmdline + mokutil |
| 9. Module 禁用 + 危险系统调用 | 0.5 天 | 0.5 天 | kexec_load_disabled=1 |
每天 1.5 小时;1.5 周速通每天 2 小时能跑完,但 lockdown + Secure Boot 容易踩兼容性。建议 2 周:给 lockdown 与黑名单模块被 initrd 依赖的时间调试。
3. 九阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. nftables 范式 | nft add table inet filter add chain ... hook ... priority ... policy drop | 写出最小可通的 nftables set | nft list ruleset 看到预期规则;nft 命令持久化到 /etc/nftables.conf |
| 2. INPUT / OUTPUT / FORWARD | hook priority 0、policy drop、iif lo accept、oif lo accept | 默认 DROP;放行环回 | nmap 端口扫描只看 22;本地 curl localhost 通 |
| 3. conntrack | ct state established,related accept ct state invalid drop | 已建连接回包自动放行 | SSH 第一次连得通;伪造 SYN 拒收 |
| 4. rate-limit 与 sets | limit rate 6/minute、add set 收集 SSH 失败 IP | SSH 限速;暴力破解日志可见 | 1 分钟 5 次 SSH 失败后拒绝;nft list set inet filter ssh_blacklist |
| 5. TCP Wrappers | /etc/hosts.allow /etc/hosts.deny、libwrap | 限定 SSH 仅内网 | tcpdmatch sshd 10.0.0.5 验证 |
| 6. sysctl 基线 | net.ipv4.ip_forward net.ipv4.conf.all.rp_filter net.ipv4.conf.all.accept_redirects net.ipv4.conf.all.send_redirects net.ipv4.conf.all.accept_source_route net.ipv4.icmp_echo_ignore_broadcasts net.ipv4.tcp_syncookies net.ipv4.conf.all.log_martians | 写 /etc/sysctl.d/99-hardening.conf | sysctl -a 与 CIS 对照;重启后保持 |
| 7. ASLR 与 kptr | kernel.randomize_va_space=2 kernel.kptr_restrict=2 kernel.dmesg_restrict=1 kernel.yama.ptrace_scope | 改完验证 | cat /proc/kallsyms 只看到 0 地址;dmesg 限制 |
| 8. Kernel lockdown + Secure Boot | lockdown=integrity(grub cmdline)、MOK 概念、UEFI Secure Boot | 重启后 /sys/kernel/security/lockdown 显示 [integrity] | cat 看模式;efivar 验证 Secure Boot 启用 |
| 9. module 与系统调用 | modprobe -r 测试、install usb-storage /bin/true blacklist firewire-core、kexec_load 禁用、SYS_PTRACE 限制 | /etc/modprobe.d/ 黑名单;sysctl kernel.kexec_load_disabled=1 | `lsmod |
关键陷阱:INPUT 默认 DROP 但没放行已建连接,SSH 上得去下不来;IPv6 单独处理;ufw / firewalld 与 nftables 冲突;sysctl -w 改了不写文件;lockdown=confidentiality 后调试复杂;黑名单模块被 initrd 强依赖清不掉。
4. 第一周任务(每天 1.5~2 小时)
Day 1 约定:用一台 Ubuntu 22.04 或 RHEL 9.x 虚机/容器,先建快照;记录
cat /etc/os-release、uname -r、nft --version、sysctl -a | wc -l、mokutil --sb-state。保 console / 第二 SSH 会话,避免 INPUT DROP 锁外。
| 日 | 任务 | 当天交付 | 自检命令 |
|---|---|---|---|
| Day 1 | nftables 范式起步:写 /etc/nftables.d/01-base.nft,定义 table inet filter + 3 chains(input/output/forward)+ policy drop;nft -f 加载;nft list ruleset 看生效 | 01-base.nft + nft list ruleset | nft list ruleset、nft --version、systemctl status nftables |
| Day 2 | INPUT 放行环回 + 已建连接:iif lo accept oif lo accept ip saddr 127.0.0.0/8 accept ct state established,related accept ct state invalid drop;OUTPUT 默认 accept;FORWARD DROP;从本机 curl localhost:8080 通;nmap localhost 看端口 | nftables 基础规则 | nmap -p 22,80,443 localhost、nft list chain inet filter input、curl -sI http://localhost:8080 |
| Day 3 | conntrack + rate-limit:INPUT chain 加 tcp dport { 22, 80, 443 } accept、tcp dport 22 meter \{ ip saddr limit rate 6/minute } accept,失败 6 次后拒绝;用 nc 或 hydra 模拟;nft list set inet filter ssh_blacklist 看收集 IP | rate-limit 验证 | nft list meter inet filter xxx、nft list set、time nc -zv localhost 22 6 次后第 7 次 Connection timed out |
| Day 4 | TCP Wrappers + sets:在 /etc/hosts.deny 写 ALL: ALL;/etc/hosts.allow 写 sshd: 10.0.0.0/8;tcpdmatch sshd 10.0.0.5 应 allow;tcpdmatch sshd 8.8.8.8 应 deny;INPUT chain 内增加 ip saddr @blocked_set drop | hosts + nft 联动 | tcpdmatch sshd 10.0.0.5、tcpdmatch sshd 8.8.8.8、cat /etc/hosts.allow |
| Day 5 | sysctl 基线:写 /etc/sysctl.d/99-hardening.conf,涵盖 net.ipv4.ip_forward=0、net.ipv4.conf.all.rp_filter=1、net.ipv4.conf.all.accept_redirects=0、net.ipv4.conf.all.send_redirects=0、net.ipv4.conf.all.accept_source_route=0、net.ipv4.conf.all.log_martians=1、net.ipv4.icmp_echo_ignore_broadcasts=1、net.ipv4.tcp_syncookies=1、net.ipv6.conf.all.accept_redirects=0、net.ipv6.conf.all.accept_source_route=0;sysctl -p /etc/sysctl.d/99-hardening.conf 加载;重启后验证 | sysctl 持久化 | `sysctl -a |
| Day 6 | ASLR + 信息泄露:kernel.randomize_va_space=2、kernel.kptr_restrict=2、kernel.dmesg_restrict=1、kernel.yama.ptrace_scope=1、fs.protected_hardlinks=1、fs.protected_symlinks=1;验证:cat /proc/sys/kernel/randomize_va_space 显示 2;非 root `cat /proc/kallsyms | head应只见 0 地址;非 rootdmesg` 应被拒 | 信息保护验证 |
| Day 7 | 项目:Kernel lockdown + Module 禁用。在 GRUB cmdline 加 lockdown=integrity(/etc/default/grub GRUB_CMDLINE_LINUX 追加,grub-mkconfig -o /boot/grub/grub.cfg);重启后 cat /sys/kernel/security/lockdown 显示 [integrity] write];新建 /etc/modprobe.d/blacklist-usb.conf:install usb-storage /bin/true + blacklist usb-storage;install firewire-core /bin/true + blacklist firewire-core;sysctl -w kernel.kexec_load_disabled=1;持久化到 /etc/sysctl.d/99-hardening.conf;dracut -f 或 update-initramfs -u 重建 initrd;重启后 `lsmod | grep -E ‘usb-storage|firewire’ 应空;sysctl kernel.kexec_load_disabled` = 1 | lockdown + module 验证输出 |
Day 7 拆解
步骤 A —— 最小可用(90 分钟)
- 备份:
sudo cp /etc/default/grub /etc/default/grub.bak; sudo sed -i 's/^GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="lockdown=integrity /' /etc/default/grub;sudo grub-mkconfig -o /boot/grub/grub.cfg(UEFI:sudo grub-mkconfig -o /boot/efi/EFI/<distro>/grub.cfg);sudo reboot;- 重启后
cat /sys/kernel/security/lockdown应包含[integrity]; /etc/modprobe.d/blacklist.conf加:install usb-storage /bin/true blacklist usb-storage install firewire-core /bin/true blacklist firewire-coresudo sysctl -w kernel.kexec_load_disabled=1 && echo 'kernel.kexec_load_disabled = 1' | sudo tee /etc/sysctl.d/99-hardening.conf;sudo dracut -f(RHEL)或sudo update-initramfs -u(Ubuntu)重建 initrd,否则 initrd 早加载;sudo reboot,lsmod | grep -E 'usb-storage|firewire-core'应为空。
步骤 B —— 验证 + 边界(30~45 分钟)
cat /sys/kernel/security/lockdown看精确模式[integrity]还是[confidentiality];sudo modprobe -v usb-storage应modprobe: ERROR: could not insert 'usb-storage': Operation not permitted;sudo sysctl kernel.kexec_load_disabled= 1;echo c > /proc/sysrq-trigger不应触发 kexec;journalctl -k --since today | grep -i lockdown看启动日志;- 关键 sysctl 与 CIS 对照表写进
notes/cis-3x4x-gap.md; - 把 lockdown 临时改
confidentiality跑 5 分钟验证差异化访问,再改回integrity持久。
5. 阶段通用验收(每一阶段都通过)
- 能用 1 张表说出 CIS Benchmark 3.x(网络)/ 4.x(防火墙)/ 6.x(sysctl 与服务)的核心控制项;
- 改完配置用
nft list ruleset、sysctl -a、cat /sys/kernel/security/lockdown、lsmod、sysctl kernel.kexec_load_disabled看证据,存进notes/; - 制造 1 个对照实验:留
net.ipv4.conf.all.accept_source_route=1→scapy伪造源路由包进入;改0→ 收到 RST/丢弃; - 至少 3 组自定义数据:故意暴露 SSH 到公网看
journalctl -u sshd暴力破解记录;故意accept_redirects=1接收伪造 ICMP redirect;故意randomize_va_space=0跑 gdb 验证地址布局; - 记录变更:每改一个规则 / sysctl / modprobe 块 写 1 条(who/when/what/why/CIS 控制项号);
- 能修改已有规则集(删/加一条 nftables 规则、删/加一条 sysctl),而不是只照搬。
6. 最终验收(学完 9 阶段后)
- 独立完成:nftables INPUT 默认 DROP + 已建连接放行 + 22/80/443 白名单 + SSH rate-limit;sysctl 持久化 20+ 字段;ASLR=2、kptr=2、dmesg=1;kernel lockdown=integrity;黑名单 usb-storage / firewire-core;kexec_load 禁用;
- 完成至少 30 条 CIS 3.x / 4.x / 6.x 网络 + 内核 控制项对照:每条用
nft list ruleset、sysctl -a | grep、cat /sys/kernel/security/lockdown、lsmod | grep -E '<mod>'验证通过; - 完成 1 个综合项目:在一台云主机上落地完整网络 + 内核加固(
/etc/nftables.d/、/etc/sysctl.d/99-hardening.conf、/etc/modprobe.d/blacklist.conf、grub cmdlinelockdown=integrity);nmap从外网只看 22/80/443;lynis跑分;30 分钟能回滚到默认; - 用 15 分钟讲清”网络层(NAT/conntrack/限速)→ 内核参数(ASLR/kptr/dmesg)→ 启动信任(Secure Boot/lockdown)→ 模块/调用(blacklist/kexec/Yama)“四层防御各堵哪类威胁,nftables
ct state established,related为什么必须放行。
7. 综合项目
首选:写一份 harden-firewall-kernel.md —— 准备一台干净的 Ubuntu 22.04 虚机,先基线(nmap localhost、sysctl -a | wc -l、cat /sys/kernel/security/lockdown、lsmod | wc -l),按 9 阶段顺序加固,用同一组命令对比前后。
要求:
- 准备
notes/baseline-before.md与notes/baseline-after.md; - 逐项改:nftables INPUT → conntrack → rate-limit → TCP Wrappers → sysctl → ASLR/kptr → lockdown → module;
- 持久化:
/etc/nftables.d/01-base.nft、/etc/nftables.d/02-rate.nft、/etc/sysctl.d/99-hardening.conf、/etc/modprobe.d/blacklist.conf、/etc/default/grub; - 验证:外网
nmap -Pn <host>只看到 22/80/443;SSH 暴力破解 6 次/分钟被拒;cat /proc/kallsyms非 root 只看到 0 地址;sysctl kernel.kexec_load_disabled = 1;lsmod | grep -E 'usb-storage|firewire-core'空; - 输出
notes/retrospective.md:哪些被坑过(INPUT DROP 锁外、ipv6 规则漏、initrd 黑名单不生效、lockdown 影响调试)。
备选:在一台故意”老配置”(INPUT ACCEPT 默认)机器上配置 nftables,验证仅放行 22/80/443;用 hydra 或 medusa 模拟 SSH 爆破看 rate-limit 生效。
任何综合项目都必须包含:
- 需求与成功标准(含端口白名单、sysctl 持久化、lockdown 模式);
- 基线 vs 目标差距表;
- 配置按层(nftables / TCP Wrappers / sysctl / ASLR / lockdown / module);
- 脚本化(
scripts/harden-net-kernel.sh+scripts/verify-net-kernel.sh),幂等可重跑; - 正常 + 异常验证(INPUT ACCEPT → 端口全暴露;INPUT DROP + conntrack → 上得去下不来;lockdown none → root 自由加载 module);
- 报告:基线、目标、结果、剩余项、复盘;
- README;
- 复盘记录。
本主题贡献(Loop 6-D · linux-hardening / network-and-kernel)
本主题交付”nftables + sysctl + ASLR + 模块黑名单 + lockdown”五层网络与内核加固脚本化包,故意把 INPUT 切回 ACCEPT 看端口暴露,再切回 DROP + conntrack 看正常放行,作为验收金标准。
3 项核心职责
- nftables 白名单:用 nftables 写 INPUT 默认 DROP,仅放行 22 / 80 / 443 / 必要出站;配 conntrack(
ct state established,related accept)保证回程通;故意 INPUT ACCEPT 验证端口全暴露,再切回 DROP + conntrack 验证正常。 - sysctl + ASLR:用 sysctl 持久化(
/etc/sysctl.d/99-hardening.conf)关 IPv4 / IPv6 转发、开 SYN cookies / reverse path filtering / 忽略 ICMP redirect;kernel.randomize_va_space=2开全随机化 ASLR。 - 内核模块 + lockdown:用 modprobe 黑名单(
/etc/modprobe.d/hardening-blacklist.conf)禁dccp/sctp/rds/tipc等罕见协议;lockdown 模式 ≥ integrity(限制 root 加载 module 与读 kernel dmesg),initrd 同步加黑名单。
4 项交付物
- 基线 vs 目标差距表:含端口白名单(22 / 80 / 443 必要出站)、sysctl 持久化核对、ASLR 等级、lockdown 模式四项指标 + 验证命令(
nft list ruleset/sysctl -a/cat /proc/sys/kernel/randomize_va_space/cat /sys/kernel/security/lockdown)。 - nftables 规则集 + conntrack:
/etc/nftables.conf(含 base chain / ct state / rate limit),故意 INPUT ACCEPT 验证暴露后切回 DROP + conntrack 验证回程通。 - sysctl + ASLR 持久化:
/etc/sysctl.d/99-hardening.conf(IPv4 / IPv6 转发、SYN cookies、rp_filter、ignore redirect)+kernel.randomize_va_space=2写入/etc/sysctl.d/与 initrd。 - 模块黑名单 + lockdown:
/etc/modprobe.d/hardening-blacklist.conf(dccp / sctp / rds / tipc 等)+ lockdown ≥ integrity + initrd 黑名单同步,配scripts/harden-net-kernel.sh+scripts/verify-net-kernel.sh幂等可重跑。
3 个验收指标
nft list ruleset:INPUT 默认 policy drop;22 / 80 / 443 端口放行;ct state established,related accept在列;INPUT ACCEPT 状态下端口全暴露可复现。sysctl -a输出全部命中持久化清单,randomize_va_space=2全局生效,initrd 内 sysctl 与运行时一致。- lockdown ≥ integrity:
cat /sys/kernel/security/lockdown显示[ integrity ],root 加载 module 被拒;modprobe 黑名单在 initrd 与运行时均生效。
8. 推荐开源资料(按角色分工,避免堆链接)
| 阶段 | 角色 | 资料 | 链接 | 用法 |
|---|---|---|---|---|
| 1~5 | nftables 权威 | man nft(8)、man nftables(8)、nftables wiki | https://wiki.nftables.org/ | 字段第一站;按 hook 优先级排错 |
| 1~5 | nftables 实战 | Arch Wiki: nftables | https://wiki.archlinux.org/title/nftables | sample 脚本;nft monitor trace 调试 |
| 1~5 | 旧 iptables | man iptables(8)、iptables-extensions(8) | https://man7.org/linux/man-pages/ | 存量系统排错;iptables-translate 转 nft |
| 5 | TCP Wrappers | man hosts_access(5)、man tcpdmatch(8) | https://man7.org/linux/man-pages/ | tcpdmatch 调试 @ / EXCEPT |
| 6~7 | sysctl 权威 | man sysctl(8)、Documentation/admin-guide/sysctl.txt | https://docs.kernel.org/admin-guide/sysctl/ | 按字段含义改;性能 vs 安全 |
| 6~7 | sysctl 性能 | Brendan Gregg 博客 / Systems Performance | https://www.brendangregg.com/ | sysctl 性能影响 |
| 8 | Lockdown | Documentation/admin-guide/lockdown-credentials.rst | https://www.kernel.org/doc/html/latest/admin-guide/index.html | integrity vs confidentiality |
| 8 | Secure Boot | man mokutil(1)、Ubuntu: SecureBoot | https://wiki.ubuntu.com/SecurityTeam/SecureBoot | UEFI 启用验证;mokutil --sb-state |
| 9 | 模块禁用 | man modprobe.d(5)、Ubuntu: Kernel Hardening | https://wiki.ubuntu.com/Security/Features | install <mod> /bin/true 用法 |
| 9 | Yama | Documentation/admin-guide/LSM/ | https://docs.kernel.org/admin-guide/LSM/ | ptrace_scope 0/1/2/3 解释 |
| 全部 | CIS / DISA | CIS Benchmarks + DISA STIG | https://www.cisecurity.org/ · https://public.cyber.mil/stigs/ | 注册下载;逐条对照 |
| 全部 | 攻击者视角 | Hanno Böck《Linux Hardening in Hostile Networks》 | https://michael-wolf.de/ | 解释 CIS 为什么这么定 |
许可证提示:CIS Benchmarks 注册免费账号下载;kernel docs 公开;ComplianceAsCode SSG 是 GPL-3.0+ / BSD;systemd / iptables / nftables 都是 GPL-2.0;Brendan Gregg 书籍按出版社许可。复制 CIS 控制点脚本到生产前先在 staging 验证 —— 默认读思路后自己写。
默认使用顺序:
manpage → kernel docs / Arch Wiki → CIS / DISA → Brendan Gregg 性能视角 → 实操(nft / sysctl / modprobe)→ 复盘到notes/retrospective.md。
9. 学习资料汇聚(v0.3 自包含)
本节由本计划生成。
9.1 背景与动机
账号和权限层把”谁能进”和”能做什么”管住。剩下的问题是”能连到哪”和”内核能信谁”。
网络层是攻击面最大的部分:SSH 爆破、CVE 利用、UDP flood、内部横向。Linux 提供 iptables / nftables 内核层包过滤、conntrack 状态机、TCP Wrappers 进程层守护、UFW/firewalld 高级抽象。CIS / DISA 都把防火墙列为必做项。
内核层是 rootkit 和漏洞利用的最终战场。ASLR 抬高利用门槛,kptr_restrict 泄露降低,lockdown 切断 root 与内核的信任链,模块禁用减少攻击面,kexec_load 限制则防止”内加载内核”逃避 UEFI Secure Boot。Yama 的 ptrace_scope 限制跨进程 ptrace。
9.2 概念地图
flowchart TB
Netfilter[Linux Netfilter]
NFT[nftables]
IPT[iptables]
UFW[ufw / firewalld]
CT[conntrack]
TW[TCP Wrappers / libwrap]
IPv4[net.ipv4.*]
IPv6[net.ipv6.*]
Kernel[kernel.*]
FS[fs.*]
ASLR[ASLR / kptr / dmesg]
Lockdown[lockdown integrity / confidentiality]
SB[Secure Boot / MOK]
Mod[Module blacklist / install]
Kexec[kexec_load / SYS_PTRACE]
Yama[Yama ptrace_scope]
Netfilter --> NFT
Netfilter --> IPT
NFT --> CT
IPT --> CT
NFT --> UFW
TW --> Netfilter
Kernel --> ASLR
Kernel --> Lockdown
Kernel --> Mod
Lockdown --> SB
Kernel --> Kexec
Kernel --> Yama
9.3 基础知识讲解
9.3.1 主推
| 资料 | 角色 | 评分 |
|---|---|---|
man nft(8) man nftables(8) | nftables 权威 | 5 |
man iptables(8) iptables-extensions(8) | iptables 字段 | 4 |
man sysctl(8) man sysctl.conf(5) | sysctl | 5 |
man capabilities(7) | 跨层引用 | 5 |
Documentation/networking/ip-sysctl.txt (kernel docs) | 字段解释 | 5 |
Documentation/admin-guide/LSM/ (kernel docs) | LSM / lockdown | 4 |
| Hanno Böck, Linux Hardening in Hostile Networks | 攻击者视角 | 4 |
| Brendan Gregg 博客 / Systems Performance | sysctl 性能 vs 安全解释 | 4 |
| Red Hat Security Guide: Network / Kernel | 实战 | 4 |
| Arch Wiki: nftables / Sysctl / Security | 字段级 | 4 |
9.3.2 备查
| 资料 | 链接 |
|---|---|
| nftables wiki | https://wiki.nftables.org/ |
| Arch Wiki: nftables | https://wiki.archlinux.org/title/nftables |
| kernel sysctl docs | https://docs.kernel.org/admin-guide/sysctl/ |
| Linux Kernel Lockdown | https://www.kernel.org/doc/html/latest/admin-guide/index.html |
| Ubuntu: Kernel Hardening | https://wiki.ubuntu.com/Security/Features |
| UFW man page | https://www.kernel.org/doc/html/latest/admin-guide/index.html |
9.3.3 必查 man pages
nft(8)nftables(8)iptables(8)iptables-extensions(8)ip6tables(8)ufw(8)firewalld(1)firewall-cmd(1)sysctl(8)sysctl.conf(5)tcpd(8)hosts_access(5)hosts_options(5)libwrap(3)modprobe(8)modprobe.d(5)lsmod(8)rmmod(8)kexec(8)kernel-install(8)efivar(8)mokutil(1)
9.4 经典问题与经典案例
| # | 问题 | 为什么会重要 | 最简答案 / 证据 |
|---|---|---|---|
| 1 | INPUT 默认 DROP 没放行已建 | 第一次连得上,回应包被拒 | ct state established,related accept |
| 2 | 没放行 lo | 本地服务挂 | iif lo accept / oif lo accept |
| 3 | ufw 与 nftables 规则混用 | 规则冲突 | 选其一;用 nft 的话禁 ufw |
| 4 | IPv6 没防 | 攻击者走 v6 | 显式 inet family 或 ip6tables |
| 5 | ip_forward=1 默认 | 主机变路由器 | 显式 0 |
| 6 | accept_source_route=1 | 源路由攻击 | 0 |
| 7 | accept_redirects=1 | ICMP redirect 攻击 | 0 |
| 8 | send_redirects=1 | 主机发 ICMP redirect | 0 |
| 9 | rp_filter=0 | IP 欺骗 | 1(严格)或 2(松) |
| 10 | tcp_syncookies=0 | SYN flood | 1 |
| 11 | icmp_echo_ignore_broadcasts=0 | smurf 攻击 | 1 |
| 12 | log_martians=0 | 异常包不记录 | 1 |
| 13 | randomize_va_space=0 | ASLR 关 | 2 |
| 14 | kptr_restrict=0 | 内核地址泄露 | 2 |
| 15 | dmesg_restrict=0 | 非 root 看 dmesg | 1 |
| 16 | yama.ptrace_scope=0 | 跨进程 ptrace | 1 或更高 |
| 17 | lockdown=none | root 自由改内核 | integrity |
| 18 | 没启 Secure Boot | 启动链不受保护 | UEFI 开 Secure Boot |
| 19 | USB storage 没禁 | BadUSB | install usb-storage /bin/true |
| 20 | kexec_load_disabled=0 | 加载任意内核 | 1 |
| 21 | 没禁 firewire / thunderbolt | DMA 攻击 | modprobe blacklist |
| 22 | 没禁 bluetooth(服务器) | 蓝牙攻击面 | blacklist |
| 23 | nft 规则不持久 | 重启丢 | /etc/nftables.conf + systemctl enable nftables |
| 24 | iptables 与 nftables 共存 | 顺序错乱 | 二选一 |
| 25 | 没限 SSH 速率 | 暴力破解 | limit rate 6/minute + sets |
| 26 | rate-limit 用 limit 不是 meter | 不精确 | meter 是 nft 新方式 |
| 27 | 防火墙规则允许本机出网到任何 | 反向 shell 数据外泄 | OUTPUT 默认 DROP + 必要白名单 |
| 28 | conntrack 表满 | 丢包 | nf_conntrack_max 调整 |
9.5 学习难点
概念难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| nftables hook priority | 数字越小越早 | 看 man nftables hook 章节 |
| ct state 4 状态 | new established related invalid | 画状态机;先 established,related |
| iptables / nftables / ufw 共存 | 谁先生效 | 用 iptables-nft 转换;推荐 nft 单跑 |
| ASLR、PIE、stack canary 区别 | 多个机制 | 各自独立;ASLR 是地址随机化 |
| lockdown 两种模式 | integrity vs confidentiality | 跑 cat /sys/kernel/security/lockdown |
| kexec 与 kexec_file | 两套接口 | kexec_load_disabled / Secure Boot 限制 |
思维难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| 改了 nftables SSH 连不上 | INPUT DROP 又没放行 | 改前保 console;先 ACCEPT 再 DROP |
sysctl -w 后重启失效 | 没写文件 | /etc/sysctl.d/99-*.conf |
| 黑名单模块 initrd 必需 | initrd 强依赖 | 看 lsmod 与 initramfs 依赖;用 install 黑 |
工程难点
| 难点 | 为什么会卡 | 突破路径 |
|---|---|---|
| nftables 复杂 set 性能 | 规则多慢 | 用 set 哈希表;meter 替代 limit |
| 几百台机器同步 nftables 规则 | 手工 | Ansible 模板;iptables-save 风格 |
| 业务要 listen 任意端口 | 默认 DROP 拦 | 用 nft monitor trace 找缺失规则 |
9.6 技术标准与接口
9.6.1 Entity
| 名称 | 版本 | 组织 | 状态 | 许可证 |
|---|---|---|---|---|
| nftables | 1.0+ | Netfilter 项目 | 活跃 | GPL-2.0 |
| iptables | 1.8+ | Netfilter 项目 | 维护 | GPL-2.0 |
| conntrack | 内核模块 | kernel.org | 主流 | GPL-2.0 |
| ufw | 0.36+ | Canonical | 活跃 | GPL-3.0 |
| firewalld | 2.x | Red Hat | 活跃 | GPL-2.0 |
| Linux sysctl | 持续 | kernel.org | 主流 | GPL-2.0 |
| Linux Kernel Lockdown | 5.4+ | kernel.org | 主流 | GPL-2.0 |
| UEFI Secure Boot | 2.x | UEFI Forum | 主流 | 公开 |
| Yama | 主流 | kernel.org | 主流 | GPL-2.0 |
| ComplianceAsCode SSG | 持续 | ComplianceAsCode | 活跃 | GPL-3.0+ / BSD |
9.6.2 Scope
- nftables / iptables:内核包过滤;nft 是后继。
- conntrack:状态跟踪;与 NAT/防火墙共用。
- TCP Wrappers / libwrap:进程级守护;
@/EXCEPT/spawn语法。 - sysctl:运行时内核参数。
- Lockdown:限制 root 对内核的操作。
- Secure Boot:启动链信任根。
- Module blacklist:减少攻击面。
- kexec_load / SYS_PTRACE / Yama:限制危险系统调用。
- CIS 3.x / 4.x / 6.x:网络、内核参数、模块、sysctl。
9.6.3 Structure
-
nftables 关键:
table inet filter { chain input { type filter hook input priority 0 ; policy drop ; } chain output { type filter hook output priority 0 ; policy accept ; } chain forward { type filter hook forward priority 0 ; policy drop ; } } -
sysctl 关键字段(按攻击面分类):
- 抗 spoofing:
net.ipv4.conf.all.rp_filter=1 - 抗 redirect:
net.ipv4.conf.all.accept_redirects=0net.ipv4.conf.all.send_redirects=0 - 抗 source route:
net.ipv4.conf.all.accept_source_route=0 - 抗 ICMP:
net.ipv4.icmp_echo_ignore_broadcasts=1 - 抗 SYN flood:
net.ipv4.tcp_syncookies=1 - 信息泄露:
kernel.randomize_va_space=2kernel.kptr_restrict=2kernel.dmesg_restrict=1 - 反 ptrace:
kernel.yama.ptrace_scope=1 - 禁 IP 转发:
net.ipv4.ip_forward=0 - 禁 kexec:
kernel.kexec_load_disabled=1 - 文件系统:
fs.protected_hardlinks=1fs.protected_symlinks=1
- 抗 spoofing:
-
modprobe 黑名单:
/etc/modprobe.d/<name>.conf写blacklist <mod>install <mod> /bin/true。 -
lockdown:通过 grub cmdline
lockdown=integrity或confidentiality;也可/sys/kernel/security/lockdown读模式。
9.6.4 Ecosystem
- 工具:
nftiptablesip6tablesconntracktcpdumpssnmapkmodmokutilefivar。 - 防火墙高级:firewalld、ufw、shorewall、opensnitch(出网守护)。
- 配置管理:Ansible(含
ansible.builtin.sysctlansible.builtin.copy给 nftables.conf)。 - 性能:Brendan Gregg 的 perf 工具集与 sysctl 性能影响分析。
- 事实标准:firewalld 是 RHEL 默认,ufw 是 Ubuntu 默认;nftables 是上游推荐;Security Guide / CIS 写 nftables 范式。
9.6.5 Depth Tiers
| 层级 | 能力 | |---|---|---| | L0 | 知道防火墙、内核参数、Secure Boot | | L1 | 看得懂一段 nftables 规则与 sysctl 输出 | | L2 | 能写 nftables 限 SSH / rate-limit;写 sysctl 持久化 | | L3 | 能解释每条规则的 conntrack 行为、ASLR 原理、lockdown 模式区别 | | L4 | 能为多机集群写统一防火墙基线、自动化验证新规则、CI 卡 lockdown |
本计划目标:L3。
9.6.6 Source
- kernel.org / sysctl:https://docs.kernel.org/admin-guide/sysctl/
- nftables wiki:https://wiki.nftables.org/
- Linux Kernel Lockdown:https://www.kernel.org/doc/html/latest/admin-guide/index.html
- Red Hat Security Guide:https://docs.redhat.com/en/documentation/en-us/red_hat_enterprise_linux/9/html/security_hardening
- ComplianceAsCode:https://github.com/ComplianceAsCode/content
- 引用版本快照日期:2026-07-30。
10. 常见误区
- INPUT 默认 DROP 但没放行
ct state established,related,SSH 上得去下不来; - OUTPUT 默认 ACCEPT,认为”出网无害”,反向 shell 数据外泄;
sysctl -w改完不写/etc/sysctl.d/,重启失效;- ufw / firewalld / nftables 三套规则混用,顺序错乱;
- IPv6 规则没单独写,攻击者走 v6 绕过 v4 防火墙;
- 禁了 ICMP 全部 ping,PMTUD 失败;
kptr_restrict=0时把内核地址当信息泄露源;lockdown=none当默认值,写脚本”安全”;- Secure Boot 没启就装 MOK;
- 黑名单
usb-storage没用install /bin/true,modprobe 仍能加载; kexec_load_disabled=0,运维常用 kdump 与之冲突;先确认 kdump 需求;yama.ptrace_scope=0默认,认为 gdb 不受影响;- nftables 规则不持久,重启全丢;
tcp_syncookies=0强调”性能”,但 SYN flood 风险变高;- 把 sysctl 调成”无脑最严”,导致业务跑不动(DNS 解析、IPv6 访问);
- 改 nftables 之前没保 console,把自己锁外面;
log_martians=0当性能优化,但异常包不记录 IR 时查不到。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
- 安全与可靠性
本计划归属:安全与可靠性 主 + 工程技术 辅。