ufw规则按自上而下顺序匹配,首条匹配即生效;默认策略仅兜底,位于末尾,不参与中间匹配;例外即更靠前的具体allow规则,需确保协议、地址、端口完全匹配。

UFW 的全局默认策略(如 DEFAULT INPUT DENY)和具体规则(如 allow from 192.168.1.100)之间不会“冲突”,而是严格遵循自上而下、第一条匹配即生效的规则链逻辑。理解这个顺序,是正确配置的关键。
默认策略只是兜底行为
UFW 的 ufw default deny incoming 并不是一条“真实规则”,而是告诉防火墙:当所有显式规则都未匹配时,按此动作处理。它始终位于规则列表末尾,不参与中间匹配。
- 所有
ufw allow/ufw deny命令添加的规则,都会插入到默认策略之前 - 用
ufw status numbered可看到完整顺序,编号越小越先执行 - 即使设置了默认 deny,只要某条 allow 规则匹配了数据包,就立即放行,根本不会走到默认策略
例外规则必须明确且优先级足够
所谓“例外”其实就是更具体的 allow 规则,需确保它在默认 deny 生效前被命中:
- 避免用太宽泛的 deny 规则覆盖在 allow 之上(例如手动插入
deny from any to any在 allow 之前) - 若需精细控制,用
ufw insert 1 allow proto tcp from 192.168.1.100 to any port 22强制插到最前面 - 注意接口、源/目标地址、端口、协议必须完全匹配——比如允许 TCP 22,但 SSH 尝试用 UDP 连接仍会被默认 deny 拦截
调试时重点看规则顺序与匹配细节
很多“例外不生效”的问题,实际是规则没匹配上:
- 运行
sudo ufw status verbose查看当前策略、日志状态和规则方向(v6/v4) - 启用日志:
sudo ufw logging on,再查/var/log/ufw.log,确认被拒绝的数据包是否符合你认为该放行的条件 - 检查是否启用了 IPv6 规则(
ufw allow proto tcp from ::1和ufw allow proto tcp from 127.0.0.1是两条独立规则)
推荐配置习惯
减少歧义,提升可维护性:
- 先设默认策略:
ufw default deny incoming、ufw default allow outgoing - 再逐条添加明确的 allow 规则,按重要性或访问频率排序
- 不用
ufw deny加额外限制——默认 deny 已足够;除非需要显式记录某类拒绝(靠日志+特定 deny 规则) - 定期用
ufw status numbered审查,删除冗余或失效规则(ufw delete N)










