透明代理 DNAT:为何回程路由至关重要
理解 DNAT 能把请求送到另一台代理,而响应却绕过网关、导致连接中断的原因。
被重定向的 SYN 可能已经到达 Squid,客户端却仍在超时。在 DNAT 方案中,回程数据包也必须到达持有地址转换状态的网关。
设想这样一个局域网:
client 192.168.40.25 → gateway 192.168.40.1
DNAT → proxy 192.168.40.10
proxy 192.168.40.10 → client 192.168.40.25 directly客户端最初连接的是某个网站地址。经过 DNAT 后,代理看到客户端的源地址,可能按本地子网路由直接回复。这个回复绕过了网关的反向转换,于是客户端收到的来源是代理地址,而不是它期望的网站地址。网关无法修复从未收到的数据包。
| 方案 | 后果 |
|---|---|
| 让代理的回复经过执行转换的网关 | 进入代理的连接可以保留客户端的源地址 |
| 同时应用合适的源地址转换 | 代理以对端身份回复网关,但此时看到的是转换后的源地址,而不是原始客户端 |
不要为了日志更好看就移除 SNAT,除非你先验证回程路由。广泛启用 SNAT 还会改变源 ACL 与归因;把这当作设计的一部分接受下来。
可信的 HTTP 跳转可以把客户端元数据放进转发头,但 NAT 不会创建这个头,也不会把它变成 TCP 对端身份。在通往 Squid 的连接上保留源地址,并不等于在 Squid 另行发起网站连接时也保留它。
最后,拦截设计仍然必须提供 Squid 所需的目标信息。对称回程路由解决的是这一超时机制,而不是整个透明代理配置。