WebSockets
此示例介绍了 Envoy 可以配置为代理 WebSockets 的一些方法。
它演示了使用和不使用 TLS
终止 WebSocket 连接,并提供了一些代理到加密和非加密上游套接字的基本示例。
步骤 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
上的端口 10000
、15000
、20000
、30000
。
它还启动了两个上游服务,一个 ws
和一个 wss
。
上游服务分别监听内部 Docker 网络上的端口 80
和 443
。
套接字服务器是非常简单的实现,它们只是响应任何输入输出 [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 直通配置
不需要任何 TLS
或 HTTP
设置,而是使用简单的 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
终止模式的示例。