概述
我目前正在部署一对 HA 防火墙设备,它们将充当出站流量的透明正向代理(流量将通过路由定向到代理,而不是在客户端计算机上配置代理 URL)。我已经设置了高可用性配置并正常运行,我可以看到会话状态正在两个设备之间共享。触发故障转移时,被动设备将采用先前主动实例的 IP 地址(实际上整个网络适配器都会移动,因为这是在 AWS 上)。
连接流程
客户端——>防火墙/代理——>Web服务器
问题
作为测试,我设置了一个 Web 服务器并创建了一个大型 html 文件。然后,我使用客户端计算机通过 wget 和 curl(通过我的代理)检索此文件,并在文件下载期间执行了手动故障转移。当我执行故障转移时,wget(curl 也发生过同样的情况)下载卡住了。然后,我添加了连接超时,wget 命令超时,然后重新启动下载,虽然我可以看到创建了一个新的会话,但运行正常。需要注意的一点是,这是一个云设置,其故障转移时间比本地高规格设备慢很多,因此故障转移可能需要 15 到 60 秒才能完成。我试图确保我的部署不会对主要发送 HTTP 流量的应用程序产生很大影响。
问题
如果会话状态在 HA 设备之间同步,那么期望 HTTP 下载在故障转移后继续是否合理,或者客户端是否应该使用超时和重试来重新启动下载?
我是否可能需要应用程序团队更改其超时和重试设置?对于定期发送 API 请求的应用程序,超时和重试设置如何被视为正常?我希望在部署此功能后避免应用程序团队在其端进行任何更改。
有没有办法防止 wget 或 curl 在下载过程中在连接暂时中断一分钟时挂起,并在承担活动角色的设备上恢复连接后自动继续?我知道您可以终止请求并让它从中断的地方继续下载,但这不是应用程序团队会做的事情。
我基本上是用具有会话同步和检查功能的 Nextgen 防火墙的 HA 对替换 AWS 上的 NAT 网关,我不希望这导致任何操作问题。
答案1
根据您的描述,“透明代理”是真正的代理,它会终止 TCP 连接,甚至在您的情况下还会终止 SSL。这意味着客户端和代理之间以及代理和服务器之间将存在 TCP 连接 - 无论客户端使用的实际目标地址是什么(透明代理)。
因此,对于每个客户端发起的 TCP 连接,都会有两个 TCP 连接(客户端到代理和代理到服务器),它们有自己的状态 - 保存在防火墙的 OS 内核中。此外,HTTP 和 TLS 部分还有一些应用程序级状态 - 两者都保存在代理应用程序中,即用户空间中。
期望 HTTP 下载在故障转移后继续是否合理,或者客户端是否应该使用超时和重试来重新启动下载?
即使您设法同步防火墙之间的 TCP 连接状态(我怀疑这是不可能的,因为它们终止于防火墙),您也无法同步应用程序状态(即 HTTP 和 TLS)。这意味着现有连接无法在另一个防火墙上继续。因此,客户端需要重试请求。
我可能需要应用程序团队更改其超时和重试设置吗?对于定期发送 API 请求的应用程序,超时和重试设置如何被视为正常?
取决于使用情况、应用程序以及问题在实践中发生的频率(即防火墙失效的频率)。请注意,不可能重试所有请求,即只应重试幂等请求(不会改变服务器的状态)。这通常意味着 GET 而不是 POST,尽管并非所有 Web 应用程序都如此。
跨代理设备的 TCP 会话共享是否只适合纯 TCP 连接(数据库连接等)并且 HTTP 连接的会话共享是否有实际用途?
就像我说的,TCP 连接共享对于 HTTP 来说是不够的,对于 TLS 来说就更不够了。如果涉及 HTTPS,HTTP 状态共享也是不够的。我只知道如何在 HA 集群中跨防火墙系统共享 HTTP 和 TLS 状态的理论工作,而没有实际的实现——这会非常复杂,即使没有发生故障转移也会有很多开销,可能不值得。