ufw 防火墙规则加了不生效:先看方向和默认策略,再看写法
做 Ubuntu 运维的人多半碰过这么一件事:在服务器上用 ufw 加了一条放行规则,服务还是连不上;或者明明 deny 了一个地址,对方照样能访问。命令敲下去没有任何报错,规则列表里也看得到它,可行为就是不像你想要的那样。问题多半不在"规则没加上",而在"规则加错了层次"——方向、默认策略、写法,这三层里总有一层和你想的不一样。
第一层:方向对不对
ufw 的每条规则都有方向:allow in 是放行进入本机的流量,allow out 是放行从本机出去的流量。要开放一个服务给外部访问,得放行的是"进入",写成 out 就等于白写。方向这个词在配置时很容易顺手敲反——脑子里想的是"这个服务要能出去",写出来的却应该是 in。动手前先问自己一句:这条流量是进还是出,再核对命令。
第二层:默认策略和规则的叠加账
ufw 有两组默认策略:incoming 和 outgoing。常见的部署是 incoming 默认拒绝、outgoing 默认允许,再逐条放行要开放的服务。这里有两笔账容易算错:一是默认策略不是"兜底放行",它排在所有具体规则之后,任何没被显式规则命中的流量都按它处理;二是规则的匹配是从上往下、第一条命中即停——前面有一条更宽的 allow 或 deny 挡着,后面那条更精确的规则根本轮不到出场。规则一多,用 ufw status numbered 排着序号看顺序,比肉眼扫一遍靠谱。
第三层:写法是不是你想的那个意思
服务名和端口不是一回事:ufw allow ssh 放行的是它解析到的那个端口,如果你装的服务实际监听在别的端口上,这条规则看着生效、实际没对上号——直接写端口和协议更稳(比如 22/tcp)。另外,规则可以限定来源地址或网卡接口(on eth0、from 某网段),当初排查时临时加的限定条件留在生产规则里,环境一变就成了"莫名不生效"。
排查四步走
- 先看全景:ufw status verbose,把规则列表、默认策略、活动网卡一次看全,确认规则真的在、方向对、顺序合理。
- 核对写法:端口和协议写明确,限定条件该删的删,改完用实际连接验证,不要只看状态表。
- 查底层:ufw 只是 iptables 的前端,iptables -L -n 能看到真实生效的链。有些组件(容器网络常见)会直接往底层写规则,这一层 ufw 的状态页看不到,但流量就是按它走的。
- 从外部验证:本机看一切正常不代表外面能进来,换一台机器做真实连接测试,结果比任何状态页都硬。
顺带划个界:RHEL 系默认的 firewalld 是另一套模型,思路相通但命令完全不同,这篇只讲 Debian/Ubuntu 侧的 ufw。贵州诚鑫致达科技交付 Ubuntu 服务器时,防火墙每做一次变更都会补一步外部真实连接验证——状态页看着对,不如一次实际连通作数。你的 ufw 规则是加了不生效,还是 deny 了拦不住?欢迎把规则和现象留在评论区,我按层次帮你拆。