跳到主要内容
注册无需实名认证
安云主机 AnYun VPS

教程 · 安全加固

用 ufw 配置防火墙(以及什么时候该直接写 nftables)

难度

入门

预计时长

15 分钟

步骤

6

最近修订

基准系统

Debian 12

要点

用 ufw 配置防火墙(以及什么时候该直接写 nftables)

ufw 的标准配置是四步:默认拒绝所有入站、放行 SSH 端口、放行 80 与 443,最后 ufw enable。需要更精细的控制(多张表、端口转发、按接口区分策略)时再直接写 nftables 规则集 —— 但两者不要同时启用,否则出问题时没人说得清哪一套在生效。

前置条件

开始之前,先确认这些都具备

  • 一台 Debian/Ubuntu 服务器与 sudo 权限
  • 知道自己当前的 SSH 端口号

操作步骤

6

  1. 步骤 01 / 06

    安装并设定默认策略 #

    先定策略再开门,这是防火墙配置的正确顺序:默认拒绝一切入站、允许一切出站。此时还没有 enable,所以不会断线。

    Shell
    sudo apt update && sudo apt install -y ufw
    
    sudo ufw default deny incoming
    sudo ufw default allow outgoing
  2. 步骤 02 / 06

    放行 SSH —— 在 enable 之前 #

    这一条如果忘了或者端口写错,ufw enable 的那一瞬间你就断线了。ufw 会在启用时给出警告,那句警告不是客套话。用 limit 代替 allow,还能顺便对同一来源 IP 的频繁连接做限速。

    Shell
    sudo ufw limit 22022/tcp comment 'ssh'
    
    # 如果你有固定 IP,最好的做法是只放行自己
    sudo ufw allow proto tcp from 203.0.113.0/24 to any port 22022 comment 'ssh-office'
  3. 步骤 03 / 06

    放行业务端口并启用 #

    只开真正在用的端口。建站开 80 与 443,其余一律不开 —— 数据库、Redis、监控面板都应当通过 SSH 端口转发访问,而不是暴露到公网。

    Shell
    sudo ufw allow 80,443/tcp comment 'web'
    
    sudo ufw enable
    sudo ufw status verbose
  4. 步骤 04 / 06

    确认 IPv6 也在管控之内 #

    服务器带 /64 的 IPv6 段,如果 ufw 的 IPv6 支持没开,规则只作用于 IPv4,等于半扇门开着。Debian/Ubuntu 默认是开的,但重装或迁移过的机器值得确认一次。

    Shell
    grep '^IPV6=' /etc/default/ufw     # 期望 IPV6=yes
    
    # 若为 no,改成 yes 后重新加载
    sudo sed -i 's/^IPV6=no/IPV6=yes/' /etc/default/ufw
    sudo ufw disable && sudo ufw enable
  5. 步骤 05 / 06

    日常维护:查看、删除、日志 #

    删规则要按编号删,别凭记忆重敲原命令 —— 带 comment 的规则和不带的会被视为两条不同规则。日志级别开到 low 就够用,high 会很快把小磁盘写满。

    Shell
    sudo ufw status numbered
    sudo ufw delete 3
    
    sudo ufw logging low
    sudo tail -f /var/log/ufw.log
  6. 步骤 06 / 06

    进阶:直接写一套最小可用的 nftables 规则集 #

    ufw 本身就是 nftables/iptables 的前端。当你需要多张表、端口转发、按接口区分策略,或者想把整套规则纳入版本管理时,直接写 nftables 更清爽。前提是先彻底停用 ufw。加载之前一定要先用 -c 做语法检查。

    Shell
    sudo ufw disable
    sudo apt install -y nftables
    
    sudo tee /etc/nftables.conf > /dev/null <<'EOF'
    #!/usr/sbin/nft -f
    flush ruleset
    
    table inet filter {
      chain input {
        type filter hook input priority filter; policy drop;
    
        ct state established,related accept
        ct state invalid drop
        iif lo accept
    
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept
    
        tcp dport { 22022, 80, 443 } accept
      }
    
      chain forward {
        type filter hook forward priority filter; policy drop;
      }
    
      chain output {
        type filter hook output priority filter; policy accept;
      }
    }
    EOF
    
    # -c 只做语法检查,不加载;这一步不能省
    sudo nft -c -f /etc/nftables.conf
    sudo systemctl enable --now nftables
    sudo nft list ruleset

常见错误

这一步最容易踩的坑

下面每一条都对应一个真实会发生的故障。先读完再动手,比出问题之后再回来查要省时间。

  • Docker 会绕过 ufw。docker run -p 8080:80 直接往 iptables 的 DOCKER 链里插规则,ufw status 看起来一切正常,端口却已经对全世界开放。解决办法是在 compose 里写 127.0.0.1:8080:80,只绑定回环地址。
  • ufw enable 之前忘了放行 SSH。断线之后只能靠控制台 VNC 进去执行 ufw disable。
  • 删规则时凭记忆重敲一遍原命令:带 comment 与不带 comment 会被当成两条不同规则,结果是删了个寂寞。用 status numbered 按编号删。
  • ufw 与 firewalld 同时安装,或手工 iptables 规则与 ufw 并存。选一个,把另一个彻底停用并 disable。
  • 只配了 IPv4。攻击者不在乎你走哪个协议栈,有 IPv6 地址就会被扫到。
  • 为了图方便把数据库端口放行给 0.0.0.0/0。3306、5432、6379 暴露在公网,被入侵只是时间问题。

这篇教程的边界

  • 命令以 Debian 12 为准。Ubuntu 与 Rocky Linux 的差异只在正文明确标注之处,未标注的部分请以你所用发行版的官方文档为准。
  • 示例中的 IP 来自文档保留段 203.0.113.0/24,域名为 example.com,端口为示意值。复制后必须替换成自己的值, 原样执行不会有任何效果。
  • 教程不能替代备份。任何会改动数据或线上流量的步骤,执行前先确认有一份验证过能恢复的备份。
  • 本站不提供任何用于绕过网络审查的配置或说明,这篇也不例外。

发现命令过时或有误,请发邮件到 [email protected]。 指出错误的邮件比沉默的旧文档有价值得多。

联系 工单
扫码
手机访问

扫码在手机上打开