Sign inSign up

micrograils/clash-server

By micrograils

•Updated about 14 hours ago

一键式 clash server,开箱即用,可选 nginx 反代 or 直接 443

Image
Networking
Developer tools
0

102

micrograils/clash-server repository overview

⁠clash-server Docker 镜像

Docker Image Size Docker Pulls Platforms

把自己这台机器变成代理服务器:sing-box 做出站入站,容器只监听回环端口, 对外由宿主机 nginx 终结 TLS 或按 SNI 分流。

⁠两种入站(可同时开)

协议端口谁终结 TLS特点
VLESS over WebSocket10000宿主机 nginx藏在 nginx 后面,看起来就是访问一个普通 HTTPS 网站;可过 CDN、可与自己站点共存
VLESS + Reality8443sing-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:// 分享链接
  • mihomo / sing-box 可直接粘贴的 proxies: YAML 片段

UUID、WS 路径、Reality 密钥首次生成后写入 /etc/sing-box/.identity,重启不变; 想强制更换就删掉这个文件。

⁠环境变量

变量默认值说明
PROTOCOLvless-wsvless-ws / vless-reality / all,逗号分隔可同时开
UUID自动生成VLESS 用户 ID
WS_PATH随机 16 字节 hexWebSocket 路径,务必与 nginx location 一致
WS_PORT / REALITY_PORT10000 / 8443容器内监听端口
WS_PUBLIC_PORT / REALITY_PUBLIC_PORT443客户端实际连接端口(用于生成链接)
LISTEN_ADDR0.0.0.0容器内监听地址
DOMAIN空自己的域名(WS 链接里的 host/sni)
PUBLIC_HOST$DOMAIN 或 127.0.0.1客户端连接的主机名/IP
REALITY_SERVER_NAMEwww.microsoft.com伪装 SNI
REALITY_TARGETwww.microsoft.com:443握手时真实去连的目标站点
REALITY_SHORT_ID随机 4 字节 hex客户端 sid
REALITY_PRIVATE_KEY / REALITY_PUBLIC_KEY自动生成也可手动指定(复用已有密钥)
LOG_LEVELinfo日志级别
SING_BOX_CONF_DIR/etc/sing-box配置与身份文件目录
SING_BOX_FORCE_ROOTfalse监听端口 <1024 时需置 true

Reality 握手时服务端会去连 REALITY_TARGET,所以这台机器必须能访问伪装目标站点, 否则客户端握手失败。

⁠数据卷

路径说明
/etc/sing-box配置、身份文件(.identity)与 client-node.txt

⁠nginx 配置

仓库里给了三份配置,既可以直接 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
⁠场景 A:宿主机 nginx,只用 VLESS-WS
  1. 把 conf.d/clash-server.conf 拷到 /etc/nginx/conf.d/,listen 改成 443 ssl;
  2. server_name、ssl_certificate* 换成自己的;
  3. location 路径改成容器日志里的 WS_PATH;
  4. proxy_pass 改成 http://127.0.0.1:10000;
  5. nginx -t && nginx -s reload。

不需要 stream 段,直接删掉 reality.conf。

⁠场景 B:宿主机 nginx,WS + Reality 都要

443 只能有一个监听者,所以让 stream 抢下 443,用 ssl_preread 按 SNI 分流:

  1. 在 /etc/nginx/nginx.conf 顶层加:
    stream { include /etc/nginx/stream.d/*.conf; }
    
  2. stream.d/reality.conf:把 clash-server:8443 换成 127.0.0.1:8443,删掉 resolver 行;
  3. conf.d/clash-server.conf:listen 改为 127.0.0.1:10443 ssl(与 stream 里的 default 一致);
  4. reload nginx。
⁠场景 C:docker compose 自带 nginx
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 这类常见值;
  • 伪装站点要有真实内容(nginx location / 返回一个正常网页),否则不像正常网站;
  • 镜像以 root 生成配置后降权到 singbox 用户再运行内核。

⁠相关链接


维护者文档(架构 / 构建 / 版本管理 / 维护)见 MAINTENANCE.md⁠。

Tag summary

Content type

Image

Digest

sha256:ff0c626c2…

Size

36.8 MB

Last updated

about 14 hours ago

docker pull micrograils/clash-server