🟡 进阶

3x-ui 到底怎么用:装完之后每一步该点哪里

它是 Xray-core 的网页遥控器,不是代理本身。这一篇从一条安装命令讲到 VLESS+REALITY 连通、订阅发出去、备份能恢复,并把「哪些文件真的在动」「哪些官方说法和代码对不上」一并说清。

📅 更新于 2026-09-13

本文校对于 3x-ui @ v3.7.0(2026-08-24 发布)· 官方源:github.com/MHSanaei/3x-ui · 官方文档:docs.sanaei.dev

12
入站协议
7
传输方式
28
x-ui 菜单项
2
必须备份的东西

00先花 30 秒:三句话 + 按你的处境直接抄

读完这一篇,你能做到三件事:在一台全新的服务器上把它装起来并锁好;建出一个能连上的代理入口,把链接发给别人;在它坏掉的那天知道该先看哪个文件、敲哪条命令。

🔑 先记住三句话(后面全是细节)

① 3x-ui 是「遥控器」,不是「代理」——真正干活的是它拉起来的另一个程序 Xray-core;面板自己不转发一个字节的流量。② 它的全部状态只有一个数据库文件(/etc/x-ui/x-ui.db),而 Xray 那份 config.json 是每次改动重新生成的「打印件」——备份备前者,排障看后者,两者别搞反。③ 面板的端口和入站的端口是两回事:面板能打开 ≠ 代理能用,防火墙要分别放行;「面板能开、客户端连不上」九成是只记住了前者。

按你的处境,直接用这个

你现在的状态直接用这个为什么
有一台全新 Linux 服务器,什么都没装bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)官方推荐路径,一条命令装好服务、管理命令和数据库(04)
不想让安装脚本改我的系统docker compose up -d用仓库自带的 compose 文件,状态落在你指定的卷里(04)
装完了,不知道下一步点哪先改端口/路径/密码/2FA,再建入站顺序反了等于开着门装修(05)
想马上有一个能连的入口VLESS + 443 + REALITY,flow 填 xtls-rprx-vision不需要域名、不需要证书,当下最省事的一套(08)
要给多个人分流量一个 Email 一条客户端记录,关联到多个入站一条记录一套统计,配额才算得准(14)
用户多、地址常变,不想每次重发链接用订阅地址,路径 /<subPath>/<subId>改配置用户端刷新即可,不用重新导入(15)
服务器前面垫了 CDN用「受管主机」公布 CDN 域名,不要用 REALITYREALITY 依赖看到真实 TLS 握手,CDN 已经把它终结了(12)
面板能开、客户端连不上x-ui status → x-ui log → 核对分享链接按这三步能把问题域一刀切两半(21)
要换服务器 / 重装系统先 cp /etc/x-ui/x-ui.db,再搬证书目录数据库是真相源,机器没了它也没了(20)
忘了面板密码cat /etc/x-ui/install-result.env,或菜单 7 重设安装时的凭据摘要留在那个 600 权限的文件里(05)

一条可执行的上手路径

1
装,并抄下它打印的凭据(约 5 分钟)

见 04。脚本最后会打印登录地址、用户名、密码和访问路径——先把这几行复制到你的密码管理器,丢了得去翻文件或走菜单重设。

2
先锁门,再开机做生意(约 10 分钟)

见 05:改端口、改长随机路径、确认强密码、开两步验证、上 TLS 或先走 SSH 隧道。这一步做完再去建入站。

3
建第一个入站,连上它(约 10 分钟)

见 08:VLESS + 443 + REALITY + Vision,加一个客户端,复制分享链接导入客户端,放行端口,看流量计数是否开始动。

4
把备份做掉,然后就不用天天惦记它了(约 2 分钟)

见 19:复制数据库文件到服务器之外。这一步不做,前面三步随时可能归零。

四个数字,先有个量级

2053面板默认端口(入站端口是另一个数)
2096订阅服务器默认端口,它是独立服务
60,977安装脚本随机选端口时的取值个数(1024–62000)
64 MiB单个 Xray 日志超过就被截断,不用怕写满磁盘
📌 读完你应该能

用自己的话说清「面板 / Xray / 数据库 / 配置打印件」这四样的分工;独立判断自己的场景该不该用它;照抄命令装好并完成最小可用配置;知道排障时先看哪三处、备份时该拿走哪两个东西。本文讲的是「怎么把它用起来」,不涉及 Xray 内部的加密算法实现。

013x-ui 到底是什么(先破三个最容易搞错的理解)

它不是协议。你听到的 VLESS、Trojan、Shadowsocks 是协议(可以理解成「双方约定的对暗号方式」),3x-ui 一个都不是。它不改协议、不发明协议,只是给你一个网页界面去生成协议的配置。

它不是内核。真正干活的是 Xray-core——那个负责加解密、监听端口、转发流量的可执行程序(俗称「内核」,意思是干实际工作的那部分)。3x-ui 是它的控制面板:把 Xray-core 当子进程拉起来、给它写配置文件、看它的流量统计。

它不是给终端用户用的。你手机上的 v2rayNG、Hiddify、Mihomo 是客户端(装在用户设备上、替用户发起连接的程序);3x-ui 装在那台服务器上,是服务端管理台。两者之间靠一条「分享链接」或一个「订阅地址」对接。

那它是什么

一句话:3x-ui 是一个开源的网页控制面板,把你手写 Xray JSON 配置这件事,变成在浏览器里点选协议、填端口、加用户。官方 README 的原话是 「an advanced, open-source web control panel for managing Xray-core servers」(一个用来管理 Xray-core 服务器的高级开源网页控制面板),并且写明它是老项目 X-UI 的增强分支(fork,指从别人的项目复制一份出来自己继续开发)。

这里有个术语要花一句话解释:JSON 配置就是一份「用大括号和引号写的设置清单」,长得像 {"port": 443, "protocol": "vless"}。手写它容易漏括号、错一层缩进,而且错了没有任何提示——面板帮你做的就是把这份清单变成表单和勾选框。

✗ 以为它「就是一个代理软件」

装完 3x-ui 就以为已经能用了,去客户端填服务器地址,发现连不上,然后开始怀疑面板坏了。

✓ 它是「管理台 + 一个被它拉起来的内核」

装完之后你手上是两样东西:一个能打开的网页管理台,和一个由它托管、开机自启的 Xray 进程。真正提供代理服务的是后者,而后者必须由你在面板里建一个入站才会有事干。

你手上其实有四个东西,分工如下

3x-ui
面板(Panel):网页管理台
你直接操作
一个 Go 语言写的程序,默认监听 2053 端口。它同时提供网页界面和一套管理用的 API(API 就是「让别的程序也能指挥它」的接口)。你的日常工作——建入站、加客户端、看流量——都在它这里。
别当什么用

别把它当代理入口:面板端口开在公网上只增加被扫描的风险,不会让你的客户端快一点。也别说「面板很强所以我的代理很强」——两者的性能是两回事。

Xray-core
内核:真正的代理引擎
由面板托管
一个独立可执行文件(Linux 上叫 xray-linux-amd64 这类名字),负责监听你配的端口、和客户端握手、加密并转发流量。它读的配置文件由面板生成,路径是 /usr/local/x-ui/bin/config.json。
什么时候你才需要碰它

正常用完全不碰。只有两种时候:排障时想确认「面板到底给 Xray 写了什么」(cat 那个文件);或者想用它的 x25519 子命令手工生成一对密钥。

x-ui.db
数据库:唯一真相源
你负责备份
默认是一个 SQLite 文件(SQLite 可以理解成「一个文件就是整个数据库,不需要额外装数据库服务」),位置 /etc/x-ui/x-ui.db。你的入站、客户端、设置,以及各种「令牌」全在里面——令牌就是一串代替密码用的长随机字符串,给别的程序用的,不需要你记。
它和 config.json 的关系

数据库是「你想怎样」,config.json 是面板按数据库渲染出来给 Xray 的「这次请这样跑」。改数据库 → 重新渲染 → 通知 Xray。所以直接编辑 config.json 一定会被下一次渲染覆盖掉(07)。

sub :2096
订阅服务器:第二个 HTTP 服务
给别人用
和面板分开的另一个监听端口(默认 2096)。它把某个客户端的全部配置按一个 URL 吐出去,客户端定期来刷新。默认是开启的,很多人第一次装机就把它晾在公网上。
别当什么用

别以为「面板上了 HTTPS,订阅也就安全了」——它们是两个监听端口、两套证书配置,要分别处理(15)。

机制:改动一次配置,面板到底做了什么

理解这一层,后面所有的「为什么改了没生效」「为什么连接会断」都不用猜。3x-ui 的 Go 后端是唯一真相源,流程固定四步:

1 写库
改动进 SQLite
→
2 渲染
生成完整 Xray 配置
→
3 热应用
按差量推送,不断线
→
4 重启
差量做不到时整进程重启
  1. 你在面板上的每次改动,先写进数据库(/etc/x-ui/x-ui.db);
  2. 后端重新渲染一份完整的 Xray 配置(内存里的 JSON 对象);
  3. 它先尝试热应用(hot apply,意思是「不重启进程,把变化直接推给正在运行的程序」):把新旧配置做差,只把「加了哪个用户、删了哪个入站」这类增量通过 Xray 的管理接口推过去——客户端连接不会断;
  4. 差量无法热应用时(结构性改动),它退化成整进程重启 Xray——所有连接会断一下。这个重启被一个「30 秒防抖标志」合并:窗口内改十次也只重启一次。

所以「为什么我改了个备注,连接全断了」的答案通常是:这次改动落到了第 4 步。这条链路在官方仓库的架构文档里有明确记载(docs/architecture.md §5.1)。

💡 记住这条边界

面板挂了,Xray 里已经在跑的连接不一定会断——但你也改不动配置了;反过来,Xray 挂了面板照样能打开,于是「面板正常」这件事完全不能证明代理正常。排障时把这两件事分开看,能省掉一半时间。

02它解决什么问题:手写配置到底难在哪

