公司新上了个内部系统,同事小李兴冲冲配置完防火墙,结果外网死活访问不了。查了一圈网络、端口、服务都没问题,最后发现是防火墙规则顺序写反了——允许的规则被后面的拒绝规则挡住了。
规则不是堆上去就行,顺序决定生死
很多人以为只要把“允许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
如果连不上,先别急着加规则,回头看看已有规则的顺序是不是出了问题。
有时候,删一条错的规则,比加十条新的还管用。