我正在尝试设置 HAProxy 以根据 SNI 对不同的后端执行简单的 TCP 直通。但是,如果我这样做,我的客户端会出现严重问题:
- Firefox:PR_END_OF_FILE_ERROR
- Brave/Chrome/Safari:ERR_CONNECTION_CLOSED(多次重新加载后可以正常工作,但错误会间歇性地再次显示)
如果我绕过 HAProxy 直接联系后端,就不会出现这样的问题。所以 HAProxy 中的某些配置不正确,但我看不出是什么问题。
技术细节:
- HA-Proxy 版本 2.0.14
- 在 OPNsense 20.1.x、20.7.x(FreeBSD 11.2、12.1)上运行
- 在 ESXi 6.7U3 上的虚拟机中
我的配置如下:
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
在日志中。但正如我所说,后端服务器全天候运行,并且从内部 LAN(这里也涉及路由/防火墙/VLAN)全天工作正常,所以我怀疑这不是防火墙问题。
任何帮助均感激不尽。
答案1
看起来在前端配置中添加这两行可以解决这个问题:
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
源自HAProxy 博客文章。