要讲清「没有它会怎样」,最直接的办法是看看有它之前,一个最普通的操作长什么样。

没有它的世界:改一个用户的配额

Xray 本身只认一份 JSON 配置。假设你要给用户 alice 设 100 GB 配额,在纯 Xray 的世界里你要做的事是:打开配置文件、找到对应入站、找到那个客户端条目、手写 email 字段、保存、重启 Xray——而「100 GB 配额」这件事 Xray 根本不管,配额、到期时间、按用户统计流量都不在 Xray 的职责里。你得另外准备一套脚本去读日志、累加流量、超了就改配置重启。

3x-ui 把这一整套做成了界面和定时任务。这就是它存在的理由,可以拆成四件事:

它替你做的事手工时代你要怎么做代价在哪
可视化生成协议配置手写并维护 inbounds[] JSON错一个括号就是内核起不来,而且报错信息不指位置
按客户端的流量统计与限额自己解析 Xray 日志、累加、超限后改配置重启要自己写脚本、自己处理重启时的断线
到期时间与自动重置周期写 cron,到点改配置时区、月末天数、批量用户都是坑
分享链接 / 二维码 / 订阅自己拼 URL,参数名字一个都不能错拼错了客户端只会「连不上」,不给原因
多台机器统一查看逐台 SSH 上去看没有汇总视图

它不解决什么(这几件事它真的不管)

⚠️ 上游自己划的一条线

项目 README 里明确写着:「This project is intended for personal use only. Please do not use it for illegal purposes or in a production environment.」(仅供个人使用,请勿用于非法用途或生产环境。)本文是技术文档,不构成任何合规建议:搭代理服务在不少国家和地区受法律与运营商条款约束,请先确认你所在地的规定,并自行承担后果。另外,这类面板是互联网上的高价值攻击目标——把默认凭据、默认端口、明文 HTTP 暴露在公网上,等于把服务器送人(19 给了加固顺序)。

03什么场景该用它(以及什么时候别用)

这一段本该被放在开头——但它回答的是「我该不该读」,而你能点进这一页,其实已经回答了。所以它挪到这里,等你看完它是什么、解决什么之后再核对一遍。

这四种处境,它是对的工具

前置知识只需要三样:会用 SSH 登录服务器(SSH 就是「在本地终端里操作远端机器」的工具)、知道「端口 = 门牌号」、知道域名和证书大概是怎么回事。其余本文都会给到可照抄的命令——所以难度定在 🟡 进阶,而不是 🟢 入门。

这四种处境,别用它

04怎么装:三条路 + 装之前先看一个真实发现

官方给三条路:安装脚本(推荐)、Docker、手动解压。三条路的产物是一样的——一个开机自启的系统服务 + 一个 x-ui 管理命令 + 一份数据库。

方式一:安装脚本(推荐)

官方 README 给的一行命令是:

bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)

装指定版本,把标签追加在后面(推荐这么做,理由见本节末尾):

bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v3.7.0

装滚动开发版(main 分支的最新逐提交预发布版,不是稳定版):

bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) dev-latest

这三条命令里的 <( ... ) 是 shell 的「进程替换」写法,意思是「把这条命令的输出当成一个文件交给 bash 去执行」。你不需要理解它的细节,整行复制即可。

链接里的 master 和 main:我实测过

🔍 一条可以自己复核的发现

官方 README 与文档里写的分支是 master,但仓库 API 显示它的默认分支只有一个 main(本文核对于 2026-09-13,仓库默认分支 main,最后推送时间 2026-09-12)。我把两个 URL 都拉下来比过字节:

curl -sL https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh -o a.sh
curl -sL https://raw.githubusercontent.com/mhsanaei/3x-ui/main/install.sh  -o b.sh
md5 a.sh b.sh   # 两个摘要相同

两份内容完全一致(GitHub 对改过名的默认分支保留了重定向)。结论:写 master 能用,写 main 更直白。注意 install.sh 会持续更新,所以「多少字节、什么摘要」这类数字每次上游改动都会变——这条结论的价值在于「两个 URL 等价」,不在具体字节数。

装之前值得知道的一件事:校验和实际上被跳过了

README 宣称:「Every release asset is published with a .sha256 sum next to it. Both install.sh and the updater verify the archive against that sum and abort on a mismatch.」(每个发布资产旁边都会带一个 .sha256 校验和文件;安装器和更新器都会核对它,对不上就中止安装。)

.sha256 是什么:一段由文件内容算出来的「指纹」,下载完自己再算一遍,两边一样就说明文件在传输途中没被改动过。

但截至 2026-09-13,这句话对稳定版不成立。用 GitHub API 把最近 100 个 release 的资产名单全查一遍,结果是:只有 dev-latest 这一个预发布版发布了 .sha256 伴随文件(16 个资产),其余 99 个稳定版(含 v3.7.0,8 个资产)一个都没有。两条自查命令:

# ① 最近 100 个 release 里,有几个带 sha256 资产
curl -s "https://api.github.com/repos/MHSanaei/3x-ui/releases?per_page=100" | grep -c sha256

# ② 直接问 v3.7.0 有没有校验和文件(预期 404)
curl -sIL https://github.com/MHSanaei/3x-ui/releases/download/v3.7.0/x-ui-linux-amd64.tar.gz.sha256

而 install.sh 对这种情况的处理写在源码里:拿到 HTTP 404 就打印 「No checksum published for this release, skipping verification」(这个发布没有发布校验和,跳过校验)并继续安装。也就是说,装当前的稳定版时,这一步校验是被静默跳过的。

我不删掉官方那句话、而是把它和实测结果并列摆着——因为这是发布流程的实现问题,随时可能被补上;一旦上游补了校验和文件,脚本的校验分支就会真的生效(源码里那段是「下载失败或对不上就中止安装」,只有 404 被容忍)。

⚠️ 那还要不要用脚本安装

要。校验和只是「下载的包有没有被篡改」的一层保险,脚本安装的收益(服务、开机自启、配套的单元文件、管理命令)远大于它。真正值得做的是:装固定版本而不是 latest(这样某天上游推了个有问题的版本,你不会被动升级),并留意安装时的输出里有没有那句 Checksum verified。

方式二:Docker

仓库自带 docker-compose.yml,所以最省事的是直接用它:

docker compose up -d
# 想用内置的 PostgreSQL:
docker compose --profile postgres up -d

也可以直接用预构建镜像。这里有个真实的坑:镜像内置 Fail2ban(一个「按日志自动封 IP」的小工具),它靠 iptables(Linux 内核里的防火墙工具)执行封禁,因此必须有 NET_ADMIN 权能(IPv6 还要 NET_RAW),否则封禁只会被记录而不会真正生效:

docker run -d \
  --cap-add=NET_ADMIN --cap-add=NET_RAW \
  -e XUI_ENABLE_FAIL2BAN=true \
  -v $PWD/db/:/etc/x-ui/ \
  -v $PWD/cert/:/root/cert/ \
  --network=host --restart=unless-stopped \
  --name 3x-ui ghcr.io/mhsanaei/3x-ui:latest

逐项解释这份命令里你会想改的部分:-v $PWD/db/:/etc/x-ui/ 把数据库目录挂到宿主机(容器删了数据还在);-v $PWD/cert/:/root/cert/ 持久化证书;--network=host 让容器直接用宿主机的网络(否则你还得逐个映射入站端口);--restart=unless-stopped 是开机自启。

compose 文件里还有第三个卷值得抄:$PWD/acme/:/root/.acme.sh/——把 acme.sh 的状态持久化(acme.sh 是自动申请和续期证书的工具),容器重建后证书自动续期的定时任务才不会丢。

方式三:手动(不推荐,除非你有理由)

