【问题标题】:HTTP connect with Transparent proxy使用透明代理进行 HTTP 连接
【发布时间】:2015-03-16 10:02:24
【问题描述】:

我正在尝试编写(并理解)透明代理。

我的设置应该是这样的

客户端浏览器 ---> TProxy ----> 上游代理 ------> 云

当客户端浏览器发出 GET 请求时,TProxy 会连接到上游代理。上游代理需要摘要认证。所以,基本上流程看起来像

Client Browser ---> TProxy --------> Upstream Proxy ---------------> cloud 
GET BBC.co.uk
                    CONNECT 
                                       407 PROXY AUTH REQUIRED
                    CONNECT
               (with proxy-authorization)

                                       200 OK
                    GET BBC.co.uk

我很困惑 CONNECT 与授权成功后会发生什么。 我想现在修改原始 GET 请求以包含 Proxy-Authorization 标头?

或者原始 GET 请求是否会被隧道化到另一个 http 标头中,例如

HTTP Header
 Proxy Authorization
  HTTP Header (GET BBC.CO.UK)
  Data

或者我可以按原样传递原始 GET 请求?

我刚开始使用 http,希望能提供任何帮助。

谢谢

【问题讨论】:

    标签: http proxy connect digest-authentication


    【解决方案1】:

    当您从透明代理向上游进行身份验证时,Proxy-Authorization 标头仅适用于 CONNECT。 GET 请求发生在隧道内,因此上游显式代理不应该看到它们,并且肯定不希望它们上有任何代理身份验证标头。

    简而言之,你不需要担心GET,但不是因为上面给出的答案,而是因为透明代理和站点之间有一条隧道,而显式代理只看到并验证CONNECT。

    【讨论】:

    • 感谢您的意见。这在我看来是合乎逻辑的。但是,我看不到 RFC 中明确提到的这一点。你能指出我在规范中的参考吗
    • 我在 RFC 中也找不到它,但是,这就是客户端的行为方式。请注意,CONNECT 隧道中的 GET 请求被认为是未代理的(即因为它们是隧道的),因此根据定义,任何代理身份验证都不适用于它们。
    【解决方案2】:

    HTTP 中不存在嵌套标头之类的东西。

    代理 - 无论是否透明 - 总是会终止来自客户端的 HTTP 连接,并向服务器发起一个新连接。

    这意味着来自客户端的 HTTP GET 会发送到您的 TProxy。 TProxy 向上游代理创建一个新的 GET 请求。理想情况下,TProxy 将简单地传递所有标头。这将使它(几乎)无法检测到。

    响应头也是如此。

    实际上,代理服务器会并且在很多情况下必须操作某些标头。他们通常会添加自己的标头(例如,提醒通信伙伴注意代理的存在),并且他们还可以操纵现有的标头。

    所以,对您的问题的简短回答:无论您的 TProxy 收到什么标头字段,除非您完全理解其含义,否则将其原封不动地传递。

    【讨论】:

    • 谢谢凯文。我怀疑我是否将 Proxy-Authorization 标头添加到原始 GET 请求中,如果我不这样做,上游代理会拒绝 GET 请求。我在笔记本电脑上设置了启用摘要身份验证的 squid,发现身份验证完成后,浏览器会在每个进一步的 GET 请求中发送代理授权。
    • 我不确定我是否理解。您如何将标头添加到 original GET 请求中,该请求在您知道摘要时已经发送(并收到其回复)?在随后的 GET 请求中,浏览器会为您添加标头;你不需要做任何事情,只需传递它们。
    • 嗨凯文,对不起,也许我不清楚。当 GET 请求(bbc.co.uk)到达 TProxy 时,TProxy 会缓冲 GET 请求。 TProxy 然后向上游代理发送一个 CONNECT。上游代理响应需要身份验证。 TProxy 然后使用授权标头重新尝试,然后收到 200 OK 进行连接。一直以来,来自客户端浏览器的原始 GET 请求尚未发送。一旦 CONNECT 成功,TProxy 就会发送 GET 请求。我现在是否修改 GET 请求以包含授权标头?
    • 我明白了。我认为浏览器应该发送 CONNECT,而您的 TProxy 应该简单地通过它。否则,它是不透明的。也就是说,是的,在您的场景中,您会将标头添加到 GET,但您可能会遇到更多问题,因为即使在后续 GET 中,浏览器也不会添加标头(因为它从不知道 CONNECT)。您需要实现某种形式的会话跟踪来跟踪哪些 GET 获得或没有获得授权标头。
    • @KevinKeane - OP 正在将透明代理中的原始 SSL 握手转换为显式 CONNECT。没有从代理发送CONNECT,通过不是正确的解决方案。
    猜你喜欢
    • 2020-10-01
    • 1970-01-01
    • 2013-07-07
    • 2012-04-22
    • 1970-01-01
    • 2020-05-12
    • 2011-06-11
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多