Skip to content

网络访问异常现象分析报告:防火墙状态检测机制

1. 现象描述

问题:关了代理不可以访问指定端口,但开了代理却可以访问了,明明这个端口我设置防火墙了,按理来说怎么都应该访问不了。

访问场景443 端口 (HTTPS)9981 端口 (自定义服务)备注
未开代理 (防火墙开启)通畅不通默认策略拦截了非标准端口
开启代理 (防火墙开启)通畅通畅流量通过代理服务器中转
临时关闭防火墙后访问通畅通畅建立初始连接
重新开启防火墙后通畅通畅异常点:原本不通的端口现在通了

2. 核心原因分析

该现象的核心原因在于现代防火墙的 状态检测 (Stateful Inspection) 机制,而非简单的包过滤。

状态表 (State Table) 的作用

防火墙在处理数据包时,并不只是机械地检查端口号,它会维护一张状态表

  1. 首包检测: 当你关闭防火墙并访问 9981 端口时,客户端与服务器完成了 TCP 三次握手。此时,系统内核记录下了一个状态为 ESTABLISHED(已建立)的连接。
  2. 动态放行: 当你重新开启防火墙时,防火墙的默认规则通常是:“拦截所有入站的新连接 (NEW),但允许所有已建立的连接 (ESTABLISHED) 或相关连接 (RELATED) 的数据包通过。”
  3. 信任存量连接: 因为你的 9981 端口连接在防火墙开启前已经“挂号”成功,防火墙认为这是一个合法的、已认证的存量流量,所以不再根据端口过滤规则去拦截它。

为什么代理能通?

当你开启代理时,你的本地机器实际上是在访问代理服务器的端口(通常是加密流量),而代理服务器再去访问目标服务器的 9981 端口。

  • 对于目标服务器来说,它看到的是代理服务器的 IP 在访问它。
  • 如果代理服务器与目标服务器之间的防火墙没有限制,或者同样存在上述的“先握手”逻辑,连接自然是通畅的。

3. 结论与验证

猜想是正确的。这种现象证明了:

  • 防火墙策略通常只针对“新发起的连接 (SYN包)”有效。
  • 一旦连接建立,只要 TCP 长连接不中断(或没有达到超时阈值),后续的数据包可以避开针对端口的拦截规则。

注意: 如果你此时手动断开该连接(例如重启服务或手动 kill 掉该 TCP 会话),再次尝试访问,防火墙就会重新执行拦截策略,9981 端口将再次无法访问。