从 release 页面下载对应架构的归档(例如 https://github.com/MHSanaei/3x-ui/releases/download/v3.7.0/x-ui-linux-amd64.tar.gz),解压后自己写系统服务单元。安装脚本做的就是这些步骤的自动化——而它顺手做对了几件手工容易漏的事。

安装脚本实际做了什么

把 install.sh(v3.7.0 对应版本,当前 1854 行)读一遍,它落地的路径如下,这张表建议收藏:

它写的东西路径为什么以后会用到
程序目录/usr/local/x-ui/Xray 二进制、config.json、geo 数据都在这里
管理命令/usr/bin/x-ui你敲的 x-ui 就是这个脚本(从仓库拉 x-ui.sh)
系统服务单元/etc/systemd/system/x-ui.service开机自启、崩溃自动重启由它负责
环境变量文件/etc/default/x-ui改端口/日志级别/数据库后端的落点
数据库/etc/x-ui/x-ui.db你的入站、客户端、全部设置都在这一份文件里
登录凭据摘要/etc/x-ui/install-result.env(权限 600)忘了密码时这里还有一份;也可被云初始化脚本/MOTD 读取

它还做了两件「手工装容易漏」的事:把服务设成开机自启,以及把仓库里对应标签的服务单元文件按发行版(debian / arch / rhel)装进去。脚本注释解释了为什么必须「按标签取配套文件」:

# 源码注释原文:
# Older tags predate some of these files (x-ui.rc arrived in v2.8.4).
# Serving main's copy against an old binary is the mismatch this pinning exists to prevent.

翻译过来就是:拿 main 分支的配套文件去配一个旧版本的二进制,会产生不匹配,所以脚本按你安装的标签去取配套文件(x-ui.rc 是 Alpine 专用的一份),取不到就直接拒绝安装这个标签,而不是凑合装上去。手工安装时最容易漏掉的正是这一点。

05装完先做这五步,再去建入站

顺序是有讲究的:面板本身就是攻击面。建完入站才去改密码,等于把家门开着装修。下面五步做完再谈功能。

1
记下它打印的凭据,并确认能登录

以 root 运行安装脚本。它会问你面板端口(直接回车就随机给你一个)和数据库(选 SQLite 就好),然后生成随机的用户名、密码和访问路径。登录地址形如 http://服务器IP:端口/一长串路径/。忘了的话:

cat /etc/x-ui/install-result.env
# 或者敲 x-ui 进菜单看第 11 项
2
搬离默认端口与默认路径

默认端口 2053、默认路径 / 是扫描器的第一目标。改用非默认端口(菜单 10)与一个长随机路径(菜单 8)。这里有个实测数字:安装脚本在你想随机时会执行 shuf -i 1024-62000 -n 1,也就是在 60,977 个端口里挑一个;路径则用 gen_random_string 18 生成 18 位。

3
改强凭据并开启两步验证

脚本生成的是 10 位随机用户名 + 10 位随机密码(菜单 7 可重设)。两步验证(2FA,登录时除密码外再要一个 6 位动态码)开启时会强制所有人重新登录;忘记时用菜单 7 或 x-ui setting -resetTwoFactor 关掉。注意:改用户名或密码会让所有现有会话失效,并同时关闭 2FA——所以改完记得重新打开。

4
上 TLS,或者先走 SSH 隧道

两条路选一条:给面板配 webCertFile + webKeyFile(菜单 20 领 Let's Encrypt 证书,两项都设置后才会切成 HTTPS),或者在反向代理处终结 TLS(反向代理就是「站在你服务前面的那台机器,替你把 HTTPS 解好再转给面板」)。绝不要在公网用明文 HTTP 暴露面板。如果都还没准备好,用菜单 24 把面板绑到 127.0.0.1,然后从本地建一条 SSH 隧道访问:

ssh -L 8080:127.0.0.1:2053 root@你的服务器IP
# 然后本地浏览器打开 http://127.0.0.1:8080/<你的web路径>/
5
只放行真正需要的端口

SSH、面板端口、订阅端口、入站端口。菜单 23 封装了 ufw(Ubuntu 上常见的防火墙命令行工具)。在启用默认拒绝策略之前,一定先确认 SSH 是放行的,并保留第二个 SSH 会话做测试——否则你会把自己锁在门外。

那串随机凭据到底有多强(我按源码的字符集算了一遍)

安装脚本生成随机串的函数是:openssl rand -base64 (长度×2) 字节 | tr -dc 'a-zA-Z0-9' | head -c 长度。把这条管道在本机跑几轮,确认过滤后留下的字符集正好是 62 个(数字 0–9 + 大写 A–Z + 小写 a–z)。据此可以算出:

作为量级参照:以每秒 100 万次猜测穷举 59.5 bit,期望耗时约 2.6 万年;而 107 bit 已经远超任何暴力手段。所以脚本生成的默认凭据本身不弱——真正把它变弱的是人:把它改成 admin123,或者把路径改回 /。

复核方式(三条,都能自己跑):

# ① 确认字符集正好 62 个,应输出 62
openssl rand -base64 400 | tr -dc 'a-zA-Z0-9' | fold -w1 | sort -u | wc -l

# ② 算 10 位与 18 位的比特数
python3 -c "import math;print(10*math.log2(62), 18*math.log2(62))"

# ③ 算随机端口的取值个数,应输出 60977
python3 -c "print(62000-1024+1)"

内置的登录保护(很多人不知道它已经存在)

机制具体行为对你的影响
暴力破解限制同一 IP/用户名 5 分钟内失败 5 次 → 封锁 15 分钟自己反复试错密码也会被挡,等一刻钟即可
统一错误提示凭据错和 2FA 码错都只提示同一句不泄露「用户名是否存在」
会话有效期sessionMaxAge 默认 360 分钟(6 小时)改凭据会立刻踢掉所有会话
LDAP 回退本地密码校验失败时可由 LDAP 校验企业环境接入已有的目录服务用

06装完之后,命令行里多了个 x-ui:它才是主控制台

装完脚本后,命令行里多了一个 x-ui。不带参数就是交互菜单;带参数就是单次命令——做自动化时用后者,别去模拟菜单输入。

菜单项 0–28(照源码抄的)

菜单的编号和名字直接决定你在教程里看到「菜单 7」时该点哪个,所以原样列出:

#菜单项它到底做什么你会多常用
0Exit Script退出—
1Install从远程脚本(重)安装少
2Update升到最新稳定版经常
3Update to Dev Channel升到滚动开发版(不是稳定版)少
4Update Menu只更新这个菜单脚本本身少
5Legacy Version装指定的旧版本回滚时
6Uninstall卸载(会删数据库)少
7Reset Username & Password重设凭据,可选同时关掉 2FA忘记密码时
8Reset Web Base Path重新随机生成访问路径路径泄露后
9Reset Settings重置面板设置,保留账号配置搞乱时
10Change Port改面板端口偶尔
11View Current Settings打印用户名、端口、路径、证书路径很常用
12–14Start / Stop / Restart控制面板服务偶尔
15Restart Xray只重载 Xray 内核(不动面板)排障时
16Check Status服务状态排障第一步
17Logs Management看调试日志 / 清日志排障时
18–19Enable / Disable Autostart开关开机自启一次性
20SSL Certificate Management用 acme.sh 领证书(域名或裸 IP)、续期、吊销上 TLS 时
21Cloudflare SSL Certificate走 Cloudflare DNS 验证,领通配符证书需要泛域名时
22IP Limit ManagementFail2ban 的安装配置、封禁/解封、看日志用 IP 限制时
23Firewall Managementufw 安装与端口规则装机时
24SSH Port Forwarding Management把面板绑到 127.0.0.1,用 SSH 隧道访问不想暴露面板时
25PostgreSQL Management安装 / 迁移 / 管理 PostgreSQL大部署时
26Enable BBR开关 BBR 拥塞控制(写 /etc/sysctl.d/99-bbr-x-ui.conf)装机时顺手开
27Update Geo Files更新 geoip/geosite 数据路由规则要新数据时
28Speedtest by Ookla跑一次测速少

两个名词一句话解释:BBR 是 Linux 的一种拥塞控制算法(决定「网络堵了该发多快」),在跨国链路上常常能改善速度;geoip/geosite 是两份「IP 和域名属于哪个地区/哪个类别」的对照表,写路由规则时会引用它们。菜单 20 里的 acme.sh 是一个开源脚本,专门替你向 Let's Encrypt 申请证书并按时自动续期——证书过期是「昨天还好今天全断」的头号原因,所以这个自动续期值得留着。

子命令:写进脚本里的那些

下面这些是从 x-ui.sh 的命令分派表里读出来的,全部可用:

x-ui start | stop | restart      # 面板服务
x-ui restart-xray                # 只重载 Xray
x-ui status                      # 状态
x-ui settings                    # 打印当前设置
x-ui enable | disable            # 开机自启
x-ui log                         # 跟踪调试日志
x-ui banlog                      # 看 Fail2ban 封禁日志
x-ui update | update-dev         # 升级稳定版 / 开发版
x-ui legacy                      # 装指定旧版本
x-ui update-all-geofiles         # 更新全部 geo 文件
x-ui migrateDB [file.db|file.dump] [输出]
x-ui pgclient [ver]              # 升级 pg_dump/pg_restore
x-ui install | uninstall
x-ui setup-fail2ban   # 配置 Fail2ban 的 IP 限制规则(菜单 22 的等价命令)

官方文档在这里和代码对不上:migrate-db 不是 x-ui 的子命令

⚠️ 一条我逐行核对过的差异

官方「备份与恢复」文档给的是 x-ui migrate-db --dump /root/x-ui.sql。但读 x-ui.sh 的分派表(case $1 in …)会发现:里面只有 migrateDB,没有 migrate-db;没匹配到的参数会掉进兜底分支,只打印用法说明、什么都不做。真正支持 migrate-db --dump/--restore 的是面板的 Go 二进制本身(main.go 里注册了 --src/--dump/--restore/--out/--dsn 五个参数)。所以三种写法里,前两种可行:

# ① 走包装脚本(推荐):
x-ui migrateDB /root/x-ui.db /root/x-ui.dump
# ② 直接调二进制:
/usr/local/x-ui/x-ui migrate-db --src /etc/x-ui/x-ui.db --dump /root/x-ui.sql
# ③ 文档里的 x-ui migrate-db ... —— 只会打印用法,不干活

另外,migrateDB 在把 SQL 还原成 .db 时会检查目标路径:如果目标是正在使用中的 /etc/x-ui/x-ui.db 且面板正在运行,它会直接拒绝,提示你先 x-ui stop 或换个输出路径。这个检查很值钱——省掉一次「运行时替换数据库文件」的事故。

日志与状态:出事先看这三处

看哪里怎么拿能回答什么问题
服务状态x-ui status 或菜单 16面板活着吗?Xray 活着吗?
面板调试日志x-ui log(实时跟踪)配置为什么没应用?登录为什么被拒?
封禁日志x-ui banlog,或 /var/log/x-ui/3xipl.log我的 IP 是不是被 IP 限制封了?
Xray 自己的日志面板里看,或看数据库里配置的日志路径某个客户端为什么连不上(协议层错误)

日志级别默认是 info,需要更啰嗦时把它调到 debug。查完记得调回去——debug 日志会长得很快。另外面板自带一个清理任务:Xray 的 access/error 日志任一超过 64 MiB 就会被截断(架构文档 §5.4 里的 PruneXrayLogsJob),所以你不用担心它把磁盘写满,但也别指望半年前的访问日志还在。

💡 一个立刻能用的动作

遇到任何「配置改了没生效」的情况,先敲 x-ui restart-xray 看是否恢复。它只重载内核、不停面板——如果这一步有效,说明问题出在配置生成/应用环节;如果无效,问题在配置本身或网络层。这一步能把问题域一刀切成两半。

07文件与目录地图:哪些文件真的在动

这件事在 3x-ui 上比在别的面板上更要紧,因为它的全部状态只有一个数据库文件,而它管着的 Xray 又有自己的配置文件。分不清这两者,备份会备错、排障会找错地方。

一张表管全部

文件 / 目录它是什么你要动它的场景
/etc/x-ui/x-ui.db全部状态:入站、客户端、设置、API 令牌(SQLite)备份与恢复;换机器迁移
/etc/x-ui/install-result.env安装时生成的凭据摘要(600 权限)忘了面板账号密码
/etc/x-ui/node_token_key.json节点令牌加密用的密钥环(600 权限)只有你开了令牌加密才存在
/usr/local/x-ui/bin/config.jsonXray 的配置,由面板每次改动重新生成排障时看「面板到底给 Xray 写了什么」
/usr/local/x-ui/bin/xray-linux-amd64Xray-core 可执行文件(arm 架构叫 xray-linux-arm32)手动执行 x25519 生成密钥等
/usr/local/x-ui/bin/geoip.dat · geosite.dat路由规则用的地理数据库路由里写 geosite:category-ads-all 靠它
/etc/systemd/system/x-ui.service系统服务单元看它是怎么被拉起来的
/etc/default/x-ui环境变量文件(数据库连接串、日志级别等)改数据库后端、调日志
/var/log/x-ui/日志目录(XUI_LOG_FOLDER 的默认值)出事第一个该看的地方
/var/log/x-ui/3xipl.log · 3xipl-banned.logFail2ban 的 IP 限制日志与被封记录某人被「IP 限制」挡在外面时
/root/cert/<域名>/acme.sh 申请到的证书(fullchain.pem + privkey.pem)给面板或入站配 TLS
/root/.acme.sh/acme.sh 的状态目录Docker 部署时务必挂卷持久化
📌 两个路径的由来(不是猜的)

config.json 的位置来自源码:GetConfigPath() 返回 GetBinFolderPath() + "/config.json",而 bin 目录默认是相对可执行文件的 bin;服务单元里写死了 WorkingDirectory=/usr/local/x-ui/、ExecStart=/usr/local/x-ui/x-ui。所以完整路径就是 /usr/local/x-ui/bin/config.json。/var/log/x-ui 则是 GetLogFolder() 在非 Windows 平台下的返回值。

数据库 vs 配置打印件:一条必须分清的分界线

x-ui.db
数据库文件:唯一真相源
面板状态
默认是 SQLite,一个文件装下你的全部工作成果。你在面板上把入站、客户端、设置、API 令牌改来改去,改的都是它。
怎么用

备份就是复制这个文件:

cp /etc/x-ui/x-ui.db /root/x-ui-backup-$(date +%F).db

恢复要先停服务(x-ui stop)、把文件放回去、再启动。

什么场景用

换服务器、重装系统、跨大版本升级之前——跨大版本必须先备份,因为新版本会对库做结构迁移(迁移就是把旧的表结构调整成新版本要的样子,通常不可逆)。

注意与边界

① 恢复时尽量换回同一主版本,跨主版本要让面板自己跑迁移,而不是硬套旧结构。② 如果后端换成了 PostgreSQL(另一种数据库服务),这个文件就不是真相源了,备份对象变成那个库。③ 备份要放在服务器之外——机器没了,同机备份一起没。

bin/config.json
Xray 配置:生成物,不是真相源
派生文件
面板根据数据库当前状态渲染出来的一份完整 Xray 配置,每次改动都会被重写。
怎么用

排障时拿它对照:面板里显示的和 Xray 实际拿到的是否一致(cat /usr/local/x-ui/bin/config.json)。想手改 Xray 的原始 JSON(出站、路由、DNS),不要改这个文件——去面板的 Xray 设置里改,那才是会被持久化的地方。

注意与边界

直接编辑这个文件的结果是:下次任何一次改动都会把它覆盖回去,你会得到一个「明明改了却没生效,过一会儿又自己变回去」的诡异现象。它同时是 Telegram 备份功能会一起发出去的两样东西之一(另一样是数据库)。

✗ 错误做法:手改 config.json 当配置源
# 想加一条路由规则
vim /usr/local/x-ui/bin/config.json
systemctl restart x-ui
# 过一会儿规则没了——被面板重新渲染覆盖

数据库没变,面板下一轮渲染照样按旧状态写出新文件。

✓ 正确做法:改在会被持久化的那一层
# 面板 → Xray 设置 → 直接编辑配置模板
# 保存后面板重载 Xray
# 验证生成结果:
cat /usr/local/x-ui/bin/config.json

改的是数据库里的模板,渲染出来的 config.json 自然带上它。

08最小例子:十分钟从零到客户端连上

下面这条路径是建议的第一次上手顺序:先把安全和身份做完,再建入站。每一步都给了「点哪里」和「填什么」。

1
装完并登录(见 04 / 05)

拿到形如 http://服务器IP:端口/一长串路径/ 的地址,用脚本打印的用户名密码登录。

2
先加固,再建任何入站

改凭据(菜单 7)、确认网页路径够长(菜单 8)、开两步验证、把面板放到 TLS 后面。此时面板还是明文 HTTP 的话,优先用 SSH 隧道访问,别裸奔在公网上。

3
建第一个入站:VLESS + REALITY

Inbounds → Add:协议(Protocol)选 VLESS,端口填 443,Security 选 reality,Transport 保持 TCP。这一步不需要你有域名,也不需要证书。

4
填 dest / SNI / 密钥 / shortId

dest 填一个真实存在、支持 TLS 1.3 与 HTTP/2、你和服务器都访问得到的站点,例如 www.microsoft.com:443;SNI 填该站点证书覆盖的名字(www.microsoft.com);密钥对让面板生成(它内部调的是 Xray 的 x25519);shortId 也生成一个十六进制串。

5
把 flow 设成 xtls-rprx-vision

注意:flow 设在客户端条目上(入站里的客户端那一行),不是在入站级别设一个全局开关。这是新手最常踩的一个坑。

6
加客户端,拿分享链接

入站里加一个客户端,Email 随便起个唯一名(它是这个用户的身份键),然后复制它的分享链接或二维码,导入 v2rayNG / Hiddify / Mihomo 之类的客户端。

7
放行端口,再验证

防火墙放行 443/tcp(x-ui 菜单 23 包了 ufw)。然后在面板的客户端列表里看在线状态与流量是否开始计数——计数动了,就是通了。

# 在服务器上确认 443 真的在监听
ss -lntp | grep 443
# 确认本机防火墙放行了它(如果用了 ufw)
ufw status

它生成的配置长什么样

服务端那段 streamSettings(Xray 配置里管「传输与安全」的那一块)大致如下,这是最小可用的一部分,其余字段面板会补默认值:

{
  "network": "tcp",
  "security": "reality",
  "realitySettings": {
    "dest": "www.microsoft.com:443",
    "serverNames": ["www.microsoft.com"],
    "privateKey": "<x25519 私钥,只留在服务器上>",
    "shortIds": ["<十六进制 short id>"],
    "fingerprint": "chrome"
  }
}

而给客户端的链接里,携带的是公开参数:

vless://<uuid>@<server>:443?security=reality&pbk=<公钥>&sid=<short-id>&sni=www.microsoft.com&fp=chrome&spx=%2F&flow=xtls-rprx-vision#my-reality

五个参数记一下就够了:pbk 是公钥、sid 是 short id、sni 是对外声称的域名、fp 是客户端指纹、flow 是 xtls-rprx-vision。这条链接本身就是凭据,等于密码。

手工生成一对密钥(不使用面板时)

REALITY 用的是一对「私钥 + 公钥」。面板会替你生成,但知道底层命令在排障时有用:

/usr/local/x-ui/bin/xray-linux-amd64 x25519
# 输出 Private key 与 Public key;私钥填服务端,公钥进分享链接的 pbk=
⚠️ REALITY 的三个真实门槛

① dest 选得不好会暴露:它必须是真实存在、支持 TLS 1.3 + HTTP/2、在你所在地区没被封的站点;SNI 必须与目标站点的证书匹配,否则握手就露馅。② 私钥永不出服务器,客户端只拿公钥。③ 「最小客户端版本」留空不等于不限制——Xray-core 会回退到内置的最低版本(官方文档写的是当前 26.3.27),这意味着 Mihomo / sing-box 这类第三方内核即使配置完全正确也可能连不上,表现为客户端超时,只有基于 Xray-core 的客户端能连。要兼容它们才填 1.0.0,代价是同时放行过时的 TLS 指纹。

连上之后怎么确认「真的通了」

四个信号,按可信度从高到低:

计数 +客户端列表里流量数字开始增长
在线该客户端显示在线状态(连过就会亮)
出口变在客户端设备上查自己的公网 IP,已不是本地 ISP 的
日志静Xray 错误日志没有持续刷握手失败

前两个是面板给的,后两个是你自己测的。如果面板显示一切正常但网页打不开,去核对客户端的传输与安全设置是否与服务端逐字一致——这是「连上了但没网」最常见的原因。

09入站:配置的最小单位,你要反复回来改的就是它

Inbound
入站:一个监听器
配置对象
入站 = 「在本机某个端口上,用一种协议 + 一种传输方式,接受客户端连接」这件事的完整描述。你的日常工作十有八九就是创建入站、往入站里加客户端。
是什么 / 作用

它是面板里的一个配置对象,对应 Xray 配置里 inbounds[] 的某一项。作用是把「协议、端口、传输、安全、用户列表、限额」打包在一起管理。

怎么用(最小可用步骤)

Inbounds → Add → 填备注(remark,会出现在分享链接备注里)→ 选协议 → 选端口与监听地址 → 选传输方式与安全层 → 加客户端 → 可选地设流量上限/到期/重置周期。

什么场景用

每个「对外提供服务的入口」对应一个入站。常见拆法是:443 上一个主入站(VLESS+REALITY),443 上再挂回落子入站给别的协议共用同一个端口,或者另开一个 UDP 端口给 Hysteria2。

注意与边界

① 入站的总流量上限和客户端上限是两层独立限制;② 重置周期可以选 never(默认)/ hourly / daily / weekly / monthly,选 monthly 还能指定每月 1–31 日,当月没有那一天时落在当月最后一天;③ 端口冲突会在保存时被检测。

回落:让一个 443 端口服务多个协议

回落(fallback)是 3x-ui 里最能省事、也最容易被忽略的功能:把一个 TLS 端口上「握手指纹不匹配」的流量,转发给另一个子入站——于是 443 可以同时是 VLESS 和 Trojan,甚至转发给本机的 Nginx 伪装站。

但它有明确的适用条件,官方文档写得很清楚:主入站必须是 VLESS 或 Trojan、必须用裸 TCP、安全层必须是 TLS 或 REALITY。每条回落规则指向一个子入站,可以按 path(路径)、alpn(协议协商结果)、dest(目标)匹配。而且——这点很好——回落子入站的分享链接会被自动改写,对外公布主入站的地址、端口和 TLS,你不需要手工改链接。

✗ 错误做法:开三个端口各跑一个协议
443  VLESS + TLS
8443 Trojan + TLS
2096 面板
# 结果:防火墙要开三个口,
# 屏蔽方看到的端口特征明显

端口越多,暴露面越大,也越容易被按端口做策略。

✓ 正确做法:主入站 + 回落共用 443
443  VLESS + REALITY (主入站)
  └─ fallback → Trojan 子入站
  └─ fallback → 本机 Nginx(伪装站)
# 只开一个端口,子入站链接自动改写

只暴露一个端口;前提是主入站用 VLESS/Trojan + 裸 TCP + TLS/REALITY。

10协议怎么挑:一张表回答「我这个场景选哪个」

面板支持的协议比大多数人用到的多。与其背清单,不如按「你要解决什么」来挑——下表按「定位 / 什么时候选它 / 别当什么用」三列给。

协议它的定位什么时候选它 / 别当什么用
VLESS轻量,官方标注为推荐;是 REALITY + XTLS-Vision 的基础默认首选。别指望它自己提供加密——它靠外层的 TLS/REALITY
VMess较老,但客户端支持面最广需要兼容非常旧的客户端时用;新部署没理由选它
Trojan基于 TLS,支持 XTLS 与回落想「看起来就是一个正常 HTTPS 站点」时;同样需要证书
Shadowsocks含 Shadowsocks-2022(2022-blake3-*)加密方式要极简、客户端随处可用时。注意 2022-blake3-chacha20-poly1305 只支持单用户
WireGuard现代隧道协议要一个「整机 VPN」而不是「代理端口」时
AmneziaWGWireGuard 的抗 DPI 分支(混合垃圾包、随机填充、改写协议魔数)明文 WireGuard 被封、但换个指纹能过时。它跑在面板进程内(用户态网络栈),不需要内核模块、DKMS 或额外软件包
Hysteria2基于 QUIC 的传输,协议名在面板里选 hysteria,生成的链接是 hysteria2://丢包严重的链路上体验最好(走 UDP,不排队等重传)。防火墙要放行 UDP
HTTPHTTP 代理临时给浏览器/工具用;不是长期方案的默认选择
Mixed (SOCKS/HTTP)一个监听器同时说 SOCKS 和 HTTP本机客户端把服务器当出口时非常顺手
Dokodemo-door / Tunnel端口转发 / 流量重定向做转发和桥接;它没有传输方式选择器
MTProtoTelegram 的专用代理协议,由内置的 mtg 进程提供(不是 Xray)只给 Telegram 用时最省事;每个客户端有独立的伪装 TLS 密钥(FakeTLS secret)
TUN把流量交给系统网络栈处理特殊场景,普通部署用不到

三个容易绕晕的命名

💡 Hysteria2 在内部不是一个独立协议

它是「传输版本设为 2 的 hysteria 协议」,面板只是替你生成 hysteria2:// 链接。所以你在文档里搜「hysteria」找不到独立条目,别以为漏了。

💡 MTProto 不由 Xray 提供

你建 MTProto 入站时,面板会额外拉起一个叫 mtg 的进程来负责它。所以排障时如果发现服务器上多了一个你不认识的进程,先看看自己有没有建 MTProto 入站。

💡 DPI 是什么

DPI 是「深度包检测」,指网络中间设备不只看你连了哪个 IP,还会看数据包长什么样来判断你在干什么。抗 DPI 的意思就是「让流量看起来像普通网站流量」。REALITY、AmneziaWG、FinalMask 这些机制都是为这件事服务的。

11传输层与安全层:真正决定「像不像正常流量」的一层

协议决定「怎么认证」(怎么证明你是你),传输决定「数据包怎么装」(一次连接里数据长什么样),安全层决定「怎么加密与伪装」。三者是正交的(各管各的,可以自由组合),所以组合数量看起来吓人——但面板只提供有效组合,把不合法的搭配直接藏起来了。

七种传输方式

传输设置键什么时候合适 / 代价是什么
TCP (Raw)tcpSettings开销最低,是 REALITY + XTLS-Vision 和回落的基础。想用 Vision/回落,就得在它上面
mKCPkcpSettings基于 UDP 的可靠传输,用带宽换丢包链路上的延迟。承载不了 TLS/REALITY,只能靠 FinalMask 混淆
WebSocketwsSettings过 CDN 和 HTTP 反向代理最顺,兼容性极佳。代价是多一跳、多一点开销
gRPCgrpcSettings基于 HTTP/2,多路复用好,过 Nginx 干净。serviceName 相当于一条秘密路径
HTTPUpgradehttpupgradeSettings一次性的 HTTP/1.1 升级握手,比完整 WebSocket 更轻;因此没有心跳字段
XHTTPxhttpSettings较新的流多路复用 HTTP 传输,对 CDN 友好且支持 REALITY;mode 里 packet-up 最兼容 CDN、stream-* 延迟更低
HysteriahysteriaSettings基于 QUIC,只能配 Hysteria2 协议

三个名词一句话带过:CDN 是「分布在全世界的缓存节点,用户连最近的节点,由节点回源到你的服务器」;多路复用是「一条连接里同时跑好几股数据,不用为每个请求重新握手」;QUIC 是跑在 UDP 上的新一代传输协议,把握手和加密揉在一起。

安全层的适用矩阵

安全层能配哪些传输能配哪些协议你要注意什么
TLStcp、ws、grpc、httpupgrade、xhttpVLESS、VMess、Trojan、Shadowsocks要有证书;证书到期会全线掉线
REALITYtcp、grpc、xhttpVLESS、Trojan不需要你自己的证书,但选错 dest/SNI 会露馅
none其余情况—等于明文,仅限本机/内网链路测试

两条例外记一下:mKCP 和 Hysteria 没有独立的 TLS/REALITY 层——mKCP 明文运行(用 FinalMask 混淆),而 Hysteria 本身就是 QUIC/TLS。

XTLS-Vision 与后量子加密

xtls-rprx-vision 是一种流控(flow),它又快又抗 DPI。可用条件有两个:裸 TCP + TLS/REALITY 的经典组合,或者 XHTTP 且启用了 VLESS 加密(ML-KEM / mlkem768x25519,也就是所谓「后量子加密」——用一类新的数学难题来加密,目的是防住未来的量子计算机)。

⚠️ Vision 的 flow 设在哪,是新手最常见的错

它设在 VLESS 客户端条目上,不是入站级别的开关。你在入站上找不到一个「开启 Vision」的勾选框——因为它本来就该填在客户端那一行(flow = xtls-rprx-vision),分享链接里的 flow= 参数也来自那里。

✗ 错误做法:在 CDN 后面用 REALITY
入站:VLESS + TCP + REALITY
前置:Cloudflare 橙云(HTTP 层代理)
# 结果:REALITY 的握手机制
# 需要看到真实 TLS 握手,
# 而 CDN 已经替你终结了 TLS

REALITY 借用真实站点的 TLS 握手,中间夹一层 CDN 就把这个前提破坏了。CDN 场景请用 TLS + WebSocket/HTTPUpgrade/XHTTP。

✓ 正确做法:按有没有中间层来选
直连(无中间层):
  VLESS + TCP + REALITY + Vision

过 CDN / 反向代理:
  VLESS + WS 或 XHTTP + TLS
  (证书用 CDN 的或自己签)

一句话:有中间层就别用 REALITY,让那一层做它擅长的事。

12组合怎么搭:四套推荐 + 三种别用

协议 × 传输 × 安全层的组合很多,但实际值得用的就那几套。下面四套覆盖了绝大多数场景,按「你的约束是什么」来挑。

组合 A:VLESS + TCP + REALITY + Vision(无域名、无证书的首选)

项值为什么
协议 / 端口VLESS / 443443 是最不显眼的端口
传输 / 安全TCP / REALITY不需要你自己的证书,借用真实站点握手
flowxtls-rprx-vision抗 DPI,且性能好
客户端要求基于 Xray-core 的客户端第三方内核可能被最小版本门槛挡下

它解决什么:你没有域名、不想管证书,但仍要让流量看起来像访问某个正常网站。什么时候别用:你前面垫了 CDN 或四层转发(见上一节的对比)。

组合 B:VLESS/Trojan + TLS + XHTTP 或 WebSocket(要过 CDN)

把真实服务器地址藏在 CDN 后面,客户端连 CDN 边缘节点。这里用 Host 覆盖(受管主机) 告诉订阅「对外公布的地址是 CDN 域名而不是源站 IP」——这正是「受管主机」这个功能存在的理由(18)。

代价:多一跳,延迟上升;CDN 免费套餐对非 HTTP 流量有条款限制,需要你自己确认合规性。

客户端填订阅地址时,如果 CDN 要求特定 Host 头,面板里对应的是「请求头」一类的字段,例如:

# 受管主机里给某个入口单独指定 Host 与 SNI
Host: cdn.example.com
SNI:  cdn.example.com
Path: /ws        # WebSocket / XHTTP 的秘密路径

组合 C:Shadowsocks-2022 / Hysteria2(要极简或要抗丢包)

# Hysteria2 客户端拿到的链接形态(端口必须 UDP 放行)
hysteria2://<密码>@<服务器>:8443/?sni=<域名>&insecure=0#hy2

组合 D:WireGuard / AmneziaWG(要整机隧道)

不是「给浏览器挂个代理」,而是把设备的全部流量送进隧道。AmneziaWG 额外做混淆,参数含义如下:垃圾包(Jc/Jmin/Jmax)、握手填充(S1/S2)、改写消息类型魔数(H1–H4)。它跑在面板进程内、用户态网络栈上,所以容器里和裸机上行为一致。

# AmneziaWG 混淆参数(两端必须一致)
Jc = 4        # 每个包前塞几个垃圾包
Jmin = 40     # 垃圾包最小字节
Jmax = 70     # 垃圾包最大字节
S1 = 50       # 握手包填充长度
S2 = 100
H1 = 5        # 消息类型魔数,必须 > 4 且四个互不重叠
H2 = 6
H3 = 7
H4 = 8
⚠️ 手改混淆参数时的三个硬约束

① H1–H4 必须互不重叠且大于 4(1–4 是 WireGuard 保留的消息类型);② S1 + 56 不能等于 S2(否则两类包一样大,底层实现会拒绝);③ 3.1 版才有的参数需要 3.1 版客户端——旧客户端理解不了,把 3.1 字段清空才是兼容旧客户端的做法。参数两端必须一致,面板生成的随机值不要手抄错。

三种别用的组合

✗ mKCP + TLS
mKCP 承载不了 TLS/REALITY,面板也不会给你这个选项。要混淆它请用 FinalMask 的 UDP 掩码。
✗ REALITY + 你自己的证书
REALITY 的意义就是「没有自己的证书」。想用自己的证书,那是 TLS 组合,不要混着配。
✗ 明文 HTTP 的面板 + 弱口令
这不是协议组合,是事故组合。面板凭据在明文 HTTP 上等于公开。

13客户端与限额:真正决定「谁能用、能用多少」的地方

入站是「门」,客户端是「钥匙」。在当前版本的 3x-ui 里,客户端已经是一等记录——一个客户端可以同时关联到多个入站,并按客户端单独统计流量。这一点跟老版本差别很大,老教程里「一个用户在每个入站里各建一份」的做法已经过时。

Client
客户端:由 Email 唯一标识的用户
配置对象
Email 是它的身份键(用于统计和查询),不是给人看的备注。凭据字段随协议变:VLESS/VMess 是 UUID(一串随机标识符),Trojan/Shadowsocks 是密码,Hysteria2 是 auth。
关键字段速查
字段适用为什么重要
Email全部唯一标识;重复了会出乱子
ID (UUID) / Password / Auth按协议凭据本体,泄露即等于账号泄露
FlowVLESS填 xtls-rprx-vision 才能用 Vision
Limit IP全部限制同时连接的源 IP 数(靠 Fail2ban 强制执行)
Total (GB)全部配额;用完客户端被禁用
Expiry全部到期后停止工作
Reset全部按天的自动续期周期(滚动重置配额)
Sub ID全部订阅地址里那一段随机串
Telegram ID全部把客户端绑到 TG 用户,实现自助查询
Group / Comment全部分组与备注,便于批量筛选
HWID 限制全部限制同一客户端的设备数;越限可在面板里单独移除某台设备
注意与边界

① 触发流量或到期上限会禁用客户端;面板默认还会顺带重启 Xray(restartXrayOnClientDisable 默认开启)——如果你的用户很多,这个重启值得留意。② Limit IP 依赖 Fail2ban:Docker 里没给 NET_ADMIN 的话,限制只会被记录、不会真的执行。③ 分享链接里含有凭据,按密码对待,泄露就轮换。④ 新版还支持日历月续期,以及限制单个客户端的自动续期次数。

什么场景用批量操作

面板支持批量创建 / 启用 / 禁用 / 删除 / 关联解除关联 / 重置流量 / 调整(加天数、加字节、设 flow)。维护操作还能一键删掉已耗尽(配额或到期用尽)和孤立(没关联任何入站)的客户端——清理僵尸用户时很省事。

✗ 错误做法:一个用户在每个入站各建一遍
alice@vless-443   配额 100GB
alice@trojan-8443 配额 100GB
# 两个 Email → 两套统计
# 用户实际能用 200GB,你还以为限住了

同一人多份记录会让「用了多少、还剩多少」彻底失真,也会让订阅里出现重复条目。

✓ 正确做法:一个客户端,关联多个入站
alice@example.com  配额 100GB
  ├─ 关联 vless-443
  └─ 关联 trojan-8443
# 一套统计、一条订阅、一个到期日

用「关联到入站」表达多入口,用 Email 表达人。统计与限额才是准的。

14订阅服务器:把一堆链接变成一个地址

分享链接是一条一条发;订阅是「一个 URL 装下这个客户端的全部配置」。客户端定期刷新它,于是你改入站、加节点、换域名,用户不用重新导入任何东西。

sub :2096
订阅服务器:与面板分开的第二个 HTTP 服务
面板组件
它默认开启,监听端口与面板不同(默认 2096)。地址形如 https://<你的域名>:2096/<subPath>/<subId>,最后那段 <subId> 就是客户端的 Sub ID。按客户端生成的完整订阅地址在客户端详情里可以直接复制。
三种输出格式,按路径区分
格式路径何时用
原始链接(base64 编码)subPath绝大多数客户端;由 subEncrypt 开关控制是否做 base64 编码
JSON(Xray 配置)subJsonPath需要直接把配置喂给内核时
Clash / Mihomo YAMLsubClashPathClash 系客户端

名词解释:base64 是把任意内容变成一串字母数字的编码方式(不是加密,只是换一种写法),很多客户端要求订阅内容先做这一步;YAML 是另一种「缩进式」的配置写法,Clash 系客户端吃这种。

还有一个实用细节:对 subPath 发 Accept: text/html(或加 ?html=1),返回的是给人看的信息页,而不是给机器吃的配置——浏览器里点开订阅链接时看到的就是这个。

# 自己看看订阅服务器会返回什么(换成你的域名/路径/ID)
curl -s "https://你的域名:2096/<subPath>/<subId>" | head -5
# 要人看的页面:
curl -s "https://你的域名:2096/<subPath>/<subId>?html=1" | head -20
响应头里有什么

Subscription-Userinfo 携带已用/总量/到期时间(total=0 表示不限量),Profile-Update-Interval 是建议的刷新间隔(来自 subUpdates,默认 12 小时)。这些正是客户端能显示「剩余流量」的原因。

# 看响应头,验证用量与刷新间隔真的发出去了
curl -sI "https://你的域名:2096/<subPath>/<subId>" | grep -i "subscription-userinfo\|profile-update"
注意与边界

① 只有 VLESS / VMess / Trojan / Shadowsocks / Hysteria2 的已启用入站会进订阅,其它协议不出现。② 订阅服务器要单独上 TLS(配 subCertFile/subKeyFile 或走反向代理),否则配置在传输过程中是明文的。③ 设了 subDomain 后它只响应该 Host。

⚠️ 订阅链接就是一个凭据

拿到订阅 URL 的人,等于拿到了这个客户端的全部配置(含凭据)。别把订阅链接贴进公开的群或工单系统;万一泄露,最省事的处置是换掉那个客户端的 Sub ID——旧链接立即失效。

16出站与路由:决定流量「从哪出去」

入站负责收,出站负责发。默认只有两个出站:freedom(直连到目标)和 blackhole(丢弃,用来挡广告和种子)。要让某些流量走别的线路,就需要出站 + 路由规则。

{
  "outbounds": [
    { "tag": "direct", "protocol": "freedom", "settings": {} },
    { "tag": "block",  "protocol": "blackhole", "settings": {} }
  ]
}

tag 是「这段配置的名字」,路由规则靠它指认「这条流量交给谁」。名字随便起,但必须和规则里写的一致。

路由规则的核心语义:自上而下,第一个匹配者胜出

每条规则是一个 field 匹配器,可以按 domain、ip、port、network、protocol、inboundTag、sourceIP 等匹配,然后指向一个 outboundTag 或 balancerTag。因为先匹配先赢,具体的规则一定要放在通用规则上面——顺序错了,后面那条永远不生效。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      { "type": "field", "domain": ["geosite:category-ads-all"], "outboundTag": "block" },
      { "type": "field", "ip": ["geoip:private"], "outboundTag": "direct" }
    ]
  }
}

