跳转至

13 - 防火墙配置(nftables / ufw)

前提条件

  • 已完成 SSH 端口改为 2222、公钥认证、fail2ban、AppArmor、内核参数加固
  • 以 root 身份登录,或 ops 用户执行 sudo -i 切换至 root 环境
  • 系统运行在 Debian 12 Bookworm
  • 虚拟机环境:VMware Workstation Pro(建议桥接网络,便于从宿主机测试)

全局参数

主机名 linuxdc,IP 192.168.1.100/24,SSH 端口 2222,运维用户 ops

操作前必读

防火墙配置错误会立即导致 SSH 连接中断。操作前务必确保可通过 VMware 控制台(非 SSH)访问虚拟机,作为恢复通道。每次变更后立即在另一个终端验证 SSH 连接是否仍然可用。

详细步骤

1. Debian 12 防火墙技术栈说明

方案 定位 推荐场景
nftables 内核原生框架(5.10+),取代 iptables 生产精细控制,中大型服务器
ufw nftables/iptables 前端,语法简单 学习环境、中小型单机服务器
iptables-nft iptables 语法兼容层(底层走 nftables) 迁移旧 iptables 规则

选择建议

学习阶段或快速部署用 ufw;需要精细控制(端口限速、连接跟踪、多表复杂规则)时用 nftables 直接编写规则。两者不要同时开启管理同一套规则,避免冲突。

2. 方案一:ufw(推荐入门与中小型服务器)

安装并初始化:

apt update
apt install -y ufw

配置基本规则:

# 设置默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 只允许 SSH 2222 端口
ufw allow 2222/tcp comment 'SSH custom port'

# 可选:只允许特定管理网段访问 SSH
# ufw allow from 192.168.1.0/24 to any port 2222 proto tcp

# 启用防火墙(--force 跳过交互确认)
ufw --force enable

检查点

ufw status verbose
# 应显示:
# Status: active
# Default: deny (incoming), allow (outgoing)
# 2222/tcp  ALLOW IN  Anywhere
从宿主机 ssh -p 2222 ops@192.168.1.100 确认仍可登录。

常用 ufw 管理命令:

ufw status numbered      # 带编号显示规则,便于删除
ufw delete 3             # 删除第 3 条规则
ufw delete allow 2222/tcp  # 按规则内容删除
ufw reload               # 重载规则(不停用防火墙)
ufw disable              # 临时停用(生产慎用)
ufw logging on           # 启用防火墙日志

3. 方案二:nftables(推荐生产精细控制)

确认 nftables 状态:

nft list ruleset         # 查看当前规则集(默认为空)
systemctl status nftables

创建生产级配置文件:

vim /etc/nftables.conf

最小化生产规则示例(保护当前服务器):

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

        # 允许回环接口
        iif lo accept

        # 允许已建立和相关联的连接(放行回包)
        ct state { established, related } accept

        # 丢弃无效连接
        ct state invalid drop

        # 允许 ICMP(ping、traceroute 等)
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept

        # SSH:只允许 2222 端口
        tcp dport 2222 ct state new accept

        # 可选:只允许内网管理网段
        # ip saddr 192.168.1.0/24 tcp dport 2222 accept

        # 记录并丢弃其他所有入站(可选,日志量较大)
        # log prefix "nftables-drop: " drop
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

检查语法后加载并启用:

nft -c -f /etc/nftables.conf          # 干跑检查语法,无输出表示正确
nft -f /etc/nftables.conf             # 加载规则
systemctl enable nftables
systemctl restart nftables

验证规则已加载:

nft list ruleset

检查点

nft list ruleset 输出完整的 table inet filter 规则集,ssh -p 2222 ops@192.168.1.100 从宿主机仍可登录,其他端口连接被拒绝。

常用 nftables 运行时操作:

# 临时添加规则(重启后丢失,测试用)
nft add rule inet filter input tcp dport 80 accept

# 查看规则(含句柄 handle,用于删除)
nft list ruleset -a

# 删除指定规则(需先查到 handle 编号)
nft delete rule inet filter input handle 5

