Я пытаюсь настроить HAProxy для простой передачи tcp на разные серверы на основе SNI. Однако у меня возникнут серьезные проблемы с клиентами, если я сделаю это:
Если я обращаюсь к бэкэндам напрямую, минуя HAProxy, у меня таких проблем не возникает. Итак, что-то в HAProxy настроено неправильно, но я не вижу, что это такое.
Технические подробности:
Моя конфигурация выглядит так:
global
# NOTE: Could be a security issue, but required for some feature.
uid 80
gid 80
chroot /var/haproxy
daemon
stats socket /var/run/haproxy.socket group proxy mode 775 level admin
nbproc 1
nbthread 1
tune.ssl.default-dh-param 1024
spread-checks 0
tune.chksize 16384
tune.bufsize 16384
tune.lua.maxmem 0
log /var/run/log local0 info
defaults
log global
option redispatch -1
timeout client 30s
timeout connect 30s
timeout server 30s
retries 3
# Frontend: https_passthrough (https tcp mode main ip)
frontend https_passthrough
bind x.x.x.x:443 name x.x.x.x:443
mode tcp
# tuning options
timeout client 30s
# logging options
# ACL: service_sni
acl acl_5f34555b7fae76.76760871 req.ssl_sni -i service.example.com
# ACTION: service_https_passthrough
use_backend service_https_passthrough if acl_5f34555b7fae76.76760871
# WARNING: pass through options below this line
tcp-request inspect-delay 10s
# Backend: service_https_passthrough ()
backend service_https_passthrough
# health checking is DISABLED
mode tcp
balance source
# stickiness
stick-table type ip size 50k expire 30m
stick on src
# tuning options
timeout connect 30s
timeout server 30s
server service_https_passthrough 10.0.1.105:443
Если соединение не удается, я нахожу такие записи, как
https_passthrough https_passthrough/<NOSRV> -1/-1/0 0 SC 1/1/0/0/0 0/0
в журналах. Но, как я уже сказал, внутренние серверы работают круглосуточно и без выходных, и весь день работают нормально из внутренней локальной сети (здесь также задействованы маршрутизация / брандмауэр / VLAN), поэтому я сомневаюсь, что это проблема брандмауэра.
Любая помощь приветствуется.
Похоже, добавление этих двух строк в конфигурацию внешнего интерфейса устранило проблему для меня:
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
Получено из Сообщение в блоге HAProxy.