上面这两条的读法是:先把「广告域名」丢进 block,再把「私有网段」走 direct 直连。每一条规则的第三个字段就是「匹配到之后交给谁」。

三条常用出口

均衡器与健康监视器

策略怎么选还要配什么
random每个连接随机取一个不用
roundRobin轮流取不用
leastPing延迟最低的需要 observatory
leastLoad采样负载最稳的需要 burstObservatory

后两种策略的监视器要放在配置的顶层,不能塞进 routing 里面——这是很常见的一个「配置看着对、但均衡器不工作」的原因。

⚠️ 外部 URL 有 SSRF 防护,别以为是你写错了

让面板去拉取远程出站/订阅时,默认会阻止私有与内网地址(这类防护叫 SSRF 防护,指防止程序被你骗去访问它本不该访问的内部地址),除非你按来源显式放行。所以「填了 127.0.0.1 的订阅地址却拉不到」是设计使然,不是 bug。

17多节点与受管主机:一台面板管多台机器

两个功能经常一起被提起,但解决的问题完全不同:节点是「管另一台机器的 3x-ui」,受管主机是「同一个入站,对外公布多个地址」。

节点:通过 API 管理另一个面板

在主面板添加节点时填:名称(如 de-fra-1)、https/http、地址与端口、对方的面板路径、API 令牌(一串长随机字符串,让主面板能免密调用对方的管理接口,所以它等于对方的密码)、TLS 校验模式(verify 默认 / skip / pin 固定证书指纹 / mtls),以及同步哪些入站。之后主面板每隔几秒发一次心跳(定期打个招呼确认对方还活着),更新节点在线状态,并在掉线时发 node.down 事件(可推到 Telegram)。

