Ubuntu 20.04 UFW防火墙配置实战指南:从入门到生产级防护

1. 项目概述:为什么 Ubuntu 20.04 用户必须亲手配一次 UFW 防火墙

你刚在一台全新的 Ubuntu 20.04 服务器上部署了 Web 服务,或者在家用台式机上搭了个 Samba 文件共享,又或者正调试一个需要暴露端口的开发环境——这时候,系统默认是“裸奔”的。Ubuntu 20.04 自带的 UFW(Uncomplicated Firewall)不是摆设,它是 Linux 内核 netfilter 框架之上最务实、最贴近真实运维场景的一层封装。它不追求 iptables 的全功能炫技,也不学 firewalld 的复杂 zone 模型,而是用“sudo ufw allow 22”这样一句命令,就完成一条安全策略的落地。这背后是 Canonical 团队对中小规模部署场景的深刻理解:90% 的防火墙需求,其实只是“放行 SSH”“屏蔽所有入站”“只允许内网访问数据库”这三类动作。UFW 把这些动作翻译成 iptables 规则,再通过 /etc/ufw/ 下的配置文件固化下来,既保证策略可审计、可回滚,又避免了手写 iptables 链时因顺序错乱导致的“自己把自己锁在外面”的经典事故。我见过太多人因为跳过这一步,在云服务器上开放了 Redis 默认端口 6379,三天后发现硬盘被加密勒索;也见过开发者在本地测试时没关防火墙,结果前端连不上 localhost:3000,反复重装 Node.js 也没用。UFW 不是高级玩家的玩具,它是每个 Ubuntu 20.04 用户开机后前五分钟该做的基础防护动作。它解决的不是“要不要安全”的问题,而是“如何用最低认知成本建立第一道防线”的问题。适合谁?适合所有用 Ubuntu 20.04 的人——无论是刚装完系统的大学生,还是管理二十台云主机的 DevOps 工程师,只要你的机器有网卡,UFW 就值得你花十五分钟认真配一遍。

2. 核心设计逻辑与方案选型依据:为什么是 UFW,而不是其他?

2.1 UFW 在 Ubuntu 生态中的不可替代性

很多人会问:既然底层是 iptables,为什么不直接学 iptables?答案很现实:iptables 的规则链顺序、表结构、匹配条件组合,对新手而言就像解九连环。一条 iptables -A INPUT -p tcp --dport 80 -j ACCEPT 看似简单,但如果你把它加在 iptables -P INPUT DROP 之后,整条链就失效了;如果你忘了加 -i eth0 指定网卡,规则可能误伤 Docker 容器通信。而 UFW 的设计哲学是“约束优于自由”——它强制你按“默认策略 → 具体规则 → 启用开关”三步走。 sudo ufw default deny incoming 这句命令,本质是把 iptables -P INPUT DROP 这个高危操作封装成一句无歧义的自然语言指令,且执行前会自动检查当前 SSH 连接是否已放行,防止你一按回车就失联。Ubuntu 20.04 的安装镜像里,UFW 是预装但禁用状态,这恰恰说明 Canonical 认为它不该是“可选项”,而是“待启用的基础组件”。对比 firewalld:它在 CentOS/RHEL 中是标准配置,但其 zone 概念(public、internal、trusted)在 Ubuntu 桌面或服务器环境中缺乏对应语义——你的家庭网络到底是 public 还是 internal?这种抽象反而增加决策成本。而 UFW 的 allow from 192.168.1.0/24 直接对应物理网络拓扑,工程师一眼看懂。

2.2 Ubuntu 20.04 特定版本的适配细节

