SNAT 与后端回程配置
本指南适用于请求已经到达虚拟服务,但后端响应无法正常返回,或需要让后端只看到指定源 IP 的场景。重点是明确后端看到哪个源地址,以及响应如何回到负载均衡。
第一步:确定是否需要源地址转换
| 业务要求 | 可选方式 | 必须核对的条件 |
|---|---|---|
| 后端使用负载均衡接口地址作为对端 | 源地址转换:接口 IP 地址 | 后端到该接口地址的回程可达 |
| 后端白名单要求固定源地址或指定地址范围 | 源地址转换:指定地址池 | SNAT 池与虚拟服务的对象范围一致,地址无冲突且回程可达 |
| 后端必须在网络连接上看到真实客户端 IP | 源地址转换:不转换 | 后端到客户端的响应路径必须按业务拓扑返回负载均衡 |
不要仅凭“旁路部署”就认定某一种方式必然正确。先确认去程、回程和地址归属,再决定是否转换源地址。HTTP 的 X-Forwarded-For 是应用层头部,不能代替网络层的回程路由。
第二步:让 SNAT 池与虚拟服务属于同一对象
进入【平台系统 → 基础设施 → 流量组管理 → SNAT 地址池】,点击“新增”。
| 虚拟服务对象 | SNAT 池应选择的对象 | 地址选择 |
|---|---|---|
| 转发引擎 A | 转发引擎 A | 该引擎的已有地址,或为其规划的自定义地址 |
| 流量组 G | 流量组 G | 该组的已有地址,或为该组规划的自定义地址 |
选择“流量组”并不意味着能用于所有流量组,具体组也要相同。
双机流量组示例
下面分别展示 SNAT 地址池页面和虚拟服务页面。两处都选择流量组 tg1,用来保证地址池与虚拟服务的归属一致。
1. 在 SNAT 地址池页面创建地址池
进入【平台系统 → 基础设施 → 流量组管理 → SNAT 地址池】,点击“新增”。对象类型选“流量组”,流量组选 tg1,再填写已规划、没有冲突、后端能返回的自定义地址。

这张图配置的是 SNAT 出口地址池,其中的 IP 用于负载均衡访问后端时的源地址。
2. 到虚拟服务页面核对同一流量组
切换到【负载流量管理 → 虚拟服务】,新增或编辑目标虚拟服务。对象类型同样选“流量组”,流量组选 tg1,监听地址选择该组的业务浮动 IP。

这张图配置的是 客户端访问的业务入口。它与上一张图属于两个不同页面,共同点是流量组都为 tg1,并不是将上一张图的 SNAT 地址填到这里。
两处选择同一流量组后,还需完成下文“第三步”:虚拟服务引用业务策略,业务策略再引用 SNAT 地址池。仅选择同一个流量组不会自动建立这条关联。
图中的地址来自操作示例,不能直接作为其他环境的地址规划。业务监听 VIP、SNAT 出口地址和管理入口各有用途,不要因为都属于同一设备就混用。
单引擎使用已有地址
对象类型选择“转发引擎”,选择对应引擎,再选择“已有地址池”和该引擎上的地址。

如果列表里没有期望地址,先检查它是否已配置在当前选中的对象上。不要通过选择另一台引擎的地址来绕过问题。
第三步:在业务策略中引用地址池
仅创建 SNAT 池不会改变已有业务。还需配置对应的 TCP、UDP 或 HTTP 策略:
- 在【负载流量管理 → 策略配置】中打开业务使用的四层或七层策略。
- “源地址转换”选择“指定地址池”。
- 在“SNAT 地址池”下拉框中选择第二步创建的池。
- 保存策略,并确认虚拟服务的默认分发规则或实际命中的分发规则引用了该策略。
- 保存相关配置,点击顶部“变更执行”,确认执行完成。

截图展示打开下拉框选择 SNAT 池的操作过程。若一个虚拟服务有多条分发规则,要逐条检查实际使用的策略;只修改默认规则的策略,不会自动改变其他规则。
第四步:从后端核对真实来源
从业务客户端请求虚拟服务,在后端连接记录、访问日志或抓包中检查网络对端地址,确认其属于所选 SNAT 池。检查的是连接源地址,不是客户端可自行携带的 HTTP 头部。
| 验证项 | 通过标准 |
|---|---|
| 业务响应 | 状态和内容符合预期,而不只是端口可连接 |
| 后端看到的源 IP | 属于预期地址池;选择“不转换”时符合保留客户端地址的目标 |
| 多地址池 | 建立多条独立连接检查来源,不以单个长连接要求覆盖所有地址 |
| 双机切换后 | 新连接仍能成功,后端来源仍属于该组允许的 SNAT 地址 |
多个地址不意味着每次请求都按固定次序轮流出现。连接复用也可能让连续多次请求沿用同一源地址。双机切换验证应记录新连接结果,不把新连接可用直接当成已有连接无中断的证明。
IPv4 / IPv6 后端桥接(NAT64 / NAT46)
HTTP 反向代理的监听地址和后端地址可以使用不同地址族。本节以单引擎 HTTP 业务为例,NAT64 / NAT46 指客户端连接与后端代理连接的地址族组合:
| 场景 | 客户端与监听地址 | 服务器池节点 | 后端连接使用的 SNAT 地址 |
|---|---|---|---|
| NAT64 | IPv6 | IPv4 | IPv4 |
| NAT46 | IPv4 | IPv6 | IPv6 |
- 准备客户端可达的业务监听地址,并确认转发引擎能通过后端地址族访问服务器池节点。
- 在服务器池中填写后端的原生 IPv4 或 IPv6 地址和实际 HTTP 端口。
- 按前文创建属于该转发引擎的 SNAT 池,地址族与后端一致。在七层 HTTP 策略中选择“指定地址池”,引用该池。
- 在虚拟服务中选择业务监听地址,默认分发规则选择“HTTP 代理”,关联服务器池和该 HTTP 策略;保存后执行变更。
- 从对应地址族的客户端请求监听地址,核对响应内容、后端收到的请求及连接源地址。若启用
X-Forwarded-For,还应单独核对其中的原始客户端地址。
自定义 IPv6 SNAT 地址必须有可用回程。后端若把该地址视为同链路邻居,却无法通过邻居发现找到它,应按实际拓扑配置经过转发引擎的回程路由。多地址池使用多条独立连接核对来源。
本节的配置范围是 HTTP 全代理业务。网络级报文翻译、自动 IPv6 前缀映射及其他协议应单独确认支持范围;该配置不会自动完成 DNS64 的 AAAA 地址合成。
常见问题排查
| 现象 | 优先检查 |
|---|---|
| 策略中找不到地址池或配置被拒绝 | 池与虚拟服务是否为同一引擎或同一流量组 |
| 后端看到的仍是接口 IP | 是否选择了“指定地址池”、业务是否命中另一条规则、是否执行变更 |
| 后端收到请求但客户端超时 | 后端到源地址的路由、ARP/邻居可达性、安全组或防火墙及地址归属 |
| 一台承载正常,切到另一台失败 | 两台引擎的业务网络和路由、VIP 与 SNAT 地址归属、配置发布状态 |
| HTTP 头部能看到客户端 IP,但连接源 IP 不同 | 这是应用头部与网络源地址的区别,分别按业务目标验证 |