三个值得知道的机制:

openssl rand -base64 32

受管主机:一个入站,多个对外地址

附加在入站上的「覆盖端点」。订阅时,每个启用的主机会用自己的地址、端口、TLS、SNI、Host 头、路径各渲染出一条额外链接。典型用途是:让源站 IP 保持私密(对外公布 CDN 地址)、按地区公布不同端点、为不同端点单独调 ALPN/指纹/ECH/mux。每条主机可以排除特定订阅格式、限定到特定节点。

mTLS:把「拿令牌」升级为「拿证书」

1
主面板取 CA

拿到节点认证用的 CA 证书(CA 指「签发证书的机构」,这里指面板自建的一个小机构;它的私钥永远不离开面板)。

2
节点信任该 CA

粘贴到节点的「受信任的 CA」设置里,下次重启节点时生效。

3
节点切到 mtls

把 TLS 校验模式改为 mtls(mTLS 指「双向验证」,不但客户端验服务器,服务器也验客户端;前提是走 https)。之后主面板出示客户端证书,API 令牌变为可选。

💡 真实客户端 IP 在多节点下不用额外配置

入站的 streamSettings(包括 sockopt 里的真实 IP 相关字段)会原样推送到子节点,所以节点上的 Xray 自己就记录到了真实访问者 IP;主面板大约每 10 秒拉一次各节点的按客户端 IP。这意味着你在主面板看到的就是真实的访客 IP,而不是中转地址。