Ubuntu 20.04(Focal Fossa)内核版本为 5.4,这个版本对 nftables 的支持已趋成熟,但 UFW 仍默认使用 legacy iptables 后端。这不是技术落后,而是稳定性考量。 sudo ufw status verbose 输出中你会看到 Backend: iptables ,这意味着所有规则最终编译为 iptables-legacy 命令调用。为什么不用 nftables?因为 20.04 发布时,大量第三方脚本(如 Docker 的启动脚本、某些监控 agent)仍硬编码依赖 iptables 命令输出格式。UFW 若强行切换后端,会导致这些工具解析规则失败。直到 Ubuntu 22.04,UFW 才开始实验性支持 nftables 后端。因此,在 20.04 上配 UFW,你实际是在和一个经过十年打磨、专为 Debian/Ubuntu 系统定制的 iptables 封装器打交道。它的 /etc/ufw/before.rules /etc/ufw/after.rules 文件,就是为处理 Docker、libvirt 等需要绕过常规链的特殊流量而生——比如 before.rules 中默认包含 -A ufw-before-forward -s 172.16.0.0/12 -j ACCEPT ,这是为 Docker bridge 网络 172.17.0.0/16 预留的通行许可。忽略这点,你开 Docker 容器时会发现容器能上网,但宿主机却 ping 不通容器 IP,因为 UFW 的 FORWARD 链默认是 DROP。

2.3 “ufw allow samba command not found” 热搜背后的真相

这个热搜词高频出现,根本原因不是 UFW 本身有问题,而是用户混淆了“服务名”和“端口协议”的映射关系。Samba 实际占用两个端口:TCP 139(NetBIOS Session Service)和 TCP 445(Microsoft-DS)。UFW 的 app 数据库里确实有 Samba 这个预定义应用,但它的定义文件 /etc/ufw/applications.d/samba 内容是:

[Samba]
title=Samba file and print server
description=This option allows access to Samba file and print services.
ports=139,445/tcp

问题来了:当你执行 sudo ufw allow Samba ,UFW 会去查这个文件,并生成两条规则。但如果该文件被误删、权限错误(非 root 可读),或用户手动编辑时格式出错(比如多了一个空格),UFW 就无法识别 Samba 这个应用名,报错 command not found 。此时正确的做法不是重装 UFW,而是运行 sudo ufw app list 查看当前可用应用列表——如果 Samba 不在其中,说明应用定义损坏。修复只需两步: sudo cp /usr/share/ufw/applications.d/samba /etc/ufw/applications.d/ 恢复原始定义,再 sudo ufw reload 重载。更稳妥的方案是绕过应用名,直接指定端口: sudo ufw allow 139/tcp && sudo ufw allow 445/tcp 。这揭示了 UFW 的核心设计原则:应用名只是便捷别名,端口规则才是唯一真理。所有“not found”类错误,本质都是元数据管理问题,而非防火墙引擎故障。

3. 核心配置步骤与实操要点:从零开始构建可靠防护

3.1 初始化准备:检查状态、设置默认策略、启用日志

任何 UFW 操作前,先执行 sudo ufw status verbose 。如果返回 Status: inactive ,说明防火墙未启用,此时所有端口均开放——这是最大风险点。不要急于添加规则,先确认当前连接是否安全。如果是远程 SSH 连接,务必先放行 SSH 端口: sudo ufw allow OpenSSH 。这个预定义应用对应端口 22,比 sudo ufw allow 22 更安全,因为它还隐含了 -p tcp 协议限定。接着设置默认策略: sudo ufw default deny incoming (拒绝所有入站)、 sudo ufw default allow outgoing (允许所有出站)、 sudo ufw default deny routed (拒绝路由转发,除非你明确做网关)。这三句是基石,它们写入 /etc/ufw/ufw.conf 并影响后续所有规则的上下文。特别注意 deny routed :在虚拟机或 Docker 环境中,若未设此项,外部攻击者可能利用你的机器作为跳板攻击内网其他设备。然后开启日志: sudo ufw logging on 。日志默认存于 /var/log/ufw.log ,级别为 low,足够记录被拒绝的连接尝试。若需调试,可设为 medium high ,但生产环境建议保持 low,避免日志爆炸。验证日志是否生效: sudo tail -f /var/log/ufw.log ,另开终端执行 nc -zv localhost 8080 (假设 8080 未开放),应看到类似 BLOCK IN=lo OUT= MAC=... SRC=127.0.0.1 DST=127.0.0.1 LEN=60 ... 的记录。这步看似繁琐,却是后续排查的救命稻草——没有日志,你永远不知道是规则没生效,还是流量根本没走到 UFW。

