在 Azure 云上,我发现防火墙经常会断开 Web 服务器和数据库之间的连接。主要是当有一些不活动时,我认为大约 5 到 10 分钟。所以我做了一些研究,发现这似乎是一个常见问题。
该问题似乎基本上可以通过设置一些保持活动来解决。(1) (2) (3)
因此,它可以归结为防火墙处理 TCP 连接的方式:
当您位于 NAT 代理或防火墙后面时,无缘无故断开连接是一个非常常见的问题。此行为是由代理和防火墙中实现的连接跟踪程序引起的,这些程序会跟踪通过它们的所有连接。由于这些机器的物理限制,它们只能在内存中保留有限数量的连接。最常见和最合理的策略是保留最新的连接并首先丢弃旧的和非活动连接。
(从TCP 保活方法)
这是否意味着防火墙/NAT 可以随时断开 TCP 连接?比如 2 秒不活动后?或者有什么可以让我们不必担心没有连接可以安全地通过防火墙?
答案1
从理论上讲,是的,任何路由器或防火墙都可以决定断开您的连接。当然,这是显而易见的,因为您无法通过发送正确的 TCP 数据包让任何硬件完全按照您的意愿行事。这取决于路由器如何处理它。
实际上,这正是您所说的。为了防止这种情况,您必须确保线路上有活动。例如,当我有 SSH 会话时,我会在其中运行一个带有时钟的 tmux 会话,因此每分钟都会有一些活动。
此外,我倾向于使用 Linux PC 作为路由器和防火墙,因为它们往往有足够的内存,不会中断任何不活动的连接。这主要是消费级硬件问题。