使用 haproxy 作为反向代理和 Internet 代理后面的应用程序
Posted
技术标签:
【中文标题】使用 haproxy 作为反向代理和 Internet 代理后面的应用程序【英文标题】:Use haproxy as a reverse proxy with an application behind Internet proxy 【发布时间】:2018-05-16 06:56:54 【问题描述】:我需要在一个公共的内部托管 URL 下集成多个本地和非现场 Web 应用程序。本地应用程序与 haproxy 位于同一数据中心,但场外应用程序只能通过 http 代理访问,因为运行 haproxy 的服务器无法直接访问 Internet。因此我必须使用 http Internet 代理,SOCKS 可能也是一个选项。
如何告诉 haproxy 只能通过代理访问后端? 我宁愿不使用额外的组件,如 socksify / proxifier / proxychains / tsocks / ...,因为这会带来额外的开销。
此图显示了设置中涉及的组件:
当我在一台机器上运行它时直接连接互联网我可以使用这个配置并且它工作得很好:
frontend main
bind *:8000
acl is_extweb1 path_beg -i /policies
acl is_extweb2 path_beg -i /produkte
use_backend externalweb1 if is_extweb1
use_backend externalweb2 if is_extweb2
backend externalweb1
server static www.google.com:80 check
backend externalweb2
server static www.gmx.net:80 check
(显然,这些不是我正在谈论的 URL,这只是一个示例)
Haproxy 能够检查外部应用程序并将流量路由到它们:
在我工作的公司的安全环境中,我必须使用代理,而 haproxy 无法连接到外部应用程序。 如何启用 haproxy 以使用 http 代理后面的那些外部 Web 应用程序服务器(无需身份验证),同时通过通用 http 页面/通过浏览器提供对它们的访问?
【问题讨论】:
【参考方案1】:如何使用委托 (http://delegate.org/documents/) 来解决这个问题,就像一个想法。
haproxy -> delegate -f -vv -P127.0.0.1:8081 PROXY=<your-proxy>
http://delegate9.org/delegate/Manual.shtml?PROXY
我知道它不是那么优雅,但它可以工作。
我已经用本地鱿鱼和这个 curl 调用测试了这个设置
echo 'GET http://www.php.net/' |curl -v telnet://127.0.0.1:8081
curl 调用模拟 haproxy tcp 调用。
【讨论】:
我认为这不是我所需要的。我需要做一个curl http(s)://myserver.local/foo
,这应该在内部调用一个静态站点,如http(s)://www.google.com
+ url 的非静态部分,在本例中为/foo
。简而言之:这应该反向代理到 http(s)://www.google.com/foo
并返回该代码,就好像它会由 myserver.local 本身提供一样。
这听起来与原帖不同。你知道想要的是一个主机头重写,如http-response replace-header Host www\.google\.com myserver\.local
Doc: cbonte.github.io/haproxy-dconv/1.8/…
我认为主要的一点是让 haproxy 使用代理,其余的也很重要,但稍后会出现
那么请尝试建议的解决方案,谢谢。【参考方案2】:
我很想让它工作,但我真的在 haproxy 文档中找不到任何东西,所以我搜索了一下,发现 nginx 可能会起作用,但它没有对我来说,经过更多的谷歌搜索后,我最终找到了适用于 apache 的配置。
这是重要的部分:
Listen 80
SSLProxyEngine on
ProxyPass /example/ https://www.example.com/
ProxyPassReverse /example/ https://www.example.com/
ProxyRemote https://www.example.com/ http://corporateproxy:port
ProxyPass /google/ https://www.google.com/
ProxyPassReverse /google/ https://www.google.com/
ProxyRemote https://www.google.com/ http://corporateproxy:port
我很确定应该有一种方法可以将此配置转换为 nginx 甚至转换为 haproxy...如果我设法找到时间,我会用我的发现更新答案。
为了让 apache 工作,你还应该启用一些模块,我提出了一个带有基本 docker 配置的 github repository,展示了随意查看完整的工作配置.
【讨论】:
以上是关于使用 haproxy 作为反向代理和 Internet 代理后面的应用程序的主要内容,如果未能解决你的问题,请参考以下文章
【nginx】如何解决使用nginx作为反向代理端口耗尽问题?