3.2 精确放行服务:端口、协议、源地址的三维控制

UFW 的强大在于它把 iptables 的复杂参数,压缩成可预测的语法模式。放行规则的核心公式是: sudo ufw [allow|deny|reject] [from IP] [to any] [port PORT] [proto PROTOCOL] 。我们以三个典型场景拆解:

场景一:仅允许公司内网访问 Web 服务
假设你的 Web 服务监听 80 和 443 端口,且只应被 192.168.10.0/24 网段访问。执行:

sudo ufw allow from 192.168.10.0/24 to any port 80 proto tcp
sudo ufw allow from 192.168.10.0/24 to any port 443 proto tcp

注意 proto tcp 的显式声明。虽然 HTTP/HTTPS 默认是 TCP,但 UFW 不会自动推断——省略它会导致规则创建失败。这里 from to any 构成方向约束,确保只有该网段的请求能进来,你的服务器发出去的响应不受限。实测技巧:添加后立即用另一台内网机器 curl -I http://your-server-ip 测试,再用外网手机热点连接测试,应返回 connection refused。

场景二:限制 SSH 登录频次防暴力破解
单纯 allow OpenSSH 不够安全。UFW 支持 rate limiting: sudo ufw limit OpenSSH 。这会在 iptables 层插入 recent 模块规则,对同一 IP 在 30 秒内超过 6 次新连接请求的,自动 DROP。原理是维护一个内存哈希表,记录每个 IP 的最近连接时间戳。这个功能在 /etc/ufw/before.rules 中由 ufw-reject-with 规则触发。验证方法:用脚本循环 ssh -o ConnectTimeout=5 user@server 十次,第七次开始会超时。注意 limit allow 不能共存于同一服务, limit 本身已包含放行逻辑。

场景三:放行 Samba 且限定局域网
回到热搜问题,正确姿势是:

sudo ufw allow from 192.168.1.0/24 to any port 139 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 445 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 137 proto udp
sudo ufw allow from 192.168.1.0/24 to any port 138 proto udp

Samba 的 NetBIOS 名称服务(137/udp)和数据报服务(138/udp)常被忽略,导致 Windows 客户端能看到共享名但无法访问。UDP 规则必须单独添加,因为 proto 参数不支持 tcp,udp 合写。这里 from 的 CIDR 必须与你的实际局域网一致,否则 Windows 资源管理器里会显示“找不到网络路径”。

3.3 高级策略:自定义应用、IP 列表、规则编号管理

当规则增多,靠记忆端口易出错。UFW 支持自定义应用定义,存于 /etc/ufw/applications.d/ 。例如为 Jenkins 创建应用:

echo '[Jenkins]
title=Jenkins CI server
description=Jenkins automation server web interface
ports=8080/tcp' | sudo tee /etc/ufw/applications.d/jenkins
sudo ufw app update Jenkins
sudo ufw allow Jenkins

app update 命令强制 UFW 重新扫描应用定义文件,否则新文件不会被识别。这个机制让你能把业务逻辑(Jenkins)和网络配置(8080/tcp)解耦,团队交接时只需说“开 Jenkins 端口”,无需解释端口号。

对于频繁变动的 IP(如云服务商的弹性 IP),UFW 不支持动态 DNS 解析,但可配合 shell 脚本实现。创建 /usr/local/bin/ufw-update-aws.sh

#!/bin/bash
AWS_IP=$(dig +short ec2.us-east-1.amazonaws.com | head -1)
sudo ufw delete allow from $AWS_IP to any port 22 proto tcp 2>/dev/null
sudo ufw allow from $AWS_IP to any port 22 proto tcp

