70·网络高级

nftables 新一代防火墙

nftablesfirewall

第70课 - nftables 新一代防火墙

学习目标

  • 理解 nftables 相较于 iptables 的架构优势和设计哲学
  • 掌握使用 nftables 命令行工具创建、管理和调试基本防火墙规则
  • 学会使用规则集文件来持久化和管理复杂的防火墙配置
  • 能够编写并加载一套基础的 nftables 安全策略,实现网络访问控制

核心概念

nftables 是 Linux 内核中的新一代数据包过滤框架,旨在全面取代功能强大但略显陈旧的 iptables。你可以把它理解为防火墙规则的“升级版操作系统”。

为什么需要 nftables? 想象一下,iptables 是一个拥有许多独立工具箱(iptablesip6tablesarptables 等)的工匠,每种协议族(IPv4, IPv6)都用不同的工具管理,且内部数据结构复杂,对性能和现代网络特性支持有限。

而 nftables 则是一个统一的、模块化的高性能工作台。它:

  1. 统一了协议族:用一个 nft 命令管理所有协议。
  2. 规则集是原子的:一次加载或替换整个规则集,更安全、可靠。
  3. 使用通用集合:内置支持 IP 地址、端口等的集合,效率极高。
  4. 语言更简洁、可读性更强

nftables 核心架构 (类比版):

  • 表 (table): 一个独立的策略容器,像一个“文件柜”,由地址族(ip, ip6, inet, arp, bridge)和类型(filter, route, nat)定义。inet 族能同时处理 IPv4 和 IPv6,强烈推荐使用。
  • 链 (chain): 表中的一个规则列表,像文件柜里的一个“文件夹”。它有两个关键属性:类型filter, nat, route)和钩子prerouting, input, forward, output, postrouting),这决定了它在网络协议栈的哪个位置被调用。
  • 规则 (rule): 链中的一个条目,像“文件夹”里的一份具体“说明书”,定义了匹配数据包的条件以及对匹配数据包执行的动作(接受、丢弃、重定向等)。

代码示例

场景:配置一个基础的服务器防火墙 我们的目标是:

  • 默认策略:丢弃所有传入流量。
  • 允许本地回环接口 (lo) 的所有流量。
  • 允许已建立的和相关的连接(实现状态防火墙)。
  • 允许传入的 SSH (22), HTTP (80) 和 HTTPS (443) 流量。
  • 允许传入的 ICMP (ping) 流量(可选)。
#!/bin/bash
# script: /etc/nftables_myserver.sh
# 描述:使用 nft 命令行工具交互式地构建防火墙规则

# 0. 重要提示:加载此脚本会重置所有现有规则!生产环境请使用规则集文件(见下方)。
# 1. 清空所有现有规则,从一个干净的环境开始
nft flush ruleset

# 2. 创建一个名为 `my_firewall` 的表,属于 `inet` 族,类型为 `filter`
nft add table inet my_firewall

# 3. 在表中创建一个名为 `input_filter` 的链,类型为 `filter`,挂载在 `input` 钩子上,并设置默认策略为 `drop`
# `priority 0` 表示这是一个基本的过滤链。
# `policy drop` 意味着如果一个数据包没有匹配到下面任何一条规则,它将被丢弃。
nft add chain inet my_firewall input_filter { type filter hook input priority 0 \; policy drop \; }

# 4. 添加规则到链中
# 规则 1: 允许本地回环接口的所有流量
nft add rule inet my_firewall input_filter iif "lo" accept

# 规则 2: 允许已建立的和相关的连接 (实现有状态防火墙)
nft add rule inet my_firewall input_filter ct state established,related accept

# 规则 3: 允许传入的 SSH 连接 (端口 22)
nft add rule inet my_firewall input_filter tcp dport 22 accept

# 规则 4: 允许传入的 HTTP 和 HTTPS 连接 (使用集合语法,更简洁高效)
nft add rule inet my_firewall input_filter tcp dport { 80, 443 } accept

# 规则 5: (可选) 允许传入的 ICMP 回显请求 (ping)
nft add rule inet my_firewall input_filter icmp type echo-request accept

# 规则 6: (可选) 记录并丢弃其他所有数据包(用于调试,生产环境可移除 `log` 部分)
nft add rule inet my_firewall input_filter log prefix "NFT_DROP: " drop

