在防火墙级别阻止 HTTP/2

Posted

技术标签:

【中文标题】在防火墙级别阻止 HTTP/2【英文标题】:Block HTTP/2 at the firewall level 【发布时间】:2018-04-21 11:04:43 【问题描述】:

我在阻止使用 HTTP/2 以强制浏览器使用 HTTP/1 作为 https 中的协议时遇到了问题。 TLS MITM 是不可能的,最多可以考虑类似 NFQUEUE 的用户模式包过滤,具体取决于处理开销。

通过阅读 ALPN RFC,不清楚当我看到包含 ALPN:http/2 的 ClientHello 时提供警报响应或断开连接是否会使浏览器在没有 ALPN 的情况下重试。

如果我理解正确,修改 ClientHello 是不可能的,因为它会在服务器响应 ServerHello 时导致校验和错误,因为更改 ClientHello 会使该数据包的 MAC 无效。

是阻塞握手的行为 w.r.t. ALPN 与处理 TLS 版本回退相同,即 TLS_FALLBACK_SCSV ?

编辑:根据 openssl 的 t1_lib.c,如果服务器不知道 ALPN,它会忽略它。因此,如果服务器为包含 ALPN 的 ClientHello 返回 Alert,可能只是因为它不支持 TLS1.2,除了“alert”之外,无法向客户端发出“请在没有 ALPN 的情况下重试”的信号,这会导致客户端尝试 TLS1.1。

【问题讨论】:

是什么防火墙?如果这是一个简单的数据包过滤器,那么您将无法成功阻止 HTTP/2,但我认为阻止也没有用,因为您无论如何都不检查内容。如果这是一个可以检查 SSL 流量的防火墙,它将作为中间人工作,因此可能会自动剥离 ALPN 扩展,从而导致降级到 HTTP/1.x。除此之外,我认为这个问题在这里是题外话,在 security.stackexchange.com 或 serverfault.com 上有更多的话题。 为什么要这样做?因为可能有更好的选择。还有你说的是入站连接还是出站连接? 我编辑了问题以排除 TLS MITM,这是针对出站防火墙。 【参考方案1】:

基于 TLS 的 HTTP/2 是通过 ALPN 协商的。

浏览器会告诉服务器他们支持它。

如果您不想使用 HTTP/2,那么您只需修改服务器配置,使其不具有 h2 作为可以通过 ALPN 协商的协议之一。

ALPN 协商将回退到 HTTP/1.1,客户端将使用 HTTP/1.1。

【讨论】:

解决此问题的最简单方法是在服务器配置中,但我不控制网络服务器。我更新了问题以明确这一点。我不清楚的是 http2 或 ALPN 作为一个整体是否可以在(传出)防火墙处被拒绝,而不向客户端推送策略或执行 TLS MITM。

以上是关于在防火墙级别阻止 HTTP/2的主要内容,如果未能解决你的问题,请参考以下文章

怎样解除被防火墙阻止运行的程序

谷歌云防火墙是不是默认阻止子网间流量?

使用上下文菜单在 Windows 防火墙中阻止 .EXE

是啥导致 Windows 防火墙阻止应用程序?

即使在端口转发和禁用防火墙之后,端口 80 仍然被阻止

Windows 7防火墙阻止了远程桌面连接的解决方法