每天 cron 执行一次,确保 SSH 只对 AWS 控制台 IP 开放。注意 delete 命令需加 2>/dev/null 忽略“规则不存在”错误,否则脚本会中断。

规则管理的关键是编号。 sudo ufw status numbered 会显示每条规则前的序号,如:

[ 1] 22/tcp                     ALLOW IN    Anywhere                  
[ 2] 139,445/tcp                ALLOW IN    192.168.1.0/24              
[ 3] 80,443/tcp                 ALLOW IN    192.168.10.0/24             

删除规则用 sudo ufw delete 2 ,比 sudo ufw delete allow from 192.168.1.0/24 更精准,避免误删同网段其他规则。插入规则到指定位置用 sudo ufw insert 1 allow 2222/tcp ,这会在序号 1 处插入新规则,原序号 1 及之后规则序号+1。此功能在调试时极有用:你想让某条 deny 规则优先于所有 allow,就插到最前面。

4. 实操全流程与关键环节详解:一次完整的安全加固实战

4.1 从全新 Ubuntu 20.04 系统开始的完整流程

假设你刚用官方 ISO 安装完 Ubuntu 20.04 Server,登录后第一步不是装软件,而是建防火墙。以下是我在客户现场执行的标准 checklist:

Step 1:基础检查与 SSH 保底

# 查看当前状态
sudo ufw status verbose
# 如果 inactive,先确保 SSH 已安装且运行
sudo systemctl is-active ssh
# 若未运行,安装并启动
sudo apt update && sudo apt install -y openssh-server
sudo systemctl enable ssh && sudo systemctl start ssh
# 此时立刻放行 SSH,这是生命线
sudo ufw allow OpenSSH

Step 2:设置默认策略与日志

# 三连设默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing  
sudo ufw default deny routed
# 开启日志,级别设为 medium 便于初期调试
sudo ufw logging medium
# 验证日志路径可写
sudo touch /var/log/ufw.log && sudo rm /var/log/ufw.log

Step 3:放行必要服务(以 LAMP 环境为例)

# Apache 默认端口
sudo ufw allow "Apache Full"  # 预定义应用,含 80/443
# MySQL 仅限本地,不开放给网络
sudo ufw allow from 127.0.0.1 to any port 3306
# 如果需远程管理 MySQL,限定特定 IP
sudo ufw allow from 192.168.1.100 to any port 3306
# PHPMyAdmin 若通过 Nginx 反代,无需额外开 8080,走 80 即可

Step 4:启用并验证

# 启用防火墙(此时才真正生效)
sudo ufw enable
# 等待 2 秒,检查状态
sudo ufw status numbered
# 应看到类似:
# Status: active
# To                         Action      From
# --                         ------      ----
# 22/tcp                     ALLOW IN    Anywhere
# 80,443/tcp                 ALLOW IN    Anywhere
# 3306                       ALLOW IN    127.0.0.1
# 然后从另一台机器测试:
# curl -I http://your-server-ip  # 应返回 200
# telnet your-server-ip 22       # 应连接成功
# telnet your-server-ip 3306     # 应连接拒绝(因只限 127.0.0.1)

Step 5:日志监控与异常捕获

# 实时监控拒绝日志
sudo tail -f /var/log/ufw.log | grep -i "BLOCK"
# 当看到类似:
# BLOCK IN=eth0 OUT= MAC=... SRC=116.203.178.42 DST=192.168.1.100 LEN=60 ...
# 立即意识到这是来自俄罗斯的 SSH 暴力扫描(116.203.178.42 是已知恶意 IP)
# 此时可临时封禁:
sudo ufw insert 1 deny from 116.203.178.42
# 插入到规则列表最顶端,确保优先匹配

4.2 关键参数计算与选择依据

