Docker Compose 部署轻量级内网穿透服务器 NPS (避坑指南)

7 2 月, 2026 7点热度 0人点赞 0条评论

NPS 是一款轻量级、高性能、功能强大的内网穿透代理服务器。相比于 FRP,它带有强大的 Web 管理终端,配置更加直观,非常适合从外网访问家里的 NAS、服务器或调试代码。

本文将手把手教你使用 Docker Compose 快速部署 NPS 服务端与客户端,并解决常见的“配置文件丢失”和“端口冲突”导致容器启动失败的问题。

准备工作

  • 服务器环境:Linux (Ubuntu/CentOS/Debian)
  • 软件依赖:已安装 Docker 和 Docker Compose
  • 目标目录:本文以 /dockerdata/nps 为例

准备工作

  • 服务器端 (VPS):具有公网 IP 的 Linux 服务器 (Ubuntu/CentOS/Debian)。
  • 客户端 (内网):家里的 NAS、树莓派或公司电脑。
  • 软件依赖:两端均需安装 Docker 和 Docker Compose。
  • 目标目录:本文以 /dockerdata/nps 为例

第一部分:服务端部署 (VPS)

很多新手在使用 Docker 部署 NPS 时,直接挂载一个空的宿主机目录,导致容器启动时报错 config file not foundpanic: open ... json: no such file。我们需要先预置好配置文件。

1. 初始化配置目录

在服务器终端执行:

# 创建存放数据的文件夹
mkdir -p /dockerdata/nps/conf
cd /dockerdata/nps

# 1. 写入基础配置文件 (nps.conf)
# 我们将默认端口映射到非标准端口,避免占用服务器的 80/443
cat > conf/nps.conf <<EOF
appname = nps
runmode = dev

# HTTP(S) 代理端口 (容器内部)
http_proxy_ip=0.0.0.0
http_proxy_port=80
https_proxy_port=443
https_just_proxy=true

# 客户端连接端口 (容器内部 8024)
bridge_type=tcp
bridge_port=8024
bridge_ip=0.0.0.0
public_vkey=123

# Web管理界面 (容器内部 8080)
web_host=a.o.com
web_username=admin  #自行设置
web_password=123     #自行设置
web_port=8080
web_ip=0.0.0.0

# 流量持久化与日志
flow_store_interval=1
log_level=7
EOF

# 2. 创建必要的数据文件 (关键步骤!)
# 缺少这些文件会导致容器启动后立即崩溃
echo "[]" > conf/clients.json
echo "[]" > conf/hosts.json
echo "[]" > conf/tasks.json

2. 编写服务端 Docker Compose

/dockerdata/nps 目录下创建 docker-compose.yml

services:
  nps:
    image: yisier1/nps
    container_name: nps
    restart: always
    volumes:
      - ./conf:/conf
      - /etc/localtime:/etc/localtime:ro
    ports:
      # 左侧为宿主机端口,可自定义
      - "80:80"      # HTTP 穿透端口
      - "443:443"     # HTTPS 穿透端口
      - "8024:8024"    # 客户端连接通信端口 (重要)
      - "8080:8080"    # Web 管理面板端口

3. 启动服务端

docker compose up -d

启动后访问 http://你的服务器IP:8080,使用你设置的账号 admin / 123 登录。


第二部分:客户端部署 (内网/NAS)

服务端跑起来后,我们需要在内网机器上部署客户端 (NPC) 来建立连接。

1. 获取验证密钥 (VKey)

  1. 登录服务端 Web 后台。
  2. 点击左侧 “客户端” (Clients) -> “新增” (Add)
  3. 备注填写(如 Home-NAS),其他留空,点击保存。
  4. 复制列表生成的 唯一验证密钥 (Unique Verify Key)

2. 启动客户端容器

在内网机器(如群晖、威联通、树莓派)上,使用以下命令或 Compose 文件启动。

推荐使用 network_mode: host,这样客户端可以直接访问内网机器的所有端口(如 22, 5000, 80 等),无需额外配置复杂的 Docker 网络。

新建 docker-compose.yml

services:
  npc:
    image: yisier1/npc
    container_name: npc
    restart: always
    network_mode: host
    # 替换下面的 IP 和 VKEY
    # -server: 服务器IP:通信端口(524)
    # -vkey:   刚才复制的密钥
    command: -server=你的服务器IP:524 -vkey=你的客户端VKey -type=tcp

启动客户端:

docker compose up -d

回到服务端后台,如果看到客户端状态变为 在线 (Online) 且呈绿色,说明隧道打通成功!


第三部分:实战——创建 SSH 穿透

假设你想在公司通过公网访问家里 NAS 的 SSH(内网端口 22)。

  1. 点击服务端后台左侧 “TCP 隧道” -> “新增”
  2. 客户端 ID:选择刚才上线的 Home-NAS
  3. 服务端端口:填写 10022 (外网访问入口)。
  4. 目标 (IP:端口):填写 127.0.0.1:22
    • 注:因为 NPC 是 Host 模式运行在 NAS 上的,127.0.0.1 指的就是 NAS 本身。
  5. 点击保存。

现在,你就可以使用以下命令远程连接了:

ssh root@你的服务器IP -p 10022

常见问题排查 (FAQ)

Q1: 容器无限重启,日志提示 panic: open /conf/clients.json: no such file

  • 原因:宿主机挂载的配置目录里缺少数据文件。
  • 解决:手动执行 echo "[]" > conf/clients.json 等命令补全文件(参考第一部分)。

Q2: 报错 bind: address already in use

  • 原因:端口冲突,通常是 80 或 443 被 Nginx 占用了。
  • 解决:修改 docker-compose.yml 左侧的映射端口,例如将 80:80 改为 580:80

Q3: 客户端连不上,一直显示离线

  • 原因:防火墙未放行,或端口填错。
  • 解决
    1. 确保云服务器的安全组/防火墙放行了通信端口(本文中是 524)。
    2. 检查客户端命令里的 -server 是否填写了正确的 IP 和通信端口。

Q4: 报错 bind: address already in use

  • 原因:端口冲突。
  • 解决:修改 docker-compose.yml 左边的端口号(例如将 590:8080 改为 1590:8080)。

Q5: 报错 load config file error ... don't exist

  • 原因:宿主机的 ./conf 目录是空的,容器找不到配置文件。
  • 解决:参考本文“第一步”,手动创建 nps.conf

Q6: 报错 panic: open /conf/clients.json: no such file

  • 原因:缺少数据存储文件,这是 yisier1/nps 镜像的一个常见坑。
  • 解决:参考本文“第一步”,手动执行 echo "[]" > ... 创建那三个 json 文件。

Q7: 警告 Published ports are discarded when using host network mode

  • 原因:使用了 network_mode: host 却又配置了 ports
  • 解决:在 compose 文件中删掉 network_mode: host,使用 Bridge 模式即可让端口映射生效。

Ron

这个人很懒,什么都没留下

文章评论