在 OPNsense 上运行的 HAProxy 的 TCP 模式有问题

在 OPNsense 上运行的 HAProxy 的 TCP 模式有问题

我正在尝试设置 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 博客文章

相关内容