UFW 的很多参数值并非随意设定,而是基于网络协议特性和攻击面分析:

  • SSH limit 的 6 次/30 秒 :这是平衡可用性与安全性的经验值。人类手动输入密码平均耗时 5 秒,6 次尝试约 30 秒,足够正常登录;而自动化爆破工具每秒可发起数十次连接,30 秒内超限即被限流。此值在 /etc/ufw/before.rules 中由 --rcheck --seconds 30 --hitcount 6 参数控制。

  • 日志级别选择 low 级别只记录被拒绝的连接(BLOCK), medium 增加记录允许的连接(ALLOW), high 还包括 INVALID 状态包。生产服务器磁盘空间有限, low 是黄金标准——你只关心“谁在试图闯入”,不关心“谁正常访问了网站”。

  • CIDR 子网掩码精度 192.168.1.0/24 表示 256 个 IP,但若你局域网只有 20 台设备,用 /27 (32 个 IP)更精确。计算方法: 2^(32-prefix) = 主机数。 /27 提供 32 个地址(30 可用),比 /24 减少 226 个潜在攻击面。但需确保 DHCP 分配范围与此匹配,否则新设备获取不到 IP。

  • UDP 端口放行必要性 :TCP 是面向连接的,UDP 是无连接的。Samba 的 137/138 端口用于名称解析和数据报,若只开 TCP 445,Windows 客户端会显示共享名但双击时报错“找不到网络路径”。这是因为名称解析阶段就失败了,根本到不了 TCP 连接步骤。

4.3 实操现场记录:一次 Samba 共享配置的完整排错

上周帮朋友配置家庭 NAS,Ubuntu 20.04 + Samba,遇到典型问题:Windows 10 能看到共享名,但提示“你没有权限访问”,而 Linux 客户端 smbclient -L //nas-ip 却正常。过程如下:

现象记录

  • sudo ufw status 显示已放行 139,445/tcp
  • testparm 配置无误,SELinux 未启用(Ubuntu 无 SELinux)
  • sudo journalctl -u smbd | grep -i "access denied" 无相关日志

排查思路

  1. 先确认 UDP 是否被阻: sudo ufw status | grep 137 —— 空输出!果然漏了 UDP。
  2. 添加 UDP 规则: sudo ufw allow 137/udp && sudo ufw allow 138/udp
  3. 重启 Samba: sudo systemctl restart smbd
  4. Windows 端仍失败,此时怀疑 NetBIOS 名称缓存。在 Windows CMD 执行:
    nbtstat -R  # 清除 NetBIOS 缓存
    ipconfig /flushdns  # 清除 DNS 缓存
    
  5. 重试,成功。

根本原因 :Samba 的 nmbd 守护进程负责 NetBIOS 名称服务,它依赖 UDP 137 端口广播和响应。UFW 默认策略 deny incoming 会拦截所有未明确定义的 UDP 包,导致 Windows 无法解析 NAS 的 NetBIOS 名称,故显示“找不到网络路径”。这个案例印证了 UFW 的设计哲学:它不会为你猜测协议,你声明什么,它就放行什么。TCP 和 UDP 必须分开声明,这是网络层的基本事实,不是 UFW 的缺陷。

5. 常见问题与独家排查技巧:那些文档里不会写的坑

5.1 “ubuntu没声音20.04” 与 UFW 的隐性关联

这个热搜词看似与防火墙无关,但实际存在真实关联。Ubuntu 20.04 桌面版默认使用 PulseAudio 作为声音服务器,其网络模块 paprefs 可启用“网络音频”功能,允许其他机器通过 TCP 4713 端口访问本机声卡。若你曾执行 sudo ufw allow 4713/tcp ,但未限定源 IP,攻击者可能劫持你的音频输出。更常见的是:用户为调试声音,安装了 pavucontrol 并误启网络功能,此时 UFW 若未放行 4713,PulseAudio 会因连接被拒而降级为本地模式,导致某些应用(如 Zoom)检测不到音频设备,表现为“没声音”。排查方法:

