通过 Cisco ASA 进行路由正在改变 TCP 序列/ACK 编号

通过 Cisco ASA 进行路由正在改变 TCP 序列/ACK 编号

我们的网络有一个专用的 VPN 设备,位于办公网络内。我们有一个 Cisco ASA,带有静态路由,可将 VPN 子网路由到 VPN 设备。因此,从客户端到远程站点 ( 192.168.161.28 -> 192.168.101.28) 的典型请求如下:

客户端 ASA 本地 VPN 远程 VPN 远程服务器
192.168.161.28 -> 192.168.161.17 -> 192.168.161.10 -> 192.168.101.1 -> 192.168.101.28

通过此路由,远程 VPN 端点 192.168.101.1 上的防火墙将拒绝三次 TCP 握手:

Status: A TCP packet was rejected because it has an invalid sequence number or an invalid acknowledgement number

但是,如果我绕过 ASA(直接在客户端计算机上使用静态路由):

客户端 本地 VPN 远程 VPN 远程 服务器
192.168.161.28 -> 192.168.161.10 -> 192.168.101.1 -> 192.168.101.28

TCP 流正确握手并且一切顺利。

这可能是什么原因?ASA 上是否有一些检查规则可能会破坏这一点?我怀疑这是因为流量的返回路由与发送路由不同(即数据包将直接从 VPN 端点发送到客户端,而不是通过 ASA 发送,因为它们位于同一个 LAN 上)。

答案1

在 ASA 上禁用 ACK 随机化解决了这个问题(此场景匹配示例 B - 多个 Internet 路径):

access-list tcp_bypass extended permit tcp 192.168.161.0 255.255.255.0 any
class-map tcp_bypass
match access-list tcp_bypass
policy-map tcp_bypass_policy
class tcp_bypass
set connection advanced-options tcp-state-bypass
set connection timeout idle 0:10:00
service-policy tcp_bypass_policy interface inside

这种解决方案有点糟糕——请确保在执行之前了解其含义。

答案2

最有可能的是,防火墙(192.168.101.1)错过了 SYN-ACK,因为它是通过不同的路由路由回来的,而且由于它是一个状态防火墙,所以它拒绝了它。

  1. A通过Z向B发送SYN,同时被C检查。
  2. B 直接向 A 发送 SYN-ACK (因为 B 位于同一子网,并且具有到 A 的默认路由)
  3. A 通过 Z 向 B 发送 ACK,同时被 C 检查并丢弃,因为它从未见过 SYN-ACK。

这通常被称为非对称路由。

相关内容