# 保存当前规则到配置文件
nft list ruleset > /etc/nftables.conf

4. ufw 与 nftables 同时使用的注意事项

避免规则冲突

ufw 和 nftables 不要同时管理同一套入站规则。若之前已用 ufw 配置规则,切换到 nftables 前先执行:

ufw disable
反之亦然。两者底层都通过 nftables 内核模块生效,但规则表名不同,同时启用会导致规则叠加,行为难以预测。

5. 最终验证(所有方案通用)

# 确认 SSH 端口监听
ss -tuln | grep 2222

# 从宿主机测试连通性(在宿主机上执行)
ssh -p 2222 ops@192.168.1.100              # 应成功
ssh -p 22 ops@192.168.1.100               # 应超时或拒绝

# 查看防火墙日志
journalctl -u nftables -n 30              # nftables 服务日志
journalctl | grep "ufw"                   # ufw 日志

实践任务

  1. 使用 ufw 配置只允许 2222/tcp 入站,其他全部拒绝,启用后验证 ufw status
  2. (进阶)切换到 nftables:禁用 ufw,创建 /etc/nftables.conf,加载并验证规则
  3. 从宿主机尝试连接其他端口(如 80、22),确认被阻断;连接 2222 端口确认正常
  4. 查看防火墙日志(journalctl -u nftablesjournalctl | grep ufw),确认有规则生效的记录

自测问题

1. ufw 和 nftables 的主要区别是什么?生产环境更推荐哪种?

ufw 是面向管理员的高级封装工具,语法接近自然语言(ufw allow 2222/tcp),自动处理 IPv4/IPv6 双栈、连接跟踪等底层细节,上手快但灵活性有限,不支持连接限速、端口转发等高级场景。nftables 是内核原生框架,语法更接近编程语言,支持集合(set)、计数器、限速(rate limit)、端口映射等高级功能,规则文件可版本控制,便于 CI/CD 自动化部署。对于只需要基础入站控制的中小型服务器,ufw 已完全够用;需要精细控制(多网卡策略、连接限速、容器网络规则)时,nftables 是生产首选。

2. ct state { established, related } accept 这条规则的作用是什么?

ct state 利用 nftables 的连接跟踪(conntrack)模块维护连接状态表。established 表示该数据包属于已通过 input 链允许的现有连接的回包或后续包;related 表示该数据包与现有连接相关(如 FTP 数据通道相对于控制连接,ICMP 错误消息相对于触发它的 TCP 连接)。若没有这条规则,虽然出站允许,但入站回包会被 policy drop 丢弃,导致所有出站连接(apt 更新、curl 等)无法收到响应。这条规则是有状态防火墙的核心,必须存在。

3. 如何在 ufw 中快速删除一条规则(两种方式)?

方式一:按编号删除(先查编号再删除):

ufw status numbered        # 查看带编号的规则列表
ufw delete 3               # 删除编号为 3 的规则

方式二:按规则内容删除(直接指定与添加时相同的规则描述):

ufw delete allow 2222/tcp
ufw delete allow from 192.168.1.0/24 to any port 2222

4. 如果防火墙启用后 SSH 断开,最快速的恢复方法是什么?

通过 VMware Workstation Pro 控制台直接登录虚拟机(不受防火墙影响),然后:

# ufw 方式:检查并修正规则
ufw status numbered
ufw allow 2222/tcp
ufw reload

# 或临时禁用防火墙
ufw disable

# nftables 方式:清空所有规则(立即生效)
nft flush ruleset
# 然后重新加载正确的配置
nft -f /etc/nftables.conf

这再次强调了操作防火墙前必须确认 VMware 控制台可用的重要性。

总结

防火墙是服务器网络边界的最后一道防线。ufw 适合快速部署与日常管理,nftables 提供最高灵活性与性能。本章建立的"默认拒绝 + 只开必要端口"原则,是后续 Web 服务、数据库、容器等服务暴露时的安全基石。每次新增服务开放端口时,务必同步更新防火墙规则并验证。