Sign inSign up

lovechen/snell-go

By lovechen

•Updated 3 months ago

Image
0

2.6K

lovechen/snell-go repository overview

⁠Snell + ShadowTLS Server(纯 Go 版)

集成 Snell 代理 + ShadowTLS 的 Docker 镜像,三个组件均为 Go 实现:Snell v6 服务器、ShadowTLS 服务器、启动程序,跑在 scratch 基础镜像上。

镜像就是 lovechen/snell-go:latest(= :6.0.0b3-v2)——latest 同名同 tag,docker compose pull 即升级。 本版使用 ShadowTLS v2;从旧版升级,客户端把 shadow-tls-version=3 改成 =2 即可(PSK / 密码 / SNI 全不变)。

⁠功能特点

  • 纯 Go 实现 Snell v6(对齐官方 v6.0.0b3)+ ShadowTLS v2
  • scratch 基础镜像,体积小(约 18 MB),无系统依赖;多架构 amd64/arm64
  • 自动生成密钥(PSK / ShadowTLS 密码用 crypto/rand)+ 配置持久化
  • UDP:Snell 直连模式支持;ShadowTLS 模式仅 TCP(受 TLS 限制)

⁠性能

  • 加密热路径实测约 2 GB/s / 核——远高于常见 VPS 带宽,瓶颈在网络而非程序。
  • 热路径按连接复用缓冲、对 GC 友好,随 CPU 核数扩展,适合多用户(同一 PSK)同时接入。

⁠快速开始

⁠Docker Compose(推荐)
mkdir snell-go && cd snell-go
cat > docker-compose.yml << 'EOF'
services:
  snell:
    image: lovechen/snell-go:latest
    container_name: snell-go
    ports:
      - "6333:6333/tcp"
      - "6333:6333/udp"
      - "6334:6334"
    volumes:
      - ./config:/app/config
    environment:
      - TZ=Asia/Singapore
    restart: always
EOF
docker compose up -d
docker logs snell-go      # 查看自动生成的 PSK / 密码 / 客户端配置
⁠Docker 命令行
docker run -d --name snell-go \
  -p 6333:6333/tcp -p 6333:6333/udp -p 6334:6334 \
  -v $(pwd)/config:/app/config --restart always \
  lovechen/snell-go:latest

⁠客户端配置(Surge)

[Proxy]
# Snell 直连
Snell-Direct = snell, server_ip, 6333, psk=your_psk, version=6, reuse=true, tfo=true

# Snell + ShadowTLS(注意 shadow-tls-version=2)
Snell-TLS = snell, server_ip, 6334, psk=your_psk, version=6, reuse=true, tfo=true, shadow-tls-password=your_password, shadow-tls-sni=gateway.icloud.com, shadow-tls-version=2

把参数替换为 docker logs snell-go 里显示的实际值。shadow-tls-sni 要填一个支持 TLS 1.3 的站点(默认 gateway.icloud.com),且客户端与服务端一致。

⁠从旧版升级(无缝)

服务端零改动:同名镜像 lovechen/snell-go:latest,docker compose pull && docker compose up -d 即可;./config 目录原样挂着,PSK / ShadowTLS 密码 / SNI 全保留(协议版本由镜像决定,不从配置读回)。 客户端只改一个字:shadow-tls-version=3 → shadow-tls-version=2。

⁠一键部署 / 切换
cd /data/docker-compose/snell/ 2>/dev/null || { mkdir -p /data/docker-compose/snell && cd /data/docker-compose/snell; }
docker compose down 2>/dev/null; docker rm -f snell 2>/dev/null
cat > docker-compose.yml <<'EOF'
services:
  snell:
    image: lovechen/snell-go:latest
    container_name: snell
    ports:
      - "63333:6333/tcp"
      - "63333:6333/udp"
      - "63334:6334"
    volumes:
      - ./config:/app/config
    environment:
      - TZ=Asia/Singapore
      - SHADOWTLS_SNI=gateway.icloud.com
    restart: always
EOF
docker compose pull && docker compose up -d && sleep 3 && docker compose logs --tail 40

SHADOWTLS_SNI 可在 environment 里改(填支持 TLS 1.3 的站点)。./config 不动则密钥不变,客户端零改动(只把 shadow-tls-version 设为 2)。

⁠密钥与持久化

首启自动生成两个 32 位随机密钥(crypto/rand)并存到 config/:

  • snell-server.conf:Snell PSK
  • shadowtls.conf:ShadowTLS 密码 / SNI

重启复用已存配置(删文件才重新生成)。配置目录由程序自动创建。

⁠常用环境变量 / 配置

  • SHADOWTLS_SNI(env):握手伪装的站点,默认 gateway.icloud.com;设了就每次启动强制覆盖并持久化。建议填支持 TLS 1.3 的站点。
  • SHADOWTLS_HANDSHAKE_TIMEOUT(env,秒):握手期时限,默认 30;0 禁用。
  • connect-timeout(写 config/snell-server.conf,秒):出站连不上目标的快速失败时限;0/不写 = 官方行为(无应用层超时)。
  • dns-timeout(同上,秒):DNS 解析时限,默认 10;0 不限。
[snell-server]
listen = 0.0.0.0:6333
psk = your_psk
mode = default
dns-ip-preference = default
connect-timeout = 15
dns-timeout = 10

⁠与其它镜像的关系

镜像组成
lovechen/snell官方 Snell b3 二进制 + 官方 shadow-tls 二进制 + Go 启动
lovechen/snell-go:latest(= :6.0.0b3-v2,本镜像)Snell v6 + ShadowTLS v2 全 Go 实现 + Go 启动
lovechen/snell-go:6.0.0b3-v3同上但 ShadowTLS v3(客户端配 shadow-tls-version=3)

lovechen/snell 与本镜像 wire 一致(Snell v6 + ShadowTLS v2),迁移把 config 挂过来即可。 想用 v3,改用 :6.0.0b3-v3 这个 tag 并把客户端 shadow-tls-version 设为 3。

Tag summary

Content type

Image

Digest

sha256:456dcba39…

Size

10.5 MB

Last updated

3 months ago

docker pull lovechen/snell-go