# 5. 查看当前配置的规则集
echo "--- 防火墙规则已加载,以下是当前规则集 ---"
nft list ruleset

更佳实践:使用规则集文件 将规则写入文件 /etc/nftables_myserver.conf,然后使用 nft -f 加载,可以实现原子化替换和持久化。

#!/usr/sbin/nft -f
# /etc/nftables_myserver.conf
# 清空规则集
flush ruleset

# 定义表和链
table inet my_firewall {
    chain input_filter {
        type filter hook input priority 0; policy drop;
        iif lo accept
        ct state established,related accept
        tcp dport { 22, 80, 443 } accept
        icmp type echo-request accept
        # 计数器:方便查看匹配了多少数据包
        counter packets 0 bytes 0 drop
    }
}

加载方法:sudo nft -f /etc/nftables_myserver.conf

实践练习

练习 1:基础规则管理 (入门)

  1. 仅使用 nft 命令,创建一个名为 web_only 的表(使用 inet 族)。
  2. 在表中创建一个名为 web_in 的链,类型为 filter,挂载在 input 钩子,默认策略为 accept
  3. 添加一条规则,拒绝所有目的端口为 80 的 TCP 流量。
  4. 查看你的规则集,确认创建成功。
  5. 最后,清空整个规则集。

练习 2:构建策略 (进阶) 基于课程示例,编写一个 nftables 规则集文件 (/etc/nftables_lab.conf),要求:

  • 基于 inet 族。
  • 实现状态防火墙。
  • 允许 SSH (22)、DNS (53) 和 MySQL/MariaDB (3306) 的入站连接。
  • 拒绝(而不是丢弃)其他所有入站的 TCP SYN 包,并返回一个 RST 包(提示:使用 reject with tcp reset)。
  • 使用 sudo nft -f 加载并测试。

练习 3:调试与日志 (挑战)

  1. 修改课程示例规则集文件。
  2. 在默认丢弃策略的链中,添加一条日志规则。该规则应匹配所有被丢弃的数据包(即不匹配之前任何允许规则的数据包),并记录其源IP、目的端口和协议到系统日志 (journalctl -k -f 可查看内核日志)。
  3. 确保日志规则位于所有允许规则之后、隐式丢弃策略之前。
  4. 加载规则,从外部测试一个被禁止的端口,检查是否在日志中记录了该连接尝试。

常见错误

  1. 忘记flush ruleset:在测试新配置前,如果没有清空旧规则,新规则会追加到旧规则后面,可能导致逻辑混乱,旧规则先生效。
  2. 默认策略设置不当:在未配置好允许规则前就设置 policy drop,会导致自己被锁在服务器外。建议初始调试时用 policy accept,确认规则正确后再改为 drop
  3. 规则顺序错误:nftables 的规则是顺序执行的。例如,一条 reject 规则如果放在一条 accept 规则之前,会导致后者永远无法匹配。应把最具体、最频繁匹配的规则放在前面。
  4. 遗漏关键服务:配置防火墙时,务必确保不会阻塞 SSH (22) 等管理连接,否则可能无法远程登录服务器进行修复。
  5. 链的类型和钩子匹配错误:例如,用于 NAT 的规则必须放在 nat 类型的链中,并挂在 preroutingpostrouting 钩子上,而不是 filter 类型的 input 钩子。

小结

本节课我们学习了 Linux 下一代防火墙 nftables 的核心概念和实践:

  • 统一与高效:nftables 通过统一的 inet 族和简洁的语法,简化了多协议管理,并提供了更好的性能。
  • 架构清晰:其 表 -> 链 -> 规则 的层级结构逻辑清晰,易于管理。
  • 状态防火墙:利用 ct state 模块可以轻松实现有状态连接跟踪,这是现代防火墙的基础。
  • 规则集管理:使用 nft -f 加载配置文件是生产环境的最佳实践,支持原子操作。
  • 安全第一:配置防火墙应遵循“最小权限”原则,默认拒绝,显式允许,并时刻注意规则顺序和自身访问权限。

掌握 nftables 是成为高级 Linux 网络管理员的关键一步。建议在虚拟机环境中反复练习,逐步构建复杂的规则集。在下一课,我们将转向另一个核心运维工具:apt 包管理

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「apt 包管理(Debian/Ubuntu)」 以巩固所学知识。