Перенаправление прокси-сервера HAProxy на внешний HTTPS с перезаписью URL

#haproxy

#haproxy

Вопрос:

Я пытаюсь заставить HAProxy вести себя как HTTP-прокси, за исключением того, что переданные URL-адреса должны быть перенаправлены на внешнюю службу, которая предоставляет только прокси-API на основе HTTPS REST.

Итак, что-то вроде:

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

использовал бы мой сервер HAProxy, работающий на 127.0.0.1:8888 , для пересылки запроса на http://www.example.com сторонний HTTP REST на основе прокси-API, используя формат: https://url-privacy-service.com/api/v1/?apikey=YOUR_API_KEYamp;url=http://www.example.com

Целью этого было бы разрешить использовать REST based 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_KEYamp;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) для облегчения.

Ответ №1:

Я сомневаюсь, что это вообще может быть достигнуто. Если запрос https передается через порт 443, для этого требуется SSL. Если SSL запроса https доступен, мы можем просто добавить правило перенаправления в интерфейс ssl для хоста следующим образом:

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

Для перенаправления на https вам, вероятно, потребуется привязка к порту 443 с использованием соответствующего SSL-сертификата. Это основное ожидание браузера.

ПРИМЕЧАНИЕ: приведенное выше правило перенаправления является лишь иллюстрацией и может не работать без надлежащего SSL-сертификата.

Ответ №2:

Невозможно сделать то, что вы предлагаете, поскольку прокси-сервер forward не сможет просматривать полезную нагрузку, которую он просто передает через данные с информацией, предоставленной в CONNECT команде, полезная нагрузка будет зашифрована в случае HTTPS, поэтому такая информация, как путь и запрос, недоступна для HAProxy.установите соединение от имени клиента со сторонним приложением.