本文用 Docker Compose 搭建 3x-ui,并解决几个最常见的问题:订阅导入报 YAML 错误、Clash 节点超时、容器端口未开放,以及如何由 3x-ui 向 Clash/Mihomo 下发分流规则。

1. 用 Docker Compose 启动 3x-ui

创建 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
3xui:
image: ghcr.io/mhsanaei/3x-ui:latest
container_name: 3xui_app
cap_add:
- NET_ADMIN
- NET_RAW
volumes:
- ./db/:/etc/x-ui/
- ./cert/:/root/cert/
environment:
XRAY_VMESS_AEAD_FORCED: "false"
XUI_ENABLE_FAIL2BAN: "true"
tty: true
ports:
- "2053:2053" # 3x-ui 面板
- "2096:2096" # 订阅服务
- "44584:44584" # 示例:VLESS 入站端口
restart: unless-stopped

启动:

1
docker compose up -d

面板地址示例:

1
http://服务器IP:2053/panel/

端口映射是关键

20532096 只分别开放面板和订阅服务,不会自动开放节点入站端口

例如,面板内创建的 VLESS 入站使用 44584,就必须在 ports 追加:

1
- "44584:44584"

当前节点是 VLESS + TCP,不写 /tcp 也可以,Docker 默认就是 TCP。每新建一个不同端口的入站,都要同步映射对应端口,然后重新执行:

1
docker compose up -d

还要在云服务器安全组和系统防火墙放行该端口。例如 Ubuntu 使用 UFW:

1
ufw allow 44584/tcp

2. 在面板创建入站和客户端

  1. 进入 3x-ui 的「入站」页面,创建并启用入站。
  2. 记下入站端口,例如 44584
  3. 在入站中添加客户端,确保客户端未过期、未禁用。
  4. Docker Compose、云安全组和防火墙都要放行该入站端口。

如果 Clash 测速显示 Timeout,且外网测试该端口返回 Connection refused,优先检查以下三项:

  1. docker-compose.yml 是否映射了节点端口。
  2. 入站是否已启用,Xray 是否正常运行。
  3. 云安全组、UFW 或其他防火墙是否放行 TCP 端口。

服务器上可检查监听状态:

1
ss -lntp | grep ':44584'

正常情况下应能看到 Xray 对应的监听记录。

3. 配置 Clash/Mihomo 订阅

进入「面板设置 → 订阅设置」:

  1. 启用订阅服务。
  2. 确认订阅端口为 2096
  3. 进入「Clash / Mihomo」页,启用 Clash / Mihomo 订阅
  4. 客户端复制 Clash/Mihomo 格式的订阅地址。

3x-ui 同一个客户端会提供不同格式的订阅。导入 Clash Verge 时,必须使用 Clash/Mihomo YAML 地址:

1
http://服务器IP:2096/clash/客户端SubID

不要使用普通地址:

1
http://服务器IP:2096/sub/客户端SubID

/sub/ 返回普通节点订阅,而 Clash Verge 的远程配置需要 YAML,因此会出现:

1
the remote profile data is invalid yaml

HTTP 的 IP + 端口订阅可以正常使用;但订阅内容和 Sub ID 会明文传输,实际长期使用建议换成 HTTPS 域名。

4. 由 3x-ui 下发默认分流规则

机场订阅通常会下发“节点 + 代理组 + 路由规则”。3x-ui 也可以在订阅中下发规则:

  1. 进入「面板设置 → 订阅设置 → Clash / Mihomo」。
  2. 打开「启用路由」。
  3. 在「全局路由规则」填入规则。
  4. 保存后,在 Clash Verge 更新订阅。

这里的规则会被添加到 YAML 订阅开头、默认 MATCH,PROXY 之前。因此最后放入 MATCH,DIRECT,即可实现“指定网站走代理,其余全部直连”。

