#tunnel #top #built #connection #kaminari #lightws

bin+lib kaminari-cmd

基于 lightws 构建的永远快速的 WebSocket 隧道

14 个版本

0.6.0 2023 年 12 月 17 日
0.5.6 2022 年 7 月 25 日
0.5.5 2022 年 6 月 18 日
0.5.3 2022 年 5 月 22 日
0.3.2 2022 年 4 月 12 日

#164WebSocket

每月 39 次下载

GPL-3.0 许可证

68KB
1.5K SLoC

Kaminari

workflow crates.io downloads telegram

基于 lightws 构建的闪电般的 WebSocket 隧道。

简介

 tcp                           ws/tls/wss                           tcp
 ===                          ============                          ===
        +-------------------+              +-------------------+
        |                   |              |                   |
+------->                   +-------------->                   +------->
        |     kaminaric     |              |     kaminaris     |
<-------+                   <--------------+                   <-------+
        |                   |              |                   |
        +-------------------+              +-------------------+       

用法

独立

kaminaric <local_addr> <remote_addr> <options>

kaminaris <local_addr> <remote_addr> <options>

作为 shadowsocks 插件

sslocal ... --plugin <path/to/kaminaric> --plugin-opts <options>

ssserver ... --plugin <path/to/kaminaris> --plugin-opts <options>

选项

所有选项都以单个格式化字符串表示。例如:"ws;path=/ws;host=example.com",其中分号、等号和反斜杠必须用反斜杠转义。

以下是可用选项列表, * 表示 必须

WebSocket 选项

使用 ws 启用 WebSocket。

客户端或服务器端选项

  • host=<host>* : 设置 HTTP 主机。

  • path=<path>* : 设置 HTTP 路径。

客户端额外选项

  • mask=<mode> : 设置遮罩模式。可用值:[跳过、标准、固定]

关于遮罩模式

WebSocket 客户端应在发送之前对有效载荷进行遮罩。

使用 mode=skip(默认模式),我们使用空的遮罩密钥(0x00..0)来简单地跳过遮罩,这也可以被我们的服务器检测到,然后跳过解罩。其他软件(Nginx、Haproxy、CDNs 等)仍然可以正确处理我们的数据,而无需知道这个技巧。

关于mode=fixedmode=standard,客户端将以正常方式对有效载荷数据进行掩码。在fixed模式下,客户端将使用相同的掩码密钥来维护唯一的WebSocket连接。而在standard模式下,客户端将在发送每个帧之间更新掩码密钥。

TLS选项

使用tls启用TLS。

客户端选项

  • sni=<sni>*:设置SNI。

  • alpn=<alpn>:设置ALPN。例如:h2,http/1.1

  • 0rtt:启用早期数据。

  • insecure:跳过服务器证书验证。

服务器选项

需要cert+keyservername之一。

  • key=<path/to/key>*:私钥路径。

  • cert=<path/to/cert>*:证书路径。

  • servername=<name>*:生成自签名的证书/密钥,使用$name作为CN。

  • ocsp=<path/to/ocsp>:DER编码的OCSP响应。

OCSP Stapling

参见维基百科

Let's Encrypt的OpenSSL示例

openssl ocsp -issuer <path/to/ca> \
    -cert <path/to/cert> \
    -url http://r3.o.lencr.org \
    -header Host=r3.o.lencr.org \
    -respout <path/to/ocsp> -noverify -no_nonce

示例

tcp ⇋ ws --- ws ⇋ tcp

kaminaric 127.0.0.1:10000 127.0.0.1:20000 'ws;host=example.com;path=/ws'

kaminaris 127.0.0.1:20000 127.0.0.1:30000 'ws;host=example.com;path=/ws'

tcp ⇋ tls --- tls ⇋ tcp

kaminaric 127.0.0.1:10000 127.0.0.1:20000 'tls;sni=example.com'

# use cert + key
kaminaris 127.0.0.1:20000 127.0.0.1:30000 'tls;cert=example.com.crt;key=example.com.key'

# or generate self signed cert/key
kaminaris 127.0.0.1:20000 127.0.0.1:30000 'tls;servername=example.com'

tcp ⇋ wss --- wss ⇋ tcp

kaminaric 127.0.0.1:10000 127.0.0.1:20000 'ws;host=example.com;path=/ws;tls;sni=example.com'

# use cert + key
kaminaris 127.0.0.1:20000 127.0.0.1:30000 'ws;host=example.com;path=/ws;tls;cert=example.com.crt;key=example.com.key'

# or generate self signed cert/key
kaminaris 127.0.0.1:20000 127.0.0.1:30000 'ws;host=example.com;path=/ws;tls;servername=example.com'

shadowsocks插件

ssserver -s "0.0.0.0:8080" -m "aes-128-gcm" -k "123456" \
    --plugin "path/to/kaminaris" \
    --plugin-opts "ws;host=example.com;path=/chat"
sslocal -b "127.0.0.1:1080" -s "example.com:8080" -m "aes-128-gcm" -k "123456" \
    --plugin "path/to/kaminaric" \
    --plugin-opts "ws;host=example.com;path=/chat"

*要在客户端使用v2ray-plugin,请添加mux=0以禁用多路复用,以便它发送标准WebSocket流,该流可以被kaminari或其他中间件处理。

sslocal -b "127.0.0.1:1080" -s "example.com:8080" -m "aes-128-gcm" -k "123456" \
    --plugin "path/to/v2ray-plugin" \
    --plugin-opts "mux=0;host=example.com;path=/chat"

依赖关系

~4–17MB
~194K SLoC