18安全加固:按这个顺序做,别跳步

代理面板是高价值目标:它同时是「入口」和「凭据库」。下面的顺序是有讲究的——先减少暴露面,再加强认证,最后才谈功能。(第 1–5 步与 05 是同一件事的两处表述:那里是「装完先做什么」,这里是「为什么按这个顺序」。)

1
搬离默认端口与默认路径

默认端口 2053、默认路径 / 是扫描器的第一目标。改用非默认端口(菜单 10)与一个长随机路径(菜单 8)。

2
改强凭据并开启 2FA

改完记得重新打开 2FA——改凭据会顺手把它关掉(见 05)。

3
上 TLS

给面板配证书,或在反向代理处终结 TLS。绝不要在公网用明文 HTTP 暴露面板。

4
只放行真正需要的端口

SSH、面板端口、订阅端口、入站端口。启用默认拒绝之前先确认 SSH 已放行。

5
配好 IP 限制与 Fail2ban

用菜单 22 管理。jail(Fail2ban 里的一套「监控哪份日志、触发后怎么办」的配置,这个名字来自「监狱」)名是 3x-ipl,默认封禁 30 分钟;封禁覆盖所有 TCP/UDP,但不包括你的 SSH 端口和面板端口——这个设计是为了不把你锁在门外。

