【教程】飞牛 NAS 上用 Docker 部署 3x-ui:面板、节点与热点共享的完整配置记录

【教程】飞牛 NAS 上用 Docker 部署 3x-ui:面板、节点与热点共享的完整配置记录

时间煮雨-Master
2026-11-11 / 0 评论 / 3 阅读 / 正在检测是否收录...

飞牛 NAS 上用 Docker 部署 3x-ui:面板、节点与热点共享的完整配置记录

摘要:找一台能 24 小时开机的设备做容器宿主,NAS 是最省心的选择。本文以飞牛 fnOS 为例,用 Docker 部署 bigbugcc/3x-ui,完成面板访问、vmess+WS 入站、客户端导入,并把手机做成热点共享出口,全程配置逐项记录。

适用环境:飞牛 fnOS(Docker 已启用)|3x-ui 容器版|Android(已 root)|阅读约 10 分钟|难度 ★★★☆☆

一、为什么把容器放在 NAS 上

跑这类服务,最核心的诉求不是性能,而是在线时长。一台常年开机、功耗十几瓦、还能顺带做存储与备份的设备,比任何云主机都划算。飞牛 fnOS 自带 Docker 可视化管理,容器参数在图形界面里填完即可,不必手写 compose 文件,对不熟悉命令行的用户更友好。

开始之前,请先确认四件事:

  1. Docker 已安装并运行——飞牛「应用中心」安装 Docker 后,可在「Docker → 容器」看到管理界面。
  2. 设备可以长期开机——建议接 UPS 或至少保证不断电,容器重启策略设为「除非手动停止」。
  3. 存储目录已规划好——本文统一使用 /vol1/1000/01系统盘/docker/3x-ui,请先在「文件管理」里把目录建好。
  4. 清楚自己的网络出口——家宽公网 IP 是动态还是固定、路由器能否放行端口,直接决定后面用 host 还是 bridge 网络。

二、部署参数一览

以下参数即为飞牛 Docker 界面中需要填写的内容,先整体过一遍,再逐项解释。

项目值
镜像bigbugcc/3x-ui
网络模式host
启动命令./x-ui
重启策略除非手动停止
面板端口2053(TCP)
节点端口10001(TCP + UDP)

端口映射(若采用 bridge 网络需全部填写;host 模式下见下文说明):

宿主机端口容器端口协议
20532053TCP
20532053UDP
1000110001TCP
1000110001UDP

目录挂载:

本地路径装载路径权限
/vol1/1000/01系统盘/docker/3x-ui/etc/xUi读写
/vol1/1000/01系统盘/docker/3x-ui/etc/x-ui读写

环境变量:

变量名值
TZAsia/Shanghai
XUI_IN_DOCKERtrue
XUI_MAIN_FOLDER/app
XUI_ENABLE_FAIL2BANtrue
PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
XUI_DB_TYPE留空
XUI_DB_DSN留空

几个关键点的说明:

  • XUI_IN_DOCKER=true 是容器化运行的开关,必须设置,否则面板可能按裸机路径去找资源而启动失败。
  • XUI_MAIN_FOLDER=/app 与启动命令 ./x-ui 是配套的:程序位于 /app 目录下,命令用相对路径执行。两者对不上就会报“找不到文件”。
  • XUI_DB_TYPE 与 XUI_DB_DSN 留空 表示使用容器内的默认 SQLite 数据库,数据文件落在挂载目录中,删容器不丢配置。
  • 两个挂载点大小写不同(/etc/xUi 与 /etc/x-ui)。社区镜像在不同版本里对路径的处理不一致,同时挂载可兼容历史版本;但如果发现改完配置不生效,建议只保留 /etc/x-ui 一个,避免两个目录各写一份造成混乱。

三、关于网络模式的一处取舍

这里有一个容易踩的坑:host 模式下,端口映射是不生效的。

容器与宿主机共用同一网络命名空间后,容器内监听 2053、10001 就等于宿主机在监听这两个端口,界面上填的「2053→2053」这类映射会被忽略(填了也无害,只是不起作用)。这意味着:

  • 端口天然全部暴露,安全性依赖宿主机的防火墙,需要在飞牛或路由器层面确认 2053 与 10001 的放行规则;
  • 正常情况下不需要额外做端口转发,但路由器若开了 DMZ 或端口映射表,要保证这两个端口指向本机;
  • XUI_ENABLE_FAIL2BAN=true 在 host 网络下才有意义,它依赖容器对 iptables 的操作权限。若日志里出现 fail2ban 相关报错,可在容器的高级设置里补上 NET_ADMIN 与 NET_RAW 两个能力,或先把该变量改为 false 让服务先跑起来。

如果你更看重隔离性,也可以改用 bridge 网络:此时上面那四条端口映射才真正起作用,务必把 2053、10001 的 TCP 与 UDP 都映射上。虽然 vmess over WebSocket 的传输层本身是 TCP,但入站若开启 UDP 转发,或客户端产生 QUIC、DNS over UDP 之类的流量,只映射 TCP 会出现"连得上但部分功能异常"的现象,这正是需要同时映射 UDP 的原因。

四、创建容器并登录面板

按下图参数在飞牛 Docker 中新建容器,启动后浏览器访问:

http://<NAS的IP>:2053

首次进入会提示证书不受信任(面板自带自签证书),选择继续访问即可。默认账号密码均为 admin。

安全提醒:登录后第一件事是改掉默认密码,并把面板路径从默认值改成自定义字符串。默认凭据与默认端口是扫描器的第一目标,这一步不能省。

五、添加入站(vmess + WebSocket)

进入「入站列表 → 添加」,在高级配置中选择「全部」,直接粘贴完整 JSON。这种写法比在表单里逐项点选更可靠,也不容易漏掉嵌套字段。

{
  "listen": "",
  "port": 10001,
  "protocol": "vmess",
  "tag": "in-10001-tcp",
  "settings": {},
  "sniffing": {
    "enabled": false
  },
  "streamSettings": {
    "network": "ws",
    "wsSettings": {
      "acceptProxyProtocol": false,
      "path": "/",
      "host": "这里填需要的host",
      "headers": {},
      "heartbeatPeriod": 0
    },
    "security": "none"
  }
}

保存前记得设置备注名,例如 家宽——后面添加客户端时要靠这个备注关联入站。

逐字段解释:

字段含义与填写要点
listen留空表示监听所有网卡,host 模式下即宿主机全部地址
port与端口映射保持一致,此处为 10001
protocolvmess,与客户端协议必须一致
tag内部标识,建议按 in-端口-传输 命名,便于日后排查
sniffing.enabled关闭流量嗅探,减少额外开销与误判
streamSettings.networkws(WebSocket),比裸 TCP 更易与常规 Web 流量共存
wsSettings.path"/"。必须与客户端填写完全一致,多一个斜杠都会握手失败
wsSettings.host按需填写 Host 头,可与实际域名一致;留空则客户端也不要填
wsSettings.acceptProxyProtocol前置无反代时保持 false
streamSettings.securitynone 表示本入站不做 TLS,加密由 vmess 自身协议层提供

六、添加客户端

回到入站列表,找到刚建的 家宽,点击进入客户端管理 → 添加客户端:

  • 关联入站:选择 家宽;
  • 其余参数保持默认,直接创建。

创建完成后,列表里会出现该客户端的 UUID、邮箱标识与流量统计,这些是后续导入设备时唯一需要依赖的凭据。

七、在客户端导入节点

点击客户端前方的二维码图标,会弹出两个二维码:

  • 第一个通常是订阅或分享信息;
  • 第二个才是可被客户端直接识别的节点链接,用需要上网的设备扫描这一个。
经验项:原作者实测中曾遇到导入后无法握手、需要把客户端的 WebSocket「伪装类型 / header type」从 none 改为 http 才连通的情况。不同客户端版本对该项的默认值并不统一,若扫描后连接失败,可优先调整这一项再重试;判断标准只看实际握手结果,不必纠结默认值。

八、手机热点共享(需 root)

这一节的目的是把手机的代理出口分享给同一热点下的其他设备——平板、电视盒子、笔记本都可以直接借用手机的网络通道,无需在每台设备上单独装客户端。

在已 root 的 Android 手机上安装 VPNHotspot,进入侧边栏的「Wi-Fi 共享」,按 root 权限授权,热点配置如下:

热点配置-上游与下游

上游:

  • 上游网络接口:自动检测系统 VPN(当前为 tun0)
  • 备用上游接口:自动检测系统默认网络(当前为 rmnet_data6)

下游:

  • IP 掩蔽模式:简易
  • IPv6:模式 NAT(用户空间)
  • 网络共享硬件加速:关

热点配置-开关项

开关项:

  • 静态 IP:开
  • wlan2:开
  • 监视重新连接:开
  • WLAN 热点:开
  • 其余全部关闭

几处需要留意的逻辑:

  • 上游必须选中 VPN 接口(tun0),共享出去的才是代理后的流量;若误选蜂窝接口 rmnet_data6,下游设备拿到的将是运营商直连出口。
  • 下游的 IPv6 使用 NAT 模式而非桥接,是为了避免热点侧分配出上游无法回程的地址。
  • 关闭硬件加速可规避部分机型上「设备能连上但无流量」的兼容性问题,代价是吞吐略有下降。
  • 静态 IP 与「监视重新连接」同时开启,能减少手机休眠或 VPN 重连后热点失效的概率。

九、验证是否生效

用手机和任一连接该热点的设备,各自打开浏览器访问 IP 查询站点,比对两处结果:

  • 手机显示的出口 IP;
  • 热点下设备的出口 IP。

两者一致,且都是家里的公网 IP,说明整条链路成立:设备 → 手机热点 → VPN 上游 → NAS 节点 → 家庭出口。

若不一致,通常是上游接口选错,或 VPN 未处于连接状态。

十、常见问题清单

现象排查方向
面板打不开确认容器为 running;2053 是否被防火墙拦截;host 模式下无需端口映射,bridge 模式下必须映射
面板能开但显示不安全正常现象,自签证书,浏览器放行即可;有条件可后续替换正式证书
节点连接超时目标端口未放行;家宽公网 IP 已变更;path 或 host 与客户端不一致
握手失败、日志报 404WebSocket 路径不匹配,检查 / 是否被漏写或多写
能连上但无法打开网页客户端 WebSocket 伪装类型与入站不符;DNS 配置问题;入站 security 与客户端不一致
vmess 校验失败系统时间偏差过大,NTP 未同步,误差超过 90 秒会直接拒绝
重启容器后配置丢失挂载路径写错,数据没落到宿主机目录;检查 /etc/x-ui 下是否有 x-ui.db
fail2ban 启动报错host 网络下缺少 NET_ADMIN / NET_RAW 能力,或临时设 XUI_ENABLE_FAIL2BAN=false

十一、小结

整套流程可以压缩成四个动作:拉镜像 → 定网络模式 → 配入站 → 导客户端。真正决定成败的不是面板里填了多少项,而是三个一致性:

  1. 端口一致:入站端口、映射端口、客户端端口三者对齐;
  2. 路径一致:WebSocket 的 path 与 host 在服务端与客户端完全对应;
  3. 网络模式一致:host 模式别再指望端口映射,bridge 模式别漏掉 UDP。

再往上,就是出口侧的问题了——公网 IP 是否可达、防火墙是否放行、时间是否同步。把这三层依次排掉,绝大部分"连不上"都能定位到具体环节。


十二、文件下载

包含tiny客户端和wifi热点共享工具。


本文配置基于飞牛 fnOS + Docker 实际部署整理 · 请遵守当地法律法规与网络服务条款,仅用于自有环境的技术实践 · 转载请注明出处

0

评论 (0)

取消