跳转至

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

前提条件 ✅

  • 已完成 SSH 端口改为 2222、公钥认证、fail2ban、AppArmor、内核参数加固
  • 以 ops 用户登录(具有 sudo 权限)
  • 系统运行在 Debian 12 Bookworm
  • 虚拟机环境:VMware Workstation Pro(建议桥接网络,便于外部测试)

详细步骤 🛠️

  1. Debian 12 防火墙现状
  2. 默认:nftables(内核 5.10+ 原生支持,取代 iptables)
  3. iptables-nft 作为兼容层存在
  4. ufw:用户友好前端,默认未启用,但最易上手

推荐生产路径: - 小型/学习环境 → ufw(简单、直观) - 中大型/需要精细控制 → nftables 直接编写规则 - 迁移旧 iptables 规则 → iptables-nft

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

安装并初始化:

sudo apt update
sudo apt install -y ufw

配置基本规则(全局约定:只开 SSH 2222):

sudo ufw default deny incoming
sudo ufw default allow outgoing

sudo ufw allow 2222/tcp comment 'SSH custom port'
# 可选:允许内网管理
# sudo ufw allow from 192.168.1.0/24 to any port 2222

# 启用 ufw(--force 跳过交互确认)
sudo ufw --force enable

常用命令:

sudo ufw status verbose
sudo ufw status numbered     # 带编号,便于删除
sudo ufw delete 3            # 删除第 3 条规则
sudo ufw reload
sudo ufw disable             # 临时关闭(生产慎用)

  1. 方案二:nftables(现代原生方式,推荐生产精细控制)

确认 nftables 可用:

sudo nft list ruleset
sudo systemctl status nftables

创建简单配置文件(推荐方式):

sudo nano /etc/nftables.conf

生产级最小化配置示例:

#!/usr/sbin/nft -f

flush ruleset

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

        # 允许 loopback
        iif lo accept

        # 允许已建立/相关连接
        ct state { established, related } accept

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

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

        # 可选:允许内网所有
        # ip saddr 192.168.1.0/24 accept
    }

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

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

加载并启用:

sudo nft -c -f /etc/nftables.conf          # 先检查语法
sudo nft -f /etc/nftables.conf
sudo systemctl enable nftables
sudo systemctl restart nftables
sudo nft list ruleset

  1. 方案三:iptables-nft(兼容旧规则)
    如果已有 iptables 脚本,可直接使用:
    sudo apt install -y iptables
    sudo iptables -L -v -n
    

示例快速规则:

sudo iptables -P INPUT DROP
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4

  1. 最终验证(所有方案通用)
    sudo ss -tuln | grep 2222
    nc -zv 127.0.0.1 2222
    # 从外部机器测试
    # ssh -p 2222 ops@192.168.1.100
    sudo nft list ruleset   # 或 sudo ufw status
    

实践任务 🎯

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

自测问题 ❓

  1. ufw 和 nftables 的主要区别是什么?生产环境更推荐哪种?
  2. ct state { established, related } accept 这条规则的作用是什么?
  3. 如何在 ufw 中快速删除一条规则(两种方式)?
  4. 如果防火墙启用后 SSH 断开,最快速的恢复方法是什么(VMware 控制台)?

总结 📌

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