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 日 |
#164 在 WebSocket 中
每月 39 次下载
68KB
1.5K SLoC
Kaminari
基于 lightws 构建的闪电般的 WebSocket 隧道。
简介
-
客户端接收 tcp 然后发送 tcp/ws/tls/wss。
-
服务器端接收 tcp/ws/tls/wss 然后发送 tcp。
-
与 shadowsocks SIP003 插件 兼容。
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=fixed
或mode=standard
,客户端将以正常方式对有效载荷数据进行掩码。在fixed
模式下,客户端将使用相同的掩码密钥来维护唯一的WebSocket连接。而在standard
模式下,客户端将在发送每个帧之间更新掩码密钥。
TLS选项
使用tls
启用TLS。
客户端选项
-
sni=<sni>
*:设置SNI。 -
alpn=<alpn>
:设置ALPN。例如:h2,http/1.1
。 -
0rtt
:启用早期数据。 -
insecure
:跳过服务器证书验证。
服务器选项
需要cert+key
或servername
之一。
-
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