先说结论:
256MB 内存、NAT 端口映射、Alpine 容器,不装 3x-ui,不装 nginx,xray 裸跑 14MB 内存,三个协议全开。
如果你手上有便宜的 NAT 小鸡,或者内存小到装不起面板,这个脚本可能适合你。
仓库:https://github.com/byJoey/xray-cf-lite
为什么不用 3x-ui
3x-ui 很好用,但它是 Go 写的 Web 面板 + SQLite,吃内存。
256MB 的 NAT 小鸡装上去,光面板就占了大半。而且 NAT 环境下端口不是你想开就能开,面板那套随机端口的逻辑不太适用。
所以我写了个 Bash 脚本,直接生成 xray 的 config.json,跳过整个面板。
依赖就两个:curl 和 jq,脚本自动装。
它干了什么
和 xui-cf-deployer 的 Cloudflare 配置逻辑一样:
- 装 xray-core(自动下载二进制,不依赖官方安装脚本,兼容非 systemd)
- 生成 xray 配置(VLESS / Trojan / VMess + WebSocket)
- 配置 Cloudflare DNS(A 记录 + 代理)
- 设 SSL 为 flexible
- 下发 Origin Rules(不同路径转发到不同端口)
- 输出订阅链接(复用
yx-auto.pages.dev)
卸载的时候一键回滚:DNS、SSL、Origin Rules 全部恢复到安装前的状态。
NAT 端口映射怎么处理
NAT 小鸡的核心问题:你拿到的外部端口和内部端口不一样。
比如:
15331 -> 80
15333 -> 8080
15334 -> 8443
脚本自动检测 NAT 环境(看你有没有公网 IP 绑在网卡上),然后让你输入映射:
vless 内部监听端口(xray监听): 80
vless 外部映射端口(对外暴露): 15331
trojan 内部监听端口(xray监听): 8080
trojan 外部映射端口(对外暴露): 15333
一个协议问两次,内部端口和外部端口分开填,不容易填反。
xray 配置写左边,Cloudflare Origin Rules 写右边。两边对上就通了。
端口变了怎么办
NAT 小鸡经常换端口。脚本有个专门的菜单 6「更新外部端口」:
- 只更新 Cloudflare Origin Rules
- 不重启 xray(内部监听没变,不用动)
- 顺便检查公网 IP 有没有变,变了一并更新 DNS
- 几秒搞定
Alpine / OpenRC 支持
很多 NAT 小鸡跑的是 Alpine(LXC 容器),没有 systemd。
脚本自动检测 init 系统:
- systemd → 走
systemctl - OpenRC → 自动创建
/etc/init.d/xray服务脚本
xray 官方的安装脚本不支持 OpenRC,所以脚本走的是手动下载二进制,不依赖 install-release.sh。
崩溃自动重启
xray 挂了 1 秒自动拉起,无限重启。systemd 和 OpenRC 都做了。
实测 kill -9 之后 1 秒内 supervise-daemon 就把新进程拉起来了,端口全部恢复监听。
NAT 小鸡本来就不稳定,进程偶尔崩一下很正常,不能每次都手动去拉。
手动重启也有:菜单 7。
踩过的坑
Bot Fight Mode
这个坑最隐蔽。
如果你的 Cloudflare 域名开了 Bot Fight Mode(或者 Super Bot Fight Mode),WebSocket 连接会被 CF 直接拦截,返回 403 challenge。
客户端看到的症状就是全部节点 -1,连不上。
解决方法:
- 进 Cloudflare Dashboard → 对应域名 → Security → Bots
- 关掉 Bot Fight Mode
- 或者加一条 WAF 自定义规则,对节点的子域名跳过 Bot Fight
xray 新版本的 WebSocket 警告
xray 26.x 会提示 WebSocket transport is deprecated,建议迁移到 XHTTP。
目前不影响使用,只是警告。但如果哪天 xray 真的移除 WS 支持,这个脚本需要跟着改。
MTU
如果你的 NAT 宿主机 MTU 和容器不一致,可能会遇到奇怪的超时。一般不用管,但如果遇到 TCP 连得上但没响应的情况,可以试试把容器 MTU 改成 1500。
怎么用
apk add bash curl
bash <(curl -fsSL https://raw.githubusercontent.com/byJoey/xray-cf-lite/main/xray_cf_lite.sh)
首次运行后自动注册快捷命令 x,之后直接敲:
x
每次都是联网拉最新脚本执行,本地不留文件。
按提示走就行。UUID、端口、路径都可以自定义,也可以留空让脚本自动生成。
需要准备的:
- 一个在 Cloudflare 托管的域名
- Cloudflare Global API Key(不是 API Token)
- 如果是 NAT,需要知道端口映射关系
实测数据
测试环境:
Alpine 3.21 / 256MB RAM / 0.5 核
NAT(LXC 容器)
外部端口 5 个(SSH 占 1 个,节点用 3 个)
部署后:
xray 内存占用:14MB
三协议全开(VLESS + Trojan + VMess)
CF 链路验证:WebSocket 101 Switching Protocols ✓
订阅导入客户端:正常
14MB。面板党看了沉默。
和 xui-cf-deployer 的关系
这个脚本的 Cloudflare 配置逻辑(DNS、SSL、Origin Rules、订阅链接参数)全部复用了 xui-cf-deployer 的设计。
区别就是把 3x-ui 面板换成了直接写 xray config.json,所以:
- 没有 Web 管理界面
- 没有流量统计
- 没有多用户管理
- 但是内存占用从几百 MB 降到 14MB
如果你需要面板的功能,用 xui-cf-deployer。如果你只要一个能跑的节点,用这个。