TLS 检查器监听器过滤器

此示例演示了如何使用 TLS 检查器来选择 FilterChains,根据匹配的 transport_protocol 和/或 application_protocols 在上游集群之间分配流量。

它还演示了 TLS 检查器监听器过滤器生成的管理统计信息。

步骤 1:构建沙箱

更改 Envoy 存储库中的 examples/tls-inspector 目录,并启动服务。

这将启动一个在 localhost:10000 上监听的代理,并且有一个在端口 12345 上监听的管理界面。

它还启动了三个上游 HTTP 服务,这些服务以 json 格式回显接收到的标头。

前两个服务是 HTTPS 服务,在端口 443 上监听,另一个没有 TLS,在端口 80 上监听。

$ pwd
envoy/examples/tls-inspector
$ docker compose pull
$ docker compose up --build -d
$ docker compose ps

              Name                               Command               State                         Ports
---------------------------------------------------------------------------------------------------------------------------------
tls-inspector_service-http_1            docker-entrypoint.sh node  ... Up
tls-inspector_service-https-http1.1_1   docker-entrypoint.sh node  ... Up
tls-inspector_service-https-http2_1     docker-entrypoint.sh node  ... Up
tls-inspector_tls-inspector_1           /docker-entrypoint.sh /usr ... Up      0.0.0.0:10000->10000/tcp, 0.0.0.0:12345->12345/tcp

步骤 2:访问服务

使用在 TLS 上指定的不同 HTTP 版本或不使用 TLS 使用 HTTP 协议查询端口 10000 上的服务,将由不同的上游服务处理请求。

使用 HTTP1.1TLS 查询代理

$ curl -sk --http1.1 https://127.0.0.1:10000  | jq  '.os.hostname'
"service-https-http1.1"

上游 service-https-http1.1 处理请求。

使用 HTTP2TLS 查询代理

$ curl -sk --http2  https://127.0.0.1:10000  | jq  '.os.hostname'
"service-https-http2"

上游 service-https-http2 处理请求。

使用不带 TLS 的方式查询代理

$ curl -sk https://127.0.0.1:10000  | jq  '.os.hostname'
"service-http"

上游 service-http 处理请求。由于 TLS 检查器监听器过滤器检测到传输是纯文本,因此它不会将 transport_protocol 设置为 TLS

步骤 3:查看管理统计信息

TLS 检查器有一个以 tls_inspector 为根的统计信息树,可以使用配置的管理访问入口点提取该树。

$ curl -sk https://127.0.0.1:12345/stats |grep tls_inspector
tls_inspector.alpn_found: 2
tls_inspector.alpn_not_found: 0
tls_inspector.client_hello_too_large: 0
tls_inspector.connection_closed: 0
tls_inspector.read_error: 0
tls_inspector.sni_found: 2
tls_inspector.sni_not_found: 0
tls_inspector.tls_found: 2
tls_inspector.tls_not_found: 1

查看管理统计信息,我们可以看到 TLSSNIALPN 都已检测到,因为我们通过 HTTPTLS 上访问了服务两次。它还显示了一个来自纯文本查询的 tls_not_found