如何使用 curl 检查基于 haproxy sni 的规则?

如何使用 curl 检查基于 haproxy sni 的规则?

我做了简单的 HaProxy 配置,以便根据 SNI 字段传递完整的流量。这是我的haproxy.cfg

defaults
    log global
    timeout client 50s
    timeout client-fin 50s
    timeout connect 5s
    timeout server 10s
    timeout tunnel 50s
frontend tcp-0_0_0_0-443
    bind *:443
    mode tcp

    acl sni_acl_example_com req.ssl_sni -m sub example.com
    use_backend example_com_be if sni_acl_example_com

backend example_com_be
    mode tcp
    server name1 93.184.216.34

我使用以下 Dockerfile 运行 HaProxy:

FROM haproxy:1.7.9-alpine
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
EXPOSE 443

以及以下命令:docker build -t my-haproxy . && docker run -p 443:443 --rm -d --name my-running-haproxy my-haproxy

现在我想检查所调用的规则是否sni_acl_example_com能按预期工作cURL

curl -k -X 'GET' -H 'Host: example.com' --resolve example.com:443:127.0.0.1 https://example.com

结果是:

curl:(35)LibreSSL SSL_connect:SSL_ERROR_SYSCALL 连接到 example.com:443

显然规则不起作用,并且没有合适的后端(这就是我收到 SSL_ERROR_SYSCALL 的原因)。如果我添加一些 default_backend,它将被用来执行我的请求。

为什么我的 cURL 请求无法打开http://example.com使用HaProxy?

我使用带有最新 OSX High Sierra 的 curl 7.54.0。

答案1

明白了。cURL 请求完全正确。

中缺少 2 条配置语句haproxy.cfg。为了使 sni-rules 正常工作,您还需要:

tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }

根据frontend部分。

相关内容