Shadowsocks 文档
旅游导航
Shadowsocks 配置格式
配置文件
Shadowsocks 采用 JSON 格式配置:
{
“服务器”:“my_server_ip”,
“服务器端口”:8388,
“本地端口”:1080,
“密码”:“barfoo!”,
“方法”:“chacha20-ietf-poly1305”
}
JSON 格式
- 服务器 : 您的主机名或服务器 IP (IPv4/IPv6)。
- server_port:服务器端口号。
- local_port:本地端口号。
- 密码:用于加密传输的密码。
- 方法:加密方法。
加密方式
我们配置我们的服务器并建议您使用 chacha20-ietf-poly1305 AEAD 密码,因为它是最强大的加密方法。
如果配置你自己的 shadowsocks 服务器,你可以选择“chacha20-ietf-poly1305”或“aes-256-gcm”。
网址及二维码
Shadowsocks for Android / IOS 也采用 BASE64 编码的 URI 格式配置:
ss://BASE64-ENCODED-STRING-WITHOUT-PADDING#TAG
普通 URI 应该是:ss://method:password@hostname:port
上面的 URI 不遵循 RFC3986。 这种情况下的密码应该是纯文本,而不是百分比编码。
示例:我们正在使用 192.168.100.1:8888 的服务器 运用 BF-CFB 加密方式和密码 测试/!@#:.
然后,使用普通 URI ss://bf-cfb:测试/!@#:@192.168.100.1:8888,我们可以生成 BASE64 编码的 URI:
> console.log(“ss://”+ btoa(“bf-cfb:test/!@#:@192.168.100.1:8888”))
ss://YmYtY2ZiOnRlc3QvIUAjOkAxOTIuMTY4LjEwMC4xOjg4ODg
为了帮助组织和识别这些 URI,您可以在 BASE64 编码字符串后附加一个标记:
ss://YmYtY2ZiOnRlc3QvIUAjOkAxOTIuMTY4LjEwMC4xOjg4ODg#example-server
解决
Shadowsocks 使用在 SOCKS5 地址格式中找到的地址:
[1 字节类型][可变长度主机][2 字节端口]
以下是定义的地址类型:
- 0x01 :主机是一个 4 字节的 IPv4 地址。
- 0x03 : host 是一个可变长度的字符串,以 1 字节长度开头,后面跟着最大 255 字节的域名。
- 0x04 :主机是一个 16 字节的 IPv6 地址。
端口号是一个 2 字节大端无符号整数。
TCP
ss-local 客户端通过发送以目标地址开头的加密数据和有效负载数据来启动到 ss-remote 的连接。 加密将根据使用的密码而不同。
[目标地址][有效载荷]
ss-remote接收加密数据,然后解密解析目标地址。 然后它创建到目标的新 TCP 连接并将有效负载数据转发给它。 ss-remote 收到目标的回复,然后加密数据并将其转发回 ss-local,直到断开连接。
出于混淆目的,本地和远程应该在第一个数据包中发送带有一些有效负载的握手数据。
UDP
ss-local 将包含目标地址和负载的加密数据包发送到 ss-remote。
[目标地址][有效载荷]
一旦收到加密数据包,ss-remote 就会解密并解析目标地址。 然后,它将带有有效负载的新数据包发送到目标。 ss-remote 接收来自目标的数据包,并将目标地址添加到每个数据包的负载中。 加密副本被发送回 ss-local。
[目标地址][有效载荷]
这个过程可以归结为 ss-remote 为 ss-local 执行网络地址转换。