视频教程:https://www.bilibili.com/video/BV1Y8XsBWEPD
一、为什么从原版 NPS 迁移到 djylb/nps?
原版 NPS(ehang-io/nps)已经多年未维护,随着 Go 版本更新、系统环境变化,编译兼容性和安全补丁逐渐成为问题。社区基于原版做了大量改进和重构,其中 djylb/nps(NPS Enhanced)是目前比较活跃的一个分支,定位是"持续维护、增强版本"。
相对原版,它的主要优势包括:
-
持续维护与重构
项目持续有提交记录,作者对管理后台、P2P 逻辑、协议支持等进行持续优化。
-
协议与功能增强
支持 TCP/UDP 转发、HTTP/HTTPS 反向代理、HTTP/SOCKS5 代理、P2P 模式、Proxy Protocol、HTTP/3 等,覆盖大部分内网穿透场景。
-
多连接协议支持
客户端可以使用 TCP、KCP、TLS、QUIC、WebSocket(WS/WSS)等多种协议连接服务端,适应不同网络环境。
如果你已经在用原版 NPS,建议重新配置,不要直接使用原版配置文件。
二、服务端部署(基于 djylb/nps)
下面以 Linux 服务器为例,说明服务端安装和关键配置。Windows 类似,只是命令略有不同。
2.1 安装服务端
官方推荐使用脚本一键安装(Linux):
bash
# 安装服务端(默认配置路径 /etc/nps/,二进制在 /usr/bin/nps)
wget -qO- https://raw.githubusercontent.com/djylb/nps/refs/heads/master/install.sh | sudo sh -s nps
nps install
nps start|stop|restart|uninstall
# 更新版本
nps update && nps restart
Windows 可在 Releases 页面下载对应的 windows_amd64_server.zip,解压后执行:
powershell
.\nps.exe install
.\nps.exe start|stop|restart|uninstall
.\nps.exe stop
.\nps-update.exe update
.\nps.exe start
2.2 核心配置说明
安装后,默认配置文件路径为 /etc/nps/conf/nps.conf(Linux)或当前目录下的 conf/nps.conf(Windows)。部分关键配置如下:
ini
[common]
# Web 管理后台
web_username=admin
web_password=123 # 建议修改为复杂密码
web_ip=0.0.0.0
web_port=8081 # Web 管理端口,根据需要修改
# 客户端连接配置
bridge_ip=0.0.0.0
bridge_tcp_port=8024 # 客户端连接端口(TCP)
bridge_kcp_port=8024 # KCP 端口
bridge_tls_port=8025 # TLS 端口
bridge_quic_port=8025 # QUIC 端口
bridge_ws_port=8026 # WebSocket 端口
bridge_wss_port=8027 # WSS 端口
# P2P 配置(重点)
p2p_ip=0.0.0.0 # 一般填写服务器公网 IP,不要写域名或 127.0.0.1
p2p_port=6000 # P2P 打洞起始端口,默认使用 6000,需要开放 6000-6002 UDP
注意几点:
web_username/web_password:第一次启动前务必修改默认密码。p2p_ip:建议填服务器的公网 IP ,若使用0.0.0.0会自动识别,但某些网络环境可能需要手动指定。- P2P 端口:djylb/nps 默认
p2p_port=6000,实际使用时会在 6000-6002 等端口做 UDP 打洞。你需要在防火墙 / 安全组中放行:- TCP:8024(bridge)、8081(web)等
- UDP:6000-6002(P2P)
修改完配置后,重启服务:
bash
nps restart
2.3 防火墙与安全组示例(以云服务器为例)
确保开放以下端口(按实际配置调整):
- TCP 8024:客户端控制通道(bridge)
- TCP 8081:Web 管理后台
- UDP 6000-6002:P2P 打洞端口(
p2p_port=6000时)
三、客户端安装与连接
3.1 客户端安装(Linux / Windows)
官方同样提供脚本安装客户端:
bash
# Linux 客户端安装
wget -qO- https://raw.githubusercontent.com/djylb/nps/refs/heads/master/install.sh | sudo sh -s npc
/usr/bin/npc install -server=你的服务器IP:8024 -vkey=客户端密钥 -type=tls -log=off
npc start|stop|restart|uninstall
# 更新客户端
npc update && npc restart
Windows 客户端:
powershell
.\npc.exe install -server="你的服务器IP:8024" -vkey="客户端密钥" -type="tls" -log="off"
.\npc.exe start|stop|restart|uninstall
-server / -vkey / -type 可以在 Web 管理后台的"客户端"页面复制,避免手误。
四、常用穿透场景快速配置
4.1 TCP 隧道:SSH 远程访问内网服务器
假设内网机器 IP:192.168.1.100,SSH 端口 22。
-
登录 Web 后台(
http://服务器IP:8081)。默认账号:admin,密码:123

-
在"客户端"页面新增一个客户端,记录生成的
vkey。

-
在内网机器上运行客户端命令(Linux):
bashnpc -server=你的服务器IP:8024 -vkey=生成的密钥 -
在后台"主机隧道"中新增一条 TCP 隧道:
- 模式:TCP
- 客户端 ID:选择刚上线的客户端
- 服务端端口(不填则自动生成):如
60022 - 目标:
192.168.1.100:22

-
在公网机器上执行:
bashssh -p 60022 root@你的服务器IP
即可穿透到内网 SSH。
4.2 HTTP 代理:暴露内网 Web 服务
假设内网 Web 服务:127.0.0.1:8080,希望通过域名访问。
-
在"主机隧道"中新增 HTTP 代理:
- 模式:HTTP
- 客户端 ID:选择对应客户端
- 域名:
test.example.com(提前解析到服务器 IP) - 目标:
127.0.0.1:8080
-
浏览器访问
http://test.example.com,流量即可通过 NPS 转发到内网 8080 端口。
五、P2P 模式配置步骤(默认打洞端口 6000-6002,本地端口 2000)
P2P 模式适合大流量场景,流量不经过服务器中转,而是尝试让两端直接打洞连接。djylb/nps 的 P2P 逻辑在原版基础上做了优化。
默认配置:
- P2P 打洞起始端口:
p2p_port=6000,需要开放 UDP 6000-6002。 - 访问端默认本地监听端口:
2000(可在命令中通过-local_port=xxx修改)。
5.1 场景说明
假设:
- 服务器公网 IP:
1.2.3.4 - 内网目标机器:
10.2.50.2:22(SSH) - 访问端:你自己的电脑(家宽 / 公司网络)
目标是:在访问端上通过 ssh -p 2000 root@127.0.0.1 直接连接到 10.2.50.2:22,流量尽量不经过服务器。
5.2 服务端 P2P 配置
-
编辑
conf/nps.conf:inip2p_ip=1.2.3.4 # 服务器公网 IP,不要写域名或 127.0.0.1 p2p_port=6000 # P2P 打洞起始端口,保持默认即可 -
在服务器防火墙 / 安全组中放行:
P2P服务需要开放一段连续的UDP端口用于打洞通信。
计算规则:
端口范围=p2p_port到p2p_port + 2。配置示例:若
p2p_port使用默认值6000,则需在云服务器安全组或防火墙中放行:bashUDP 6000-6002 -
重启 NPS:
bashnps restart
5.3 Web 后台添加 P2P 记录
-
登录 Web 后台。
-
进入"P2P 连接"页面,点击"新增":
- 客户端 ID:选择"被访问端"的客户端(即 10.2.50.2 所在客户端)。
- 目标:填写
10.2.50.2:22。 - 唯一验证密钥:自定义一个复杂密码,例如
p2p_ssh_secret(每条 P2P 记录的密钥不要重复)。
-
保存后,页面会给出"访问端命令",类似:
bashnpc -server=1.2.3.4:8024 -vkey=客户端密钥 -password=p2p_ssh_secret -target=10.2.50.2:22这里
客户端密钥是被访问端客户端的vkey,p2p_ssh_secret是你刚设置的 P2P 密钥。
5.4 访问端启动 P2P 客户端
在"访问端"机器(你自己的电脑)上执行命令(Windows 示例):
powershell
.\npc.exe -server=1.2.3.4:8024 -vkey=客户端密钥 -password=p2p_ssh_secret -target=10.2.50.2:22
-
默认情况下,访问端会在本地监听 2000 端口。
-
如需修改本地端口,可添加参数:
powershell.\npc.exe -server=1.2.3.4:8024 -vkey=客户端密钥 -password=p2p_ssh_secret -target=10.2.50.2:22 -local_port=2022
5.5 测试 P2P 连接
在访问端执行:
bash
ssh -p 2000 root@127.0.0.1
如果 P2P 打洞成功,流量将直接在访问端与被访问端之间传输,不经过服务器中转。需要注意:
- P2P 成功率与两端 NAT 类型有关,对称型 NAT 穿透难度较大。
- 若打洞失败,NPS 会退回到中继模式,流量仍然安全,但会占用服务器带宽。
六、避坑与安全建议
-
修改默认密码
web_password、public_vkey以及 P2P 的唯一验证密钥都建议使用复杂密码。
-
端口规划
- 确保云平台安全组放行:
- TCP:8024(bridge)、8081(Web)等。
- UDP:6000-6002(P2P,根据
p2p_port调整)。
- 确保云平台安全组放行:
-
日志排查
- 服务端日志:
/var/log/nps.log(Linux)或当前目录日志文件。 - 客户端日志:当前目录
npc.log或命令行输出(根据启动方式)。
- 服务端日志: