具有istio-ingressgateway作为SSL后端的Haproxy

时间:2019-03-16 13:43:54

标签: kubernetes haproxy istio envoyproxy

我最初使用tcp模式进行测试,并且可以正常工作。 haproxy tcp passthru配置如下:

frontend https_in
        bind *:443
        mode tcp
        option forwardfor
        option tcplog
        log global
        default_backend https_backend

backend https_backend
        mode tcp
        server s1 10.21.0.60:31390 check
        server s2 10.21.0.169:31390 check
        server s3 10.21.0.173:31390 check

http模式的配置应如何显示?我需要解密流量,注入一些标头(如forward-for)并再次加密,然后将其发送到ssl istio ingress-gateway后端。

我的配置尝试很多(但没有成功),这里是一个快照:

frontend https_in
    mode http
    bind *:443 ssl crt /etc/haproxy/prod.pem crt /etc/haproxy/dev.pem crt /etc/haproxy/stg.pem no-sslv3

    option http-server-close
    option forwardfor
    reqadd X-Forwarded-Proto:\ https
    reqadd X-Forwarded-Port:\ 443

    rspadd  Strict-Transport-Security:\ max-age=15768000

    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }
    acl acl_app1 req_ssl_sni -i mydomain.test
    use_backend https_backend if acl_app1

backend https_backend
    mode http
    server s1 10.21.0.60:31390 check ssl verify none

我在haproxy日志中看到

haproxy[12734]: Server https_backend/s1 is DOWN, reason: Layer6 invalid response, info: "SSL handshake failure (Connection reset by peer)", check duration: 1ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
haproxy[12734]: Server https_backend/s1 is DOWN, reason: Layer6 invalid response, info: "SSL handshake failure (Connection reset by peer)", check duration: 1ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
haproxy[12734]: backend https_backend has no server available!

如果我取消了支票,仍然尝试查询haproxy:

haproxy[13381]: https_in~ https_in/<NOSRV> -1/-1/-1/-1/0 503 213 - - SC-- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

我无法确定SNI设置是如何从haproxy传递到istio的。

在调试日志级别的envoyproxy和istio-ingressgateway的日志中,我也找不到任何有用的东西。

1 个答案:

答案 0 :(得分:1)

距离您发布此问题已有一段时间,但我遇到了同样的问题。因此,我能够使用openssl s_client命令来验证HAProxy错误。

openssl s_client -connect ip:port将返回write:errno=104,这意味着存在Connection reset by peer错误。

但是当我提供服务器名称时,我能够成功连接到后端openssl s_client -connect ip:port -servername server.name

在深入研究HAProxy的backend选项之后,我偶然发现了check-sni选项,其中提到:

此选项允许您指定进行健康检查时要使用的SNI 通过SSL。只能使用字符串进行设置。 ...

所以我使用此选项如下配置后端服务器

server lokomotive-contour ip:port ssl verify none check-sni server.name sni str(server.name) check

关键部分是check-sni选项,如前所述;这将在运行状况检查期间配置SNI。

但是我还发现sni str()选项对于使通过此后端的常规流量路由正常工作是必需的。

ps:确保您使用的是HAProxy 1.8或更高版本,因为check-sni仅从1.8 starting开始受支持

希望我的回答将来能为您提供帮助