HAProxy代理转发到外部HTTPS,并重写URL



我试图让HAProxy表现得像一个HTTP代理,除了传入的url应该转发到只提供基于HTTPS REST的代理API的外部服务。

比如:

# HAProxy running on 127.0.0.1:8888
curl -x http://127.0.0.1:8888 http://www.example.com

将使用运行在127.0.0.1:8888上的HAProxy服务器将对http://www.example.com的请求转发给第三方基于HTTP REST的代理API,格式为:https://url-privacy-service.com/api/v1/?apikey=YOUR_API_KEY&url=http://www.example.com

这样做的目的是允许基于REST的https://url-privacy-service.com被用作各种设备上的标准HTTP代理,在HAProxy的帮助下。

以下是我到目前为止在我的HAProxy配置中拼凑的内容:

frontend urlprivacy
bind 127.0.0.1:8888
use_backend urlprivacy-backend
backend urlprivacy-backend
acl https ssl_fc
http-request set-uri https://url-privacy-service.com/api/v1/?api_key=YOUR_API_KEY&url=https://%[req.hdr(Host)]%[path]?%[query]
http-request set-method GET
server url-privacy-service.com:443 check-ssl ssl verify none

为什么我尝试通过curl -x http://127.0.0.1:8888 http://www.example.com发出请求,我遇到了错误响应:

<html><body><h1>503 Service Unavailable</h1>
No server is available to handle this request.
</body></html>

我能够成功地调用url-privacy-service.com的REST API,因此我知道它们的服务正在按预期工作。因此,我知道HAProxy配置显然是错误的,我只是不确定该怎么做才能使它正确。如果需要,我可以运行其他http代理(例如tinyproxy)来帮助实现。

这是可能的,您只需要配置您的服务器使用SSL并更新一些配置。以下是修改

  1. 监听443和引用SSL pem文件(你应该能够监听不同的端口,但我还没有测试过,你也可以重定向http到https,见这里)
  2. 在后端http-request中使用set-path和set-header,在服务器端使用sni
frontend urlprivacy
bind 127.0.0.1:443 ssl crt <path/to/your/cert.pem>
use_backend urlprivacy-backend
backend urlprivacy-backend
http-request set-path /api/v1/?api_key=YOUR_API_KEY&url=https://%[req.hdr(Host)]%[path]?%[query]
http-request set-header Host url-privacy-service.com
http-request set-method GET 
server url-privacy-service.com:443 sni str(url-privacy-service.com) check-ssl ssl verify none

前面的代码中断是因为当您使用HTTP调用时,您正在将未加密的有效负载传递给服务器。通过这些更改,您可以为HTTPS服务器url-privacy-service.com

创建正确的调用

我怀疑这是否能实现。如果通过端口443发送https请求,则需要SSL。如果https请求的SSL可用,我们可以在主机的SSL前端添加一个重定向规则,如下所示:

redirect scheme http if { hdr(Host) -i https://url-privacy-service.com } { ssl_fc }

要重定向到https,可能需要使用适当的ssl证书绑定到端口443。这是浏览器的基本期望。

注意:上面的重定向规则只是一个示例,如果没有适当的SSL证书,可能无法工作。

这是不可能的,因为转发代理将无法查看有效负载,它只是通过CONNECT命令中提供的信息管道传输数据,有效负载将在HTTPS情况下加密,因此路径和查询等信息不可用于HAProxy代表客户端连接到第三方应用程序。

最新更新