一键式 clash server,开箱即用,可选 nginx 反代 or 直接 443
102
把自己这台机器变成代理服务器:sing-box 做出站入站,容器只监听回环端口, 对外由宿主机 nginx 终结 TLS 或按 SNI 分流。
| 协议 | 端口 | 谁终结 TLS | 特点 |
|---|---|---|---|
| VLESS over WebSocket | 10000 | 宿主机 nginx | 藏在 nginx 后面,看起来就是访问一个普通 HTTPS 网站;可过 CDN、可与自己站点共存 |
| VLESS + Reality | 8443 | sing-box(伪装成目标站点) | 不需要自己的域名和证书,抗主动探测最强;必须占 443(nginx 只能 ssl_preread 分流) |
AnyTLS 也是 sing-box 的新协议,但它要求自己的域名 + 自己的证书、且必须由 sing-box 自己终结 TLS,和 Reality 一样要占 443、nginx 只能透传,抗探测收益不如 Reality 明显, 因此本镜像未内置。
docker run -d --name clash_server \
-p 127.0.0.1:10000:10000 \
-p 127.0.0.1:8443:8443 \
-e PROTOCOL=vless-ws,vless-reality \
-e DOMAIN=proxy.example.com \
-e PUBLIC_HOST=proxy.example.com \
-v ./data:/etc/sing-box \
micrograils/clash-server
首次启动后看日志拿到接入信息:
docker compose logs clash-server # 或 docker logs clash_server
日志(以及 ./data/client-node.txt)里会有:
vless:// 分享链接proxies: YAML 片段UUID、WS 路径、Reality 密钥首次生成后写入 /etc/sing-box/.identity,重启不变;
想强制更换就删掉这个文件。
| 变量 | 默认值 | 说明 |
|---|---|---|
PROTOCOL | vless-ws | vless-ws / vless-reality / all,逗号分隔可同时开 |
UUID | 自动生成 | VLESS 用户 ID |
WS_PATH | 随机 16 字节 hex | WebSocket 路径,务必与 nginx location 一致 |
WS_PORT / REALITY_PORT | 10000 / 8443 | 容器内监听端口 |
WS_PUBLIC_PORT / REALITY_PUBLIC_PORT | 443 | 客户端实际连接端口(用于生成链接) |
LISTEN_ADDR | 0.0.0.0 | 容器内监听地址 |
DOMAIN | 空 | 自己的域名(WS 链接里的 host/sni) |
PUBLIC_HOST | $DOMAIN 或 127.0.0.1 | 客户端连接的主机名/IP |
REALITY_SERVER_NAME | www.microsoft.com | 伪装 SNI |
REALITY_TARGET | www.microsoft.com:443 | 握手时真实去连的目标站点 |
REALITY_SHORT_ID | 随机 4 字节 hex | 客户端 sid |
REALITY_PRIVATE_KEY / REALITY_PUBLIC_KEY | 自动生成 | 也可手动指定(复用已有密钥) |
LOG_LEVEL | info | 日志级别 |
SING_BOX_CONF_DIR | /etc/sing-box | 配置与身份文件目录 |
SING_BOX_FORCE_ROOT | false | 监听端口 <1024 时需置 true |
Reality 握手时服务端会去连
REALITY_TARGET,所以这台机器必须能访问伪装目标站点, 否则客户端握手失败。
| 路径 | 说明 |
|---|---|
/etc/sing-box | 配置、身份文件(.identity)与 client-node.txt |
仓库里给了三份配置,既可以直接 docker compose 起一个 nginx,也可以复制到宿主机 nginx:
nginx/
├── nginx.conf # 顶层,http + stream 两个 include
├── conf.d/clash-server.conf # 443 终结 TLS + /WS_PATH 反代到 10000
└── stream.d/reality.conf # 可选:443 按 SNI 分流 Reality
conf.d/clash-server.conf 拷到 /etc/nginx/conf.d/,listen 改成 443 ssl;server_name、ssl_certificate* 换成自己的;location 路径改成容器日志里的 WS_PATH;proxy_pass 改成 http://127.0.0.1:10000;nginx -t && nginx -s reload。不需要 stream 段,直接删掉 reality.conf。
443 只能有一个监听者,所以让 stream 抢下 443,用 ssl_preread 按 SNI 分流:
/etc/nginx/nginx.conf 顶层加:
stream { include /etc/nginx/stream.d/*.conf; }
stream.d/reality.conf:把 clash-server:8443 换成 127.0.0.1:8443,删掉 resolver 行;conf.d/clash-server.conf:listen 改为 127.0.0.1:10443 ssl(与 stream 里的 default 一致);docker compose up -d
compose 里 clash-server 只把端口映射到 127.0.0.1:10000/8443,nginx 通过容器名
clash-server 访问它(stream 段用 resolver 127.0.0.11 解析 compose 内部 DNS)。
证书放到 ./certs/fullchain.pem + ./certs/privkey.pem,用 certbot 签一张即可:
certbot certonly --standalone -d proxy.example.com
cp /etc/letsencrypt/live/proxy.example.com/{fullchain,privkey}.pem ./certs/
把日志里的 proxies: 片段粘到 mihomo 配置的 proxies: 下即可,或者直接用 vless:// 链接。
搭配本仓库的 clash-client 时,写进 merge.yaml 最省事:
proxies:
- name: "vless-ws"
type: vless
server: proxy.example.com
port: 443
uuid: <日志里的 UUID>
network: ws
tls: true
servername: proxy.example.com
udp: true
ws-opts:
path: "<日志里的 WS_PATH>"
127.0.0.1,不要直接 -p 10000:10000 对外;WS_PATH 用自动生成的随机路径,别用 /ws、/vpn 这类常见值;location / 返回一个正常网页),否则不像正常网站;singbox 用户再运行内核。维护者文档(架构 / 构建 / 版本管理 / 维护)见 MAINTENANCE.md。
Content type
Image
Digest
sha256:ff0c626c2…
Size
36.8 MB
Last updated
about 14 hours ago
docker pull micrograils/clash-server