是否为 HTTP 响应等设置了 TCP ACK 位?

网络工程 防火墙 通讯协议
2021-07-31 10:36:42

我在这个页面读到,在 TCP ACK 位过滤中,只有设置了 ACK 位的数据包才被允许进入网络,以便防火墙知道这些数据包是由该网络中的用户请求的。

好的,所以我知道为 TCP 确认数据包设置了 ACK 位。但它还有什么用呢?如果本地 Intranet 上的用户正在请求网页怎么办?是否会为包含网络用户请求的网页的 HTTP 响应设置 ACK 位?他们必须这样做,否则数据包将被防火墙丢弃。

但是 HTTP 和 TCP 在完全不同的层上工作,因此 TCP 能够为 HTTP 设置 ACK 标志是没有意义的。我的意思是,它怎么知道数据包是 HTTP 响应?但这是我能想到的唯一方法,本地网络上的用户将能够使用网络外的 Web 服务,因为否则,防火墙将允许进入网络的唯一内容是 TCP 确认数据包,这些数据包基本上对最终用户。

有人可以帮助我理解这一点吗?我很困惑。

编辑:我认为我的困惑源于对 TCP 工作原理的误解。我认为为从一台主机发送到另一台主机的每条消息维护一个单独的 TCP 会话,即 HTTP 请求的一个 TCP 会话和 HTTP 响应的另一个 TCP 会话。如果是这种情况,则不会为 HTTP 响应数据包设置 ACK 标志,它们将被丢弃。事实上,如果是这种情况,基本上没有任何有用的应用层通信将被允许进入网络。多亏了这篇文章,我现在明白为整个会话维护一个连接,包括请求和响应。

2个回答

但问题是 ACK 标志仅在 TCP 确认数据包上设置,就最终用户而言,它不携带任何有用的信息,因此如果您只允许设置了该标志的数据包,您将丢弃所有有用的数据包。

虽然 ACK 数据包可能不包含任何有用的数据,但数据包本身非常有用。ACK 数据包告诉连接的另一端“我收到了你发送的数据,我已经准备好接受更多了。” 如果由于丢包、防火墙阻止或任何其他原因而未收到 ACK,则 ACK 的连接发送方将不断重新发送相同的 ACK,直到另一方发送更多数据。

现在让我们退后一步,讨论您提到的 Web 服务器场景。

三路握手完成后,客户端将发送一个页面请求。这将包含“有用的”数据,因为它告诉服务器客户端想要什么页面。然后服务器发送一个 ACK​​ 让客户端知道请求已经收到。然后服务器发回包含请求页面的数据包。然后客户端发送一个或多个 ACK​​ 以让服务器知道它已收到所有发送的数据。

请注意,以上所有内容都发生在单个 TCP 连接上。换句话说,双方可以通过一个连接发送和接收数据,他们不需要一个。

最后,仅供参考,出于安全目的基于 TCP 标志阻止流量几乎与阻止端口号一样弱。原因是恶意用户可以按照他们喜欢的任何方式制作数据包,因此发送所有设置了 ACK 位的数据包完全没有问题。如果您有兴趣阅读有关此内容的更多信息,请查看 Scapy。

您是对的:HTTP 和 TCP 位于不同的层。TCP 将允许建立连接。建立连接时,流是双向的。

无论如何,防火墙只能在 TCP 层工作,因此您可以完全忘记 HTTP。

假设您希望您的用户通过端口 80 连接到外部。您将让每个 IP 数据报、协议 TCP、dst 端口 80 连接到外部。这还不够,因为您必须添加规则才能让流量从 Internet 返回到您的网络。

我只会让所有东西都进来,但只允许 SYN(SYN/ACK 没问题)。这个文档建议只让 ACK 数据包返回,这对我来说似乎也很正确(但不完全:FIN 或 RESET 数据包可以由远程端首先发送,据我所知,没有 ACK)。

请记住,ACK 只是一个标志:真实数据位于 TCP 段中,因此您的应用程序数据将在其中(此处为 http)。

无状态过滤器仍然用于高流量、低预算的防火墙。