Как заставить HAProxy маршрутизировать TCP на основе SNI (используя openssl s_client для тестирования)?

Я хочу использовать HAProxy для завершения зашифрованных TLS-соединений TCP и для передачи незашифрованного TCP-трафика различным серверным модулям на основе указания имени сервера, используемого для инициирования TLS-соединения.

У меня работают 3 службы внутренний сервер, каждый на своем порту (5001, 5002, 5003). HAProxy привязывается к порту 5000. Я хотел бы направить соединения к первым двум службам по имени или к третьему, если совпадения нет. Я инициирую подключение к HAProxy, используя openssl s_client . Однако в журналах я вижу, что соединения всегда маршрутизируются только на сервер по умолчанию, т.е. SNI, похоже, игнорируется.

DNS:

A record     demo.sni.example.com     1.2.3.4
CNAME        1.sni.example.com        pointing to demo.sni.example.com   
CNAME        2.sni.example.com        pointing to demo.sni.example.com   

т.е. Я бы хотел, чтобы выполнялась следующая маршрутизация:

SNI = 1.sni.example.com:5000 -> 1.2.3.4:5001
SNI = 2.sni.example.com:5000 -> 1.2.3.4:5002
anything else on port 5000 -> 1.2.3.4:5003

haproxy.cfg:

global
  log stdout  format raw  local0 info

defaults
  timeout client 30s
  timeout server 30s
  timeout connect 5s
  option tcplog

frontend tcp-proxy
  bind :5000 ssl crt combined-cert-key.pem
  mode tcp
  log global
  tcp-request inspect-delay 5s
  tcp-request content accept if { req_ssl_hello_type 1 }

  use_backend bk_sni_1 if { req.ssl_sni -i 1.sni.example.com }
  use_backend bk_sni_2 if { req.ssl_sni -i 2.sni.example.com }
  default_backend bk_default

backend bk_sni_1
  mode tcp
  log global
  balance roundrobin
  server server1 1.2.3.4:5001 check

backend bk_sni_2
  mode tcp
  log global
  balance roundrobin
  server server1 1.2.3.4:5002 check

backend bk_default
  mode tcp
  log global
  balance roundrobin
  server server1 1.2.3.4:5003 check

комбинированный-cert-key.pem - файл самоподписанного сертификата плюс ключ, где CN - это IP-адрес сервера ( 1.2.3.4 ) и есть SAN для всех значений DNS и IP.

Подключения, инициированные с использованием openssl s_client :

Я пробовал подключиться через DNS (записи A и CNAME , а также IP):

echo test | openssl s_client -connect demo.sni.example.com:5000 -servername 1.sni.example.com
echo test | openssl s_client -connect 1.sni.example.com:5000 -servername 1.sni.example.com
echo test | openssl s_client -connect 1.2.3.4:5000 -servername 1.sni.example.com

Однако все соединения маршрутизируются на серверную часть по умолчанию bk_default .

Что заставляет HAProxy не распознавать имя сервера SNI? (Я использую последний образ докера HAProxy: https://hub.docker.com/_/haproxy )

1
задан 13 December 2019 в 16:51
1 ответ

Ответ должен использовать ssl_fc-sni, вместо req.ssl_sni. Первый для завершенных SSL сессий, тогда как последний для сессий, куда TCP передается прямо через.

1
ответ дан 29 December 2019 в 22:46

Теги

Похожие вопросы