下面是一份可直接使用的规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# OpenAI / ChatGPT / Codex
- DOMAIN-SUFFIX,openai.com,PROXY
- DOMAIN-SUFFIX,chatgpt.com,PROXY
- DOMAIN-SUFFIX,oaistatic.com,PROXY
- DOMAIN-SUFFIX,oaiusercontent.com,PROXY

# Google / YouTube
- DOMAIN-SUFFIX,google.com,PROXY
- DOMAIN-SUFFIX,googleapis.com,PROXY
- DOMAIN-SUFFIX,gstatic.com,PROXY
- DOMAIN-SUFFIX,googleusercontent.com,PROXY
- DOMAIN-SUFFIX,youtube.com,PROXY
- DOMAIN-SUFFIX,youtu.be,PROXY
- DOMAIN-SUFFIX,ytimg.com,PROXY
- DOMAIN-SUFFIX,googlevideo.com,PROXY

# 常用海外服务
- DOMAIN-SUFFIX,github.com,PROXY
- DOMAIN-SUFFIX,githubusercontent.com,PROXY
- DOMAIN-SUFFIX,githubassets.com,PROXY
- DOMAIN-SUFFIX,x.com,PROXY
- DOMAIN-SUFFIX,twitter.com,PROXY
- DOMAIN-SUFFIX,t.co,PROXY
- DOMAIN-SUFFIX,twimg.com,PROXY
- DOMAIN-SUFFIX,reddit.com,PROXY
- DOMAIN-SUFFIX,redditstatic.com,PROXY
- DOMAIN-SUFFIX,telegram.org,PROXY
- DOMAIN-SUFFIX,t.me,PROXY
- DOMAIN-SUFFIX,discord.com,PROXY
- DOMAIN-SUFFIX,discordapp.net,PROXY
- DOMAIN-SUFFIX,facebook.com,PROXY
- DOMAIN-SUFFIX,instagram.com,PROXY
- DOMAIN-SUFFIX,netflix.com,PROXY
- DOMAIN-SUFFIX,spotify.com,PROXY
- DOMAIN-SUFFIX,twitch.tv,PROXY

# Pornhub
- DOMAIN-SUFFIX,pornhub.com,PROXY
- DOMAIN-SUFFIX,phncdn.com,PROXY

# 其余流量直连
- MATCH,DIRECT

PROXY 必须和订阅中的代理组名称一致。使用默认 3x-ui Clash/Mihomo 模板时,通常就是 PROXY。如果你改过代理组名称,请同步修改规则中的目标名称。

5. Clash Verge 使用方式

  1. 导入 /clash/客户端SubID 订阅地址。
  2. 在「代理」页的 PROXY 组中选择自己的节点,不要选 DIRECT
  3. 顶部模式选择「规则」。
  4. 更新订阅后,面板配置的全局路由规则会同步到 Clash Verge。

规则按从上到下的顺序匹配:前面的域名走 PROXY,最后的 MATCH,DIRECT 让其余网络走直连。要新增代理网站,只需在 MATCH,DIRECT 前增加一行:

1
- DOMAIN-SUFFIX,example.com,PROXY

要强制某个网站直连,同样放在 MATCH,DIRECT 前:

1
- DOMAIN-SUFFIX,example.com,DIRECT

6. 最短排错清单

现象 原因 处理
订阅导入提示 invalid yaml 使用了 /sub/ 改用 /clash/客户端SubID
Clash 节点测速超时 节点端口未映射或未放行 在 Compose、云安全组、系统防火墙同时开放入站端口
面板和订阅能打开,但节点连不上 仅映射了 20532096 追加节点端口,例如 44584:44584
所有流量都走代理 默认规则是 MATCH,PROXY 启用 Clash/Mihomo 路由并在最后添加 MATCH,DIRECT
指定网站没有走代理 规则放在 MATCH,DIRECT 后面,或 PROXY 组未选节点 把规则移动到 MATCH,DIRECT 前,并选择节点