Повторное шифрование HAproxy ssl и изменение заголовка http
Я хочу использовать Haproxy 1.6.5 в качестве балансировщика нагрузки Https до моих серверов https, но я столкнулся с проблемой недопонимания.
Мне нужно такое поведение: haproxy доступен как https://example.com/ но за ним есть несколько серверов https с самозаверяющими сертификатами, которые я не могу переключить на http.
Поэтому я настроил свой интерфейс tcp для этого как
frontend tcp_in
mode tcp
option tcplog
bind *:443 ssl crt /etc/ssl/certs/server.bundle.pem
maxconn 50000
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
acl example_acl req.ssl_sni -i example.com
use_backend special_example if example_acl
После этого я хочу отправить свой трафик на один из бэкэндов, но суть в том, что я хочу запросить что-то вроде https:\eimA.customer.local из backend1 и https:\eimB.customer.local из backend2. Я предполагаю, что я нужно переписать заголовок хоста в запросе. (Вероятно, он не будет работать в режиме TCP. Так как я могу изменить конфигурацию, чтобы сделать это?)
Мой бэкэнд-конфиг:
backend special_eims
mode tcp
option tcplog
balance roundrobin
stick-table type binary len 32 size 30k expire 30m
acl clienthello req_ssl_hello_type 1
acl serverhello rep_ssl_hello_type 2
tcp-request inspect-delay 5s
tcp-request content accept if clienthello
tcp-response content accept if serverhello
server eim1 eimA.customer.local:443 check
server eim2 eimA.customer.local:443 check
stick on payload_lv(43,1) if clienthello
stick store-response payload_lv(43,1) if serverhello
В результате из моего конфига я получаю ошибку соединения ssl в браузере и
curl -v https://example.com/default -k
* About to connect() to example.com port 443 (#0)
* Trying 127.0.0.1... connected
* Connected to example.com (127.0.0.1) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* warning: ignoring value of ssl.verifyhost
* NSS error -12263
* Closing connection #0
* SSL connect error
curl: (35) SSL connect error
Прямое подключение к внутреннему серверу с помощью https: // ip-address/default возвращает ошибку 404, поэтому разрешен только формат https: //eimA.customer.local/default.
Пожалуйста, помогите, извините, если вопрос тупой.
1 ответ
Я решил это через некоторое время.
1. Я переключился из режима tcp в режим http, потому что в режиме tcp вы не можете получить информацию заголовка http.
2. Использовал реальные доменные имена в серверных операторах и использовал http-send-name-header Host
который в основном устанавливает заголовок хоста к имени после server
Директива 3. Для режима повторного шифрования интерфейсный сертификат обязателен.
frontend CUIC_frontend
mode http
bind *:443 ssl crt /etc/ssl/certs/ssl-cert.pem
option forwardfor
option http-server-close
reqadd X-Forwarded-Proto:\ https
default_backend App_Backend
....
backend App_Backend
mode http
balance roundrobin
http-send-name-header Host
server full-application1-domain-name 10.10.10.1:443 cookie app1 check ssl verify none
server full-application2-domain-name 10.10.10.2:443 cookie app2 check ssl verify none