在包括代理身份验证的代理链中使用Apache作为转发代理



我正在构建一个代理链,以便通过额外的身份验证从外部访问内部代理:

Internet -> [Apache Forward Proxy] -> [Internal Squid Proxy] -> Internal Website

Apache Forward Proxy正在执行TLS,包括基于证书的身份验证(CBA),Squid Proxy需要使用用户名/密码的基本身份验证。身份验证对这两个组件都能正常工作。

现在的挑战是让Apache充当转发代理,并将Proxy Authorization标头从用户转发到内部代理。

以下是我使用的当前配置(启用了mod_proxy和mod_proxy_connect):

# Enable forward proxy
ProxyRequests On
# Pass all requests on to the squid proxy
ProxyRemote * http://proxy.internal:3128
# Only allow proxy connect to port 443
AllowCONNECT 443

通过这种设置,Apache不会将Proxy Authorization标头转发到内部代理。我能为这个主题找到的所有设置(代理链身份验证、ProxyAddHeaders、重写规则等)只能在使用ProxyPass的反向代理模式下工作。但是反向代理不适合这里,因为在这种模式下,Apache会修改标头,而TLS Web服务器的CONNECT将无法工作。

Apache不会从客户端转发任何头字段,最后从Apache到内部代理的请求看起来是这样的:

CONNECT someserver.de:443 HTTP/1.0rn
Proxy-agent: Apache/2.4.18 (Ubuntu)rn
rn

我知道"代理授权"字段是一个逐跳字段,通常不允许传递给下一个代理。

在充当转发代理时,是否仍然可以让Apache将代理授权标头转发到内部代理?

Apache错误跟踪器中的一个相关主题存在错误。但这一步是指定在apache配置中硬编码的用户名/密码,这不是我所需要的。我想单独转发客户端授权。https://bz.apache.org/bugzilla/show_bug.cgi?id=37355

我有一个类似的设置,env变量Proxy Chain Auth就是解决您问题的方法。您可以如下配置apache:

SetEnv Proxy-Chain-Auth On
# Setting the request header is not needed in your case
# but related to the bug report mentioned in the question
RequestHeader set Proxy-Authorization "Basic dXNlcjpwYXNz"
ProxyRemote * http://proxy.internal:3128

通过设置env变量Proxy Chain Auth,授权凭据将转发到下一个代理,也就是Proxy.internal:3128。此外,您可以使用squid代理所需的静态/硬编码的基本身份验证凭据自行设置代理授权标头(通常由客户端提供)。这是错误报告中问题的可能解决方案:https://bz.apache.org/bugzilla/show_bug.cgi?id=37355

这个解决方案适用于我的apache2.4.57

最新更新