6
打开 BBR,然后保持更新

菜单 26 写系统参数(net.ipv4.tcp_congestion_control = bbr、net.core.default_qdisc = fq),在拥塞链路上通常有提升。最后这一条才是长期的:定期 x-ui update,安全修复跟着版本走。

# 确认 BBR 真的生效(应看到 tcp_congestion_control 为 bbr)
sysctl net.ipv4.tcp_congestion_control

真实客户端 IP:CDN 后面最容易忽略的一环

入站前面垫了 CDN 或四层中转时,Xray 看到的源 IP 是中转方的——于是「在线 IP 列表」和「IP 限制」双双失效。3x-ui 在入站的「传输设置 → Sockopt」里给了两个预设。先解释这两个字段名:trustedXForwardedFor 的意思是「我信任谁在请求头里写的来访者 IP」,它填的是那个头的名字(Cloudflare 用的是 CF-Connecting-IP);acceptProxyProtocol 的意思是「接受上游用 PROXY 协议把真实 IP 附在连接最前面告诉我」。

预设它设置的字段用在什么前面
Cloudflare CDNtrustedXForwardedFor = ["CF-Connecting-IP"]Cloudflare 橙云(HTTP 层);仅 WebSocket / HTTPUpgrade / XHTTP 生效
L4 relay / Spectrum (PROXY)acceptProxyProtocol = trueHAProxy / gost / nginx stream / Spectrum;TCP、WS、gRPC、HTTPUpgrade、XHTTP 都行,mKCP 不行
⚠️ 两个机制只能用其一,且上游必须配合

它们是独立的:PROXY 协议从四层头部读真实 IP,trustedXForwardedFor 从 HTTP 请求头读。在 WS/HTTPUpgrade/XHTTP 上,Xray 最后才应用 HTTP 头——所以残留的 trustedXForwardedFor 会覆盖并抵消 PROXY 协议的设置。面板的预设是互斥的、会自动清掉另一个字段。另外:只有当入站确实在一个可信代理后面时才开 trustedXForwardedFor,否则客户端可以自己伪造这个头来冒充源 IP。两个字段都是服务端的,会被从订阅输出里剥离,不会到达客户端。

✗ 错误做法:Docker 里只映射端口
docker run -d -p 2053:2053 \
  ghcr.io/mhsanaei/3x-ui:latest
# fail2ban 记录到封禁,但 iptables
# 没有权限执行 → 限制形同虚设

面板里 IP 限制看起来「配好了」,日志里也有记录,但攻击者不会被真的挡住。

✓ 正确做法:给足权能,或干脆关掉它
docker run -d \
  --cap-add=NET_ADMIN --cap-add=NET_RAW \
  -e XUI_ENABLE_FAIL2BAN=true \
  ghcr.io/mhsanaei/3x-ui:latest
# 不用 IP 限制就设 false 并去掉 cap_add

要这个功能就给权能;不要就明确关掉,别留一个「以为在工作」的假象。

19备份、升级、卸载:三件迟早要做的事

备份:只要两样东西

全部配置 = 数据库 + 证书(/root/cert/,如果你用了 TLS)。最简做法就是复制文件:

# 数据库(必须)
cp /etc/x-ui/x-ui.db /root/x-ui-backup-$(date +%F).db
# 证书目录(用了 TLS 就要)
tar czf /root/cert-backup-$(date +%F).tar.gz /root/cert/

面板概览页也能下载备份;配了 Telegram 机器人并开启 tgBotBackup 的话,它会在周期性报告里附上数据库 + Xray 配置,于是你天然拥有一份服务器之外的副本(管理员也能在机器人菜单里按需拉一份)。

还有一种「可读、可搬」的形式——把 SQLite 导成纯文本 SQL:

# 走包装脚本(注意子命令是 migrateDB)
x-ui migrateDB /etc/x-ui/x-ui.db /root/x-ui.dump
# 或直接调二进制
/usr/local/x-ui/x-ui migrate-db --dump /root/x-ui.sql
/usr/local/x-ui/x-ui migrate-db --restore /root/x-ui.sql --out /root/restored.db

恢复的顺序是:先 x-ui stop,把备份文件放回 /etc/x-ui/x-ui.db,再 x-ui start。别在面板运行时替换数据库文件。

升级

你要升到怎么做代价 / 注意
最新稳定版菜单 2 或 x-ui update;重跑安装脚本也是原地升级推荐路径;升级保留数据库与设置
开发版菜单 3 或 x-ui update-dev逐提交构建,不是稳定版;别用在你要长期不动的机器上
某个旧版本菜单 5(Legacy Version)回滚用;同样要先备份
Dockerdocker compose pull && docker compose up -d不要用 x-ui update 升容器里的面板

跨大版本升级前一定先备份——新版会对数据库做结构迁移,回退需要旧库。

🔍 关于「开发版到底新不新」:我查了 API,说个反直觉的结论

官方把 dev-latest 描述为「来自 main 的最新逐提交预发布版本」。但 GitHub API 里这个发布对象的 published_at 显示为 2026-06-24,比稳定版 v3.7.0 的 2026-08-24 还早;而它所有资产的 updated_at 却是 2026-09-12(随上游每次推送更新)。也就是说:这个滚动发布的 published_at 字段不能用来判断它有多新,得看资产的更新时间。复核方式:

curl -s https://api.github.com/repos/MHSanaei/3x-ui/releases/tags/dev-latest \
  | grep -E '"published_at"|"updated_at"' | head

同一批数据里还有个更实用的数字对比(2026-09-13 取数):v3.7.0 的 x-ui-linux-amd64.tar.gz 下载量 184,222 次,而 dev-latest 的同名资产只有 158 次。稳定版是绝大多数人的选择,这个比例是它值得被默认选择的最好证据。

卸载

菜单 6 或 x-ui uninstall:停服务、禁用自启、移除服务单元、删除 /etc/x-ui/ 与安装目录。如果你装了本地 PostgreSQL,它还会单独问一次是否一并清除。

⛔ 卸载会删掉数据库和你的全部配置

这就是第 07 节那张表里 /etc/x-ui/x-ui.db 的意义:卸载前先把它复制走。删掉之后再想找回,只剩备份这一条路。

20连不上时怎么查:按症状分诊

先做一个动作分类:问题在面板侧,还是在链路侧?面板能打开 = 面板侧基本没问题;那么 90% 的故障在链路或配置匹配上。

症状先看这里常见原因
面板打不开x-ui status、x-ui log服务没起来;端口被占用;数据库路径不可写;防火墙没放行面板端口
经反向代理访问返回 502核对上游端口与 web base path代理没指向正确端口;没传 WebSocket 升级头(面板实时更新依赖 WS);路径写错
客户端连不上解出分享链接逐项核对两端传输/安全设置不匹配;撞到流量/到期/IP 限制;入站端口没放行;REALITY 的 dest/SNI 不对
昨天还好,今天全断证书到期时间、配置是否有过改动Let's Encrypt 证书 90 天、裸 IP 证书约 6 天;改动触发了整进程重启
某个客户端被挡x-ui banlog触发 IP 限制被 Fail2ban 封禁(默认 30 分钟)
流量统计不动客户端是否真的在连;入站是否启用连的不是这个入站;客户端已被自动禁用
改配置没生效x-ui restart-xray 试一次热应用没覆盖这次改动;或你改错了地方(比如手改 config.json)

五条命令,覆盖大多数排障场景

# ① 服务和内核都活着吗
x-ui status

# ② 实时看面板日志(Ctrl+C 退出)
x-ui log

# ③ 只重载 Xray,判断问题在哪一层
x-ui restart-xray

