WebSockets

此示例介绍了 Envoy 可以配置为代理 WebSockets 的一些方法。

它演示了使用和不使用 TLS 终止 WebSocket 连接,并提供了一些代理到加密和非加密上游套接字的基本示例。

警告

为了简单起见,这里提供的示例不验证任何客户端证书,也不验证任何提供的证书。

使用 TLS 时,强烈建议你在可能的情况下 验证 所有证书。

你应该也在控制连接两端或相关协议可用时 验证客户端

步骤 1:为 wss 创建证书文件

更改目录到 Envoy 仓库中的 examples/websocket

$ pwd
envoy/examples/websocket
$ mkdir -p certs
$ openssl req -batch -new -x509 -nodes -keyout certs/key.pem -out certs/cert.pem
Generating a RSA private key
..................................................................................................................+++++
......+++++
writing new private key to 'certs/key.pem'
-----
$ openssl pkcs12 -export -passout pass: -out certs/output.pkcs12 -inkey certs/key.pem -in certs/cert.pem

步骤 2:构建并启动沙箱

这将启动四个代理,监听 localhost 上的端口 10000150002000030000

它还启动了两个上游服务,一个 ws 和一个 wss

上游服务分别监听内部 Docker 网络上的端口 80443

套接字服务器是非常简单的实现,它们只是响应任何输入输出 [ws] HELO[wss] HELO

$ docker compose pull
$ docker compose up --build -d
$ docker compose ps

            Name                             Command               State            Ports
---------------------------------------------------------------------------------------------------
websocket_proxy-ws_1                /docker-entrypoint.sh /usr ... Up      0.0.0.0:10000->10000/tcp
websocket_proxy-ws-route_1          /docker-entrypoint.sh /usr ... Up      0.0.0.0:15000->10000/tcp
websocket_proxy-wss_1               /docker-entrypoint.sh /usr ... Up      0.0.0.0:20000->10000/tcp
websocket_proxy-wss-passthrough_1   /docker-entrypoint.sh /usr ... Up      0.0.0.0:30000->10000/tcp
websocket_service-ws_1              websocat -E ws-listen:0.0. ... Up
websocket_service-wss_1             websocat wss-listen:0.0.0. ... Up

步骤 3:测试代理 ws -> ws

监听端口 10000 的代理将在没有 TLS 的情况下终止 WebSocket 连接,然后代理到上游套接字,同样也没有 TLS

为了使 Envoy 终止 WebSocket 连接,upgrade_configs 必须在 HttpConnectionManager 中设置,如提供的 ws -> ws 配置 所示。

 1static_resources:
 2  listeners:
 3  - address:
 4      socket_address:
 5        address: 0.0.0.0
 6        port_value: 10000
 7    filter_chains:
 8    - filters:
 9      - name: envoy.filters.network.http_connection_manager
10        typed_config:
11          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
12          stat_prefix: ingress_ws_to_ws
13          upgrade_configs:
14          - upgrade_type: websocket
15          route_config:
16            name: local_route
17            virtual_hosts:
18            - name: app
19              domains:
20              - "*"
21              routes:
22              - match:
23                  prefix: "/"
24                route:
25                  cluster: service_ws
26          http_filters:
27          - name: envoy.filters.http.router
28            typed_config:
29              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

你可以按照以下步骤启动与套接字的交互式会话。

$ docker run -ti --network=host solsson/websocat ws://127.0.0.1:10000
HELO
[ws] HELO
GOODBYE
[ws] HELO

键入 Ctrl-c 以退出套接字会话。

步骤 4:测试代理 ws -> ws 在特定路由上

监听端口 15000 的代理将在特定路由 /ws 上终止没有 TLS 的 WebSocket 连接,然后代理到上游套接字,同样也没有 TLS

为了使 Envoy 终止 WebSocket 连接,upgrade_configs 必须在 RouteAction 中设置,如提供的 ws -> ws 配置 所示。

1              routes:
2              - match:
3                  prefix: "/ws"
4                route:
5                  cluster: service_ws
6                  upgrade_configs:
7                  - upgrade_type: websocket

你可以按照以下步骤启动与套接字的交互式会话。

$ docker run -ti --network=host solsson/websocat ws://127.0.0.1:15000/ws
HELO
[ws] HELO
GOODBYE
[ws] HELO

$ curl https://127.0.0.1:15000
NotWebSocket

$ curl https://127.0.0.1:15000/ws
Only WebSocket connections are welcome here

键入 Ctrl-c 以退出套接字会话。

步骤 5:测试代理 wss -> wss

监听端口 20000 的代理将在使用 TLS 的情况下终止 WebSocket 连接,然后代理到上游 TLS WebSocket。

除了 upgrade_configs 必须在 HttpConnectionManager 中设置之外,wss -> wss 配置 还将 TLS 传输套接字 添加到 监听器集群

你可以按照以下步骤启动与套接字的交互式会话。

$ docker run -ti --network=host solsson/websocat --insecure wss://127.0.0.1:20000
HELO
[wss] HELO
GOODBYE
[wss] HELO

键入 Ctrl-c 以退出套接字会话。

步骤 6:测试代理 wss 直通

监听端口 30000 的代理将所有 TCP 流量直通到上游 TLS WebSocket。

wss 直通配置 不需要任何 TLSHTTP 设置,而是使用简单的 tcp_proxy

你可以按照以下步骤启动与套接字的交互式会话。

$ docker run -ti --network=host solsson/websocat --insecure wss://127.0.0.1:30000
HELO
[wss] HELO
GOODBYE
[wss] HELO

键入 Ctrl-c 以退出套接字会话。

另请参阅

保护 Envoy 快速入门指南

保护 Envoy 的关键概念概述。

双重代理沙箱

使用 mTLS 以及非 HTTP 流量,对代理之间的流量进行验证和双向身份验证的示例。

TLS 沙箱

使用 Envoy 进行各种 TLS 终止模式的示例。