教程 · 安全加固
用 ufw 配置防火墙(以及什么时候该直接写 nftables)
难度
入门
预计时长
15 分钟
步骤
6 步
最近修订
基准系统
Debian 12
要点
用 ufw 配置防火墙(以及什么时候该直接写 nftables)
ufw 的标准配置是四步:默认拒绝所有入站、放行 SSH 端口、放行 80 与 443,最后 ufw enable。需要更精细的控制(多张表、端口转发、按接口区分策略)时再直接写 nftables 规则集 —— 但两者不要同时启用,否则出问题时没人说得清哪一套在生效。
前置条件
开始之前,先确认这些都具备
- 一台 Debian/Ubuntu 服务器与 sudo 权限
- 知道自己当前的 SSH 端口号
操作步骤
共 6 步
步骤 01 / 06
安装并设定默认策略 #
先定策略再开门,这是防火墙配置的正确顺序:默认拒绝一切入站、允许一切出站。此时还没有 enable,所以不会断线。
Shell sudo apt update && sudo apt install -y ufw sudo ufw default deny incoming sudo ufw default allow outgoing步骤 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'步骤 03 / 06
放行业务端口并启用 #
只开真正在用的端口。建站开 80 与 443,其余一律不开 —— 数据库、Redis、监控面板都应当通过 SSH 端口转发访问,而不是暴露到公网。
Shell sudo ufw allow 80,443/tcp comment 'web' sudo ufw enable sudo ufw status verbose步骤 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步骤 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步骤 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]。 指出错误的邮件比沉默的旧文档有价值得多。