我做了简单的 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
部分。