电脑课堂
柔彩主题三 · 更轻盈的阅读体验

防火墙规则优先级搞不清?别让顺序坑了你

发布时间:2025-12-12 00:06:25 阅读:451 次

公司新上了个内部系统,同事小李兴冲冲配置完防火墙,结果外网死活访问不了。查了一圈网络、端口、服务都没问题,最后发现是防火墙规则顺序写反了——允许的规则被后面的拒绝规则挡住了。

规则不是堆上去就行,顺序决定生死

很多人以为只要把“允许80端口”写进防火墙就万事大吉,其实不然。防火墙处理规则是一条一条往下走的,一旦匹配上某条规则,就会立刻执行,不再看后面的。

比如你写了两条规则:

拒绝所有入站连接
允许TCP 80端口入站

看起来好像没问题,但实际上第二条永远用不上。因为所有流量进来先碰到第一条“拒绝所有”,直接就被拦下了,压根轮不到80端口的放行规则。

正确的写法:具体在前,笼统在后

应该把最具体的规则放在前面,最宽泛的留在最后。比如:

允许TCP 80端口入站
允许TCP 443端口入站
拒绝所有入站连接

这样HTTP和HTTPS流量能正常通过,其他不明来路的连接则被统一拦截,这才是合理的结构。

实际排查时怎么确认顺序?

以Windows防火墙为例,打开“高级安全Windows防火墙”,左侧选“入站规则”,右边会列出所有规则。注意看它们的“操作”和“名称”,但真正的执行顺序并不按这里显示的排列,而是由“组策略”或“配置文件优先级”决定。

更直观的方式是用命令行查看:

netsh advfirewall firewall show rule name=all

输出结果里每条规则都有优先级信息,部分第三方防火墙还会明确标注“Rule Order”或“Sequence Number”。

别忽视默认规则的存在

很多系统自带默认拒绝策略,比如Linux的iptables,默认链策略可能是DROP。这时候即使你加了允许规则,但如果位置靠后或者没生效,流量照样被丢弃。

可以检查当前策略:

iptables -L INPUT --line-numbers

看到类似 Chain INPUT (policy DROP) 就说明默认是拒绝的,必须确保你的允许规则在它之前且正确加载。

改完规则记得测试

本地通了不代表远程能连。建议从外部发起一次真实访问测试,比如用手机4G网络尝试连接服务器80端口,或者让异地同事帮忙ping一下(如果允许ICMP)。

也可以用telnet简单测端口:
telnet your-server-ip 80
如果连不上,先别急着加规则,回头看看已有规则的顺序是不是出了问题。

有时候,删一条错的规则,比加十条新的还管用。