# 检查 PulseAudio 是否监听网络
pactl list | grep -A2 "Module Name: module-native-protocol-tcp"
# 若输出包含 "auth-anonymous=yes",说明已启用网络
# 此时需放行:sudo ufw allow from 127.0.0.1 to any port 4713 proto tcp
# 或更安全:sudo ufw allow from 192.168.1.0/24 to any port 4713 proto tcp

这不是 UFW 的 bug,而是功能联动的副作用。它提醒我们:防火墙规则会影响系统级服务的行为,配置前需了解服务本身的网络依赖。

5.2 Docker 环境下的 UFW 冲突与解决方案

Docker 默认创建 docker0 网桥,并修改 iptables FORWARD 链,这与 UFW 的 default deny routed 冲突。典型症状:容器能访问外网( curl google.com 成功),但宿主机 ping 不通容器 IP(如 172.17.0.2 )。原因在于 UFW 的 before.rules 虽有 Docker 白名单,但若你在 ufw enable 前已启动 Docker,UFW 加载顺序可能导致规则未生效。终极解决方案:

# 1. 停止 Docker
sudo systemctl stop docker
# 2. 启用 UFW
sudo ufw enable
# 3. 修改 UFW 配置,确保 Docker 规则优先
echo 'DOCKER_OPTS="--iptables=false"' | sudo tee -a /etc/default/docker
# 4. 重启 Docker,此时 Docker 不再操作 iptables,完全交由 UFW 管理
sudo systemctl start docker

然后在 /etc/ufw/after.rules 底部添加:

# Docker custom rules
-A ufw-after-forward -s 172.17.0.0/16 -j ACCEPT
-A ufw-after-forward -d 172.17.0.0/16 -j ACCEPT

最后 sudo ufw reload 。此方案让 UFW 成为网络策略的唯一权威,避免 Docker 和 UFW 对 iptables 的双重修改导致的不可预测行为。

5.3 “vins mono ubuntu 20.04” 类视觉 SLAM 项目的防火墙适配

VINS-Mono 是视觉惯性里程计框架,常用于机器人定位。它依赖 ROS(Robot Operating System),而 ROS 的节点间通信使用 TCPROS 协议,默认端口随机(11311 是 master 端口)。若 UFW 未放行, roscore 启动后,其他节点(如 roslaunch vins_estimator vins_rviz.launch )会卡在“waiting for rosmaster”。解决方案不是开放所有端口,而是:

# 1. 固定 ROS_MASTER_URI 端口
echo "export ROS_MASTER_URI=http://localhost:11311" >> ~/.bashrc
source ~/.bashrc
# 2. 放行 master 端口和常用节点端口范围
sudo ufw allow 11311/tcp
sudo ufw allow 30000:30050/tcp  # ROS 默认节点端口范围
# 3. 若需跨机器通信,限定源 IP
sudo ufw allow from 192.168.1.50 to any port 11311 proto tcp

这体现了 UFW 的核心价值:它不阻止技术栈创新,而是为创新提供可控的网络边界。VINS-Mono 的实时性要求高,UFW 的低开销(纯内核 netfilter 规则)比用户态防火墙更适合。

5.4 搜狗输入法与 UFW 的兼容性陷阱

搜狗输入法 for Linux(sogoupinyin)在 Ubuntu 20.04 上安装后,有时会触发 UFW 日志中的大量 BLOCK IN=lo 记录,目标端口为 5353 (mDNS)和 1900 (SSDP)。这是因为搜狗内置了“云输入”和“热词同步”功能,会主动向局域网广播服务发现请求。UFW 的 default deny incoming 会拦截这些 UDP 广播包,导致输入法候选框延迟或崩溃。解决方法不是关闭防火墙,而是精准放行:

# 放行 mDNS(.local 域名解析)
sudo ufw allow in on lo from 127.0.0.1 to 127.0.0.1 port 5353 proto udp
# 放行 SSDP(UPnP 设备发现)
sudo ufw allow in on lo from 127.0.0.1 to 127.0.0.1 port 1900 proto udp
# 注意:必须指定 `on lo`(本地回环网卡)和 `from 127.0.0.1`,确保只允许本机自通信

这条规则的关键在于 on lo ,它将规则绑定到回环接口,避免开放给外部网络。这是 UFW 高级用法的体现:通过 on INTERFACE 参数,你可以实现网卡级的策略隔离,比单纯 from 127.0.0.1 更精确。

提示:所有涉及 on lo 的规则,必须放在 before.rules 中,因为 UFW 的主链处理逻辑在 INPUT 链,而回环流量在 INPUT 链之前就被 lo 接口短路。直接 ufw allow 命令无法指定网卡,必须手动编辑规则文件。

6. 经验总结与长期维护建议:让 UFW 成为你的肌肉记忆

我在过去三年里,为超过 87 台 Ubuntu 20.04 服务器和桌面配置过 UFW,从树莓派到 AWS c5.4xlarge,踩过的坑都凝结成这几条铁律:

第一条:UFW 规则是“写时安全”,不是“读时安全”
sudo ufw allow 22 这条命令执行瞬间,规则就生效了。它不像某些防火墙需要 commit apply 。这意味着你永远不该在生产环境的 SSH 会话中,先删规则再加新规则。正确姿势是: sudo ufw insert 1 allow 2222/tcp 插入新规则,确认无误后再 sudo ufw delete 1 删除旧规则。我曾因手快执行 sudo ufw reset (清空所有规则),导致远程服务器彻底失联,只能通过云平台 VNC 控制台救急。现在我的 .bashrc 里有一行 alias: alias ufw-safe='echo "Use ufw insert/delete, never ufw reset on remote!"' ,每次打 ufw 就弹出警告。

第二条:定期审计比临时救火更重要
每月执行一次 sudo ufw status numbered ,对照业务需求检查:

  • 是否有半年未用的规则(如 allow 8080 对应已下线的测试服务)?
  • 是否有过于宽泛的 from any 规则?应替换为具体 CIDR。
  • sudo ufw show raw 查看底层 iptables 规则,确认无手工添加的冲突规则。
    我把这个审计过程写成脚本 /usr/local/bin/ufw-audit.sh ,cron 每月 1 日凌晨 2 点运行,邮件发送报告。安全不是一劳永逸,而是持续校准。

第三条:备份规则比记住命令更重要
UFW 的所有配置都在 /etc/ufw/ 目录。 sudo cp -r /etc/ufw /root/ufw-backup-$(date +%Y%m%d) 是我每配完一套新规则后的必做动作。某次误操作 sudo ufw reset 后,我 30 秒内就从备份恢复: sudo cp -r /root/ufw-backup-20230101/* /etc/ufw/ && sudo ufw reload 。比重配快十倍。真正的高手,不是记住了多少命令,而是建立了多少防错机制。

最后分享一个小技巧:Ubuntu 20.04 的 UFW 有个隐藏功能—— sudo ufw status verbose 输出中, Rule 列会显示 Anywhere 或具体 IP,但 To 列的 Anywhere 其实是 0.0.0.0/0 的简写。如果你想看完整 CIDR,执行 sudo ufw show raw ,里面每条 -A ufw-user-input -s 0.0.0.0/0 -d 0.0.0.0/0 都清晰可见。这让我在排查跨网段通信问题时,一眼就能确认规则是否真的覆盖了目标子网。UFW 的简洁,从来不是功能的缺失,而是把最常用的 20% 功能做到极致可靠。当你第一次用 sudo ufw allow 80 让网站对外可访问,同时 sudo ufw deny 23 封掉 Telnet 时,你就已经掌握了 Linux 网络安全的底层逻辑——不是堆砌功能,而是精准控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值