# ④ 我是不是被封了
x-ui banlog

# ⑤ 面板打印当前端口/路径/证书位置
x-ui settings

证书相关的三条硬检查

💡 一个反直觉的排查起点

REALITY 入站完全不需要证书。所以「REALITY 连不上」时,不要去查证书过期——问题极可能在 dest/SNI 的选择上,或者客户端的 pbk/sid/flow 没对上、以及那个「最小客户端版本」门槛。

21最常见的坑与常见问题

十个坑,一条一条对

1. 把面板留在默认端口 2053 + 默认路径 /
这是扫描器的第一目标。安装脚本问你要不要自定义端口时,选「否」它会给随机端口;但很多人选了自己填一个「好记的」——那就等于没改。用菜单 8 随机化路径,成本为零。
2. 装完面板就以为「已经能用了」
面板只是管理台,它自己不提供任何代理服务。必须先建入站、加客户端、把链接导入客户端应用。
3. 只放行了面板端口,忘了入站端口
两者完全独立。443、8443、UDP 端口各自都要在防火墙放行。Hysteria2 走 UDP——这是它最常见的「装好了连不上」。
4. 在入站上找「开启 Vision」的开关
没有这个开关。flow(xtls-rprx-vision)填在VLESS 客户端条目上,分享链接里的 flow= 也来自那里。
5. 在 CDN 后面用 REALITY
REALITY 依赖看到真实的 TLS 握手,而 CDN 已经把它终结了。有中间层就用 TLS + WebSocket/HTTPUpgrade/XHTTP。
6. 手改 /usr/local/x-ui/bin/config.json
它是生成物。下次任何一次面板改动都会覆盖它。要改 Xray 原始配置,去面板的 Xray 设置里改模板。
7. 一个用户建多条客户端记录
统计和限额会各算各的,「限 100GB」实际能用到 200GB。一个 Email 一条记录,用「关联多个入站」表达多入口。
8. Docker 里没给 NET_ADMIN,却指望 IP 限制生效
Fail2ban 靠 iptables 封禁,缺权能时只记录不执行。要么加 --cap-add=NET_ADMIN --cap-add=NET_RAW,要么明确把 XUI_ENABLE_FAIL2BAN 设成 false。
9. 明文 HTTP 暴露面板,或把订阅链接贴到公开地方
前者泄露登录凭据,后者泄露整个客户端配置。订阅链接按密码对待,泄露就换 Sub ID。
10. 把订阅服务器当成「面板的一部分」来防护
它是独立的第二个服务、独立端口,也要单独上 TLS、单独在防火墙放行。常见事故是面板上了 HTTPS,订阅还是明文 http。
✗ 错误做法:装完就开 443,其他什么都不管
bash <(curl .../install.sh)   # 一路回车
# 面板:2053 + 路径 / + 默认凭据
# 入站:443 VLESS+REALITY

面板和业务共用「没人管」的状态;出问题时你连是谁在扫你都不知道。

✓ 正确做法:先锁门,再开门做生意
# 1 装完先改身份与入口
x-ui    # 菜单 7 重设凭据 · 开启 2FA
# 菜单 8 随机路径 · 菜单 10 改端口
# 2 上 TLS(菜单 20)
# 3 再建入站 443 / 加客户端 / 放行端口

顺序反过来只需多花五分钟,却把攻击面压到了最小。

常见问题

3x-ui 和 x-ui 是什么关系?
3x-ui 是老项目 X-UI 的增强分支(fork)。它增加了更广的协议支持、更好的稳定性、按客户端的流量统计、多节点管理、13 种界面语言等。你在网上看到的老 x-ui 教程里「每个入站各建一个用户」「手改 config.json」这类做法,在 3x-ui 里已经不适用了。
支持哪些系统与架构?
Ubuntu、Debian、Armbian、Fedora、CentOS、RHEL、AlmaLinux、Rocky、Oracle Linux、Amazon Linux、Virtuozzo、Arch、Manjaro、Parch、openSUSE(Tumbleweed/Leap)、Alpine,以及 Windows;架构覆盖 amd64、386、arm64、armv7、armv6、armv5、s390x。不确定自己是哪个就敲 uname -m。
SQLite 还是 PostgreSQL?
默认 SQLite(/etc/x-ui/x-ui.db),适合中小规模,零配置。客户端数量很大或节点很多时换 PostgreSQL:安装程序可以帮你本地装一个,也可以给一个现成服务器的连接串(DSN)。运行时靠环境变量切换(安装程序会写进 /etc/default/x-ui),并可用 /usr/local/x-ui/x-ui migrate-db --dsn "postgres://…" 做迁移——源 SQLite 文件不会被改动,确认新后端正常后再自己删。
哪些客户端应用能用?
任何兼容 Xray 的客户端,例如 v2rayNG、Hiddify、Mihomo/Clash 系。导入分享链接或二维码,或者直接填订阅地址。注意 REALITY 的「最小客户端版本」门槛:第三方内核可能被挡住。
升级会不会丢配置?
正常的 x-ui update 会保留数据库与设置。但跨大版本升级前请先备份——数据库结构迁移是不可逆的,出问题要回滚得靠旧库。
怎么确认我的安装包没被篡改?
按 README 的说法,每个资产旁都有 .sha256,脚本会校验、不一致就中止。但实测(2026-09-13)最近 100 个 release 里只有 dev-latest 有伴随文件,稳定版都没有,所以装稳定版时这一步实际被跳过了。想自己确认,就去 release 页面核对官方提供的哈希(如果有),或者至少确认下载来源是官方域名。
我的服务器很弱,跑得动吗?
面板本身是 Go 写的,桌面级服务器完全够用;它还为小内存机器准备了 GOGC、GOMEMLIMIT、XUI_MEMORY_RELEASE_INTERVAL 这类调节项(默认不用设)。真正吃资源的是加密流量本身的吞吐,而不是这个面板。
忘了面板密码怎么办?
x-ui 菜单 7 重设用户名与密码(同时会关掉 2FA,需要的话重新打开)。如果连密码文件都还在,也可以先看 /etc/x-ui/install-result.env。Docker 部署则用下面这条读设置:
docker exec -it <容器名> x-ui setting -show

22术语对照表:回头查的时候看这一张

术语定义为什么重要 / 何时用 · 别当什么用
Xray-core真正干活的代理内核(一个独立可执行文件)出问题时它是最后一环;别把它和面板混为一谈——面板只是它的遥控器
面板(Panel)3x-ui 的网页管理台,默认 2053 端口它的端口与入站端口互相独立;加固的对象主要是它
入站 Inbound一个「协议 + 端口 + 传输 + 安全 + 用户」的监听器日常配置的核心对象;别当成「一条用户」,一个入站可挂很多用户
出站 Outbound流量离开服务器的方式(直连/黑洞/代理)想换出口线路时才需要它;默认两个就够用
客户端 Client以 Email 为唯一键的用户记录限额、到期、订阅、在线状态都挂在它身上;Email 重复会出乱子
传输 Transport数据包怎么装(TCP/WS/gRPC/XHTTP…)决定能否过 CDN;两端必须一致,不一致就完全连不上
安全层 Securitynone / TLS / REALITY决定加密与伪装方式;REALITY 是「不用自己证书」的那个
REALITY借用真实站点 TLS 握手的伪装机制抗 DPI 且不需要证书;别在 CDN 后面用,也别配自己的证书
XTLS-Vision / flowxtls-rprx-vision 流控快且抗 DPI;设在客户端条目上,不在入站上
回落 Fallback一个 TLS 端口按 SNI/ALPN/path 分流给子入站想用一个 443 服务多协议时用;前提是 VLESS/Trojan + 裸 TCP + TLS/REALITY
分享链接一条含凭据与全部参数的 URL / 二维码发给一个人用;它就是密码,别公开
订阅 Subscription一个 URL 返回某客户端的全部配置用户多、地址常变时用它替代逐条发链接;它自己也是个独立服务,要单独上 TLS
Sub ID订阅地址末段的随机标识泄露后换掉它就等于吊销旧订阅地址;别把它当密码用途之外的东西
节点 Node由主面板通过 API 管理的另一台 3x-ui多机部署时用;身份靠 GUID,重启不丢;令牌可选加密落盘
受管主机 Host附加在入站上的对外端点覆盖对 CDN 公布地址、按地区公布多域名时用;别拿它当入口配置,它只影响订阅输出
geoip / geosite路由规则用的地理数据库写 geoip:private、geosite:category-ads-all 时靠它;菜单 27 可更新
hot apply把配置差量推给运行中的 Xray,不重启进程解释「为什么改设置没断线、有时又断了」;断线通常是走了整进程重启
SNITLS 握手里客户端声称要访问的域名REALITY 下必须与目标站点证书匹配,否则伪装失败
uTLS 指纹客户端模仿的 TLS 客户端特征(如 chrome)决定握手看起来像谁;两边不一致容易被识别
Fail2ban按日志封 IP 的工具,jail 名 3x-iplIP 限制的实际执行者;Docker 下缺 NET_ADMIN 就形同虚设
BBRLinux 的一种拥塞控制算法跨国链路上常能改善速度;菜单 26 一键开,别指望它解决丢包
DPI网络中间设备的「深度包检测」判断你的流量像不像正常网站;理解它才知道为什么要 REALITY / 混淆

99一句话总结

🎯 核心要点

3x-ui 是 Xray-core 的遥控器而不是代理本身:装它、先锁面板(改端口/路径/凭据/2FA/TLS)、再建入站(VLESS+REALITY+Vision 是当下最省事的一套)、用客户端和订阅把凭据发出去、把数据库和证书备份好——而排障时只要记住两条分界线:面板端口 ≠ 入站端口,数据库是真相源、config.json 只是生成物。

📌 留给你自己验的那一条

拿你自己的场景举一个例子:如果你要把这台服务器分给三个具体的人(同事、家人、自己的另一台设备),你会建几个入站、几条客户端记录、几条订阅地址?——能不看本文答出来,这一篇就算读完了。

⌂