【Azure App Service】应用服务(Web App)里的 SNAT 端口 vs 出站连接数:到底是谁限制了谁?

📅 2026/7/6 5:02:07
【Azure App Service】应用服务(Web App)里的 SNAT 端口 vs 出站连接数:到底是谁限制了谁?
本文会先把 SNAT 端口的占用原理 讲清楚再解释它和出站连接 (Outbound Connections) 的区别。问题解答1. SNAT 端口到底是怎么被占用的App Service 的 worker 实例没有自己的公网 IP。当应用访问公网 endpoint例如 SQL、Storage、外部 API时流量会先到 stamp / scale unit 里的出站负载均衡器由它把私网源地址改写成公网源地址这个过程就是 Source Network Address TranslationSNAT。从应用视角看它只是connect到外部服务。但从负载均衡器视角看它必须为这条出站流维护一条映射记录字段示例值ProtocolTCPWorker 实例 IP:port10.0.5.60:51014负载均衡器公网 IP:port13.76.245.72:12481外部 endpoint IP:port52.189.232.180:1433这里的12481就是这条 connect 在公网侧使用的SNAT 端口。回包到达负载均衡器后负载均衡器再根据映射表把包转回10.0.5.60:51014。所以SNAT 端口不是应用代码直接打开的端口而是负载均衡器为了让回包找得到原始连接而分配的公网源端口。2. SNAT 端口为什么容易被同一个后端耗尽 (非常重要)理解 SNAT 占用要先理解 TCP 流的唯一标识五元组5-tuple。五元组字段含义示例Protocol协议TCPSource IP源地址SNAT 后 负载均衡器公网 IP13.76.2.72Source Port源端口也就是 SNAT 端口12481Destination IP目的地址外部 endpoint52.189.22.10Destination Port目的端口1433关键规则只要五元组整体不重复连接就是唯一的如果五元组完全相同负载均衡器就无法区分回包属于哪条流。因此SNAT 端口的占用规则可以这样理解多条连接访问同一个目的 IP 端口 协议目的字段相同只能靠不同的 Source Port 区分所以每条连接都要占一个新的 SNAT 端口。多条连接访问不同目的 IP 或不同目的端口目的字段已经不同五元组天然不冲突所以可以共享同一个 SNAT 端口。下面用同一个 SNAT 端口12481举例此图对应原文描述If your app creates connections to a mix of address and port combinations, you wont use up your SNAT ports. The SNAT ports are used up when you have repeated calls to the same address and port combination.这就是为什么官方文档会强调SNAT 端口限制主要影响反复连接同一个 address port combination 的场景。典型例子包括大量请求打到同一个 SQL Database大量请求打到同一个 Redis / Storage endpointFunction App 被队列瞬间触发所有实例或线程同时访问同一个外部 API。3. 为什么每实例通常按 128 个 SNAT 端口估算SNAT 端口来自负载均衡器公网 IP 的端口池而不是单个 App Service 实例私有的无限资源一个公网 IP 可用于 SNAT 的端口数量有限一个典型 stamp /Scale Unit 有多个出站公网 IP但要被 stamp/Scale Unit 内很多站点和实例共享App Service 每个实例通常会被预分配128 个 SNAT 端口作为安全估算值。Azure 负载均衡器历史上有不同分配算法, 详见SNAT with App Service -- SNAT with App Service | 4lowTheRabbit.github.io4. SNAT 端口和 TCP Connections 的区别 关键关键点回归到最初的困惑这两个数字到底是同一回事的两种说法还是两个独立的限制既然能开8064个连接为什么只有128个 SNAT 端口是不是哪里算错了真正限制我们应用代码能并发调用多少外部服务请求的到底是哪一个核心原因是TCP Connections和SNAT 端口描述的是同一条出站链路上的 不同动作、不同计数器、不同资源池。TCP ConnectionsApp Service 实例统计「当前有多少 TCP 连接」SNAT 端口只有连接需要访问外部公网 endpoint 时才会在出站负载均衡器上消耗的公网源端口连接发起 ---- 到TCP Connection 计数 ---- SNAT 端口消耗计数的流程图TCP Connections / connect 和 SNAT 端口的区别可以概括为对比项TCP Connections / connectSNAT 端口本质connect是建连动作TCP Connections 是连接计数负载均衡器公网侧的源端口资源发生位置Worker 实例沙箱Stamp 出站负载均衡器统计对象Worker 上的 TCP 连接数量公网侧源端口映射数量是否包含本地 loopback包含不包含是否只影响外部公网访问否所有 TCP 连接都会计入是主要用于外部网络流量计数方式每条 TCP 连接都算 1 条同目标通常 1 条连接占 1 个端口不同目标可能共享端口常见上限1920 / 3968 / 8064按规格每实例通常按 128 估算谁更常先触发连接泄漏极严重时高频访问同一外部后端时可以把两者关系理解成connect成功建立后worker 上会多一条 TCP Connection如果这条连接只是本地 loopback 或内部本地连接它只影响 TCP Connections不影响 SNAT如果这条连接要访问外部公网 endpoint它才会进入 SNAT 流程