Как удалить протокол Proxy с HAproxy?
Рассмотрим следующую ситуацию:
Internet
||
||
.------''------.
| HTTPS (:443) |
'------..------'
||
.-----------------------'|
| \/
| 3rd party HAproxy service
| ||
| ||
optional .-----------''-----------.
route | PROXY Protocol (:5443) |
| '-----------..-----------'
| || ________
___________|_______________________||________________________________| SERVER |____
| | \/ |
| | local HAproxy |
| | || |
| | || |
| | .------''------. |
| | | HTTPS (:443) | |
| | '------..------' |
| | || |
| | || |
| | \/ |
| '---------------> local webserver |
|___________________________________________________________________________________|
Внутренний сервер имеет HAproxy и Apache httpd, локально работающие на портах 5443 и 443 соответственно.
Мой локальный веб-сервер не поддерживает протокол PROXY. Поэтому я хочу, чтобы HAproxy перехватывал протокол PROXY от сторонней службы и передавал данные на локальный веб-сервер по протоколу HTTPS или просто по протоколу TCP.
В случае HTTPS я полагаю, что он должен манипулировать HTTP-пакетами, используя правильный SSL-сертификат, чтобы добавить исходный IP-адрес отправителя в X-Forwarded-For
Заголовки HTTP (которые должны быть предоставлены протоколом PROXY).
Однако документация HAproxy ужасна, если вы новичок в HAproxy, и я не смог найти примеров, объясняющих, как это сделать. Я знаю, что это должно быть возможно, поскольку HAproxy указан как "ПО, готовое к использованию протокола Proxy", но как?
1 ответ
Да, вам нужно использовать accept-proxy
ключевое слово после bind
в декларации внешнего интерфейса. Также будет полезно прочитать о send-proxy
Ключевое слово, которое используется в данной "сторонней службе HAproxy".
Протокол PROXY может быть возвращен в исходное состояние с помощью следующей конфигурации HAproxy:
frontend app-proxy
bind *:5443 accept-proxy
mode tcp
option tcplog
default_backend app-httpd
backend app-httpd
mode tcp
server app1 127.0.0.1:443 check
Это примет протокол PROXY на порту 5443, очистит его и отправит данные TCP на 443
,
Если вы хотите манипулировать HTTP-пакетами в TCP-данных, зашифрованных с помощью SSL, вам необходимо иметь доступ к правильным сертификатам SSL (к которым ваш веб-сервер уже должен иметь доступ). Это то, что вы, вероятно, захотите сделать.
frontend app-proxy
bind *:5443 accept-proxy ssl crt /path/to/certnkey-file.pem
mode http
option httplog
default_backend app-httpd
backend app-httpd
mode http
server app1 127.0.0.1:443 check ssl verify none
Преимущество последнего подхода заключается в том, что исходные данные клиента сохраняются при прохождении через прокси, чтобы вы знали, каков исходный IP вашего посетителя. Это как бы вся идея использования протокола PROXY в первую очередь! HAproxy автоматически обновит X-Forwarded-For
заголовок с правильным IP-адресом, который был передан по протоколу PROXY.