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 found 或 panic: 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)
- 登录服务端 Web 后台。
- 点击左侧 “客户端” (Clients) -> “新增” (Add)。
- 备注填写(如
Home-NAS),其他留空,点击保存。 - 复制列表生成的 唯一验证密钥 (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)。
- 点击服务端后台左侧 “TCP 隧道” -> “新增”。
- 客户端 ID:选择刚才上线的
Home-NAS。 - 服务端端口:填写
10022(外网访问入口)。 - 目标 (IP:端口):填写
127.0.0.1:22。- 注:因为 NPC 是 Host 模式运行在 NAS 上的,127.0.0.1 指的就是 NAS 本身。
- 点击保存。
现在,你就可以使用以下命令远程连接了:
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: 客户端连不上,一直显示离线
- 原因:防火墙未放行,或端口填错。
- 解决:
- 确保云服务器的安全组/防火墙放行了通信端口(本文中是 524)。
- 检查客户端命令里的
-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 模式即可让端口映射生效。
文章评论