NPS 内网穿透,二次开源版新增多种连接协议(含 P2P 配置)

视频教程:https://www.bilibili.com/video/BV1Y8XsBWEPD

一、为什么从原版 NPS 迁移到 djylb/nps?

原版 NPS(ehang-io/nps)已经多年未维护,随着 Go 版本更新、系统环境变化,编译兼容性和安全补丁逐渐成为问题。社区基于原版做了大量改进和重构,其中 djylb/nps(NPS Enhanced)是目前比较活跃的一个分支,定位是"持续维护、增强版本"。

相对原版,它的主要优势包括:

  1. 持续维护与重构

    项目持续有提交记录,作者对管理后台、P2P 逻辑、协议支持等进行持续优化。

  2. 协议与功能增强

    支持 TCP/UDP 转发、HTTP/HTTPS 反向代理、HTTP/SOCKS5 代理、P2P 模式、Proxy Protocol、HTTP/3 等,覆盖大部分内网穿透场景。

  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

注意几点:

  1. web_username / web_password:第一次启动前务必修改默认密码。
  2. p2p_ip:建议填服务器的公网 IP ,若使用 0.0.0.0 会自动识别,但某些网络环境可能需要手动指定。
  3. 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

  1. 登录 Web 后台(http://服务器IP:8081)。默认账号:admin,密码:123

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

  3. 在内网机器上运行客户端命令(Linux):

    bash 复制代码
    npc -server=你的服务器IP:8024 -vkey=生成的密钥
  4. 在后台"主机隧道"中新增一条 TCP 隧道:

    • 模式:TCP
    • 客户端 ID:选择刚上线的客户端
    • 服务端端口(不填则自动生成):如 60022
    • 目标:192.168.1.100:22
  5. 在公网机器上执行:

    bash 复制代码
    ssh -p 60022 root@你的服务器IP

即可穿透到内网 SSH。

4.2 HTTP 代理:暴露内网 Web 服务

假设内网 Web 服务:127.0.0.1:8080,希望通过域名访问。

  1. 在"主机隧道"中新增 HTTP 代理:

    • 模式:HTTP
    • 客户端 ID:选择对应客户端
    • 域名:test.example.com(提前解析到服务器 IP)
    • 目标:127.0.0.1:8080
  2. 浏览器访问 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 配置

  1. 编辑 conf/nps.conf

    ini 复制代码
    p2p_ip=1.2.3.4         # 服务器公网 IP,不要写域名或 127.0.0.1
    p2p_port=6000          # P2P 打洞起始端口,保持默认即可
  2. 在服务器防火墙 / 安全组中放行:

    P2P服务需要开放一段连续的UDP端口用于打洞通信。

    计算规则:端口范围 = p2p_port p2p_port + 2

    配置示例:若 p2p_port 使用默认值 6000,则需在云服务器安全组或防火墙中放行:

    bash 复制代码
    UDP 6000-6002 
  3. 重启 NPS:

    bash 复制代码
    nps restart

5.3 Web 后台添加 P2P 记录

  1. 登录 Web 后台。

  2. 进入"P2P 连接"页面,点击"新增":

    • 客户端 ID:选择"被访问端"的客户端(即 10.2.50.2 所在客户端)。
    • 目标:填写 10.2.50.2:22
    • 唯一验证密钥:自定义一个复杂密码,例如 p2p_ssh_secret(每条 P2P 记录的密钥不要重复)。
  3. 保存后,页面会给出"访问端命令",类似:

    bash 复制代码
    npc -server=1.2.3.4:8024 -vkey=客户端密钥 -password=p2p_ssh_secret -target=10.2.50.2:22

    这里 客户端密钥 是被访问端客户端的 vkeyp2p_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 会退回到中继模式,流量仍然安全,但会占用服务器带宽。

六、避坑与安全建议

  1. 修改默认密码

    • web_passwordpublic_vkey 以及 P2P 的唯一验证密钥都建议使用复杂密码。
  2. 端口规划

    • 确保云平台安全组放行:
      • TCP:8024(bridge)、8081(Web)等。
      • UDP:6000-6002(P2P,根据 p2p_port 调整)。
  3. 日志排查

    • 服务端日志:/var/log/nps.log(Linux)或当前目录日志文件。
    • 客户端日志:当前目录 npc.log 或命令行输出(根据启动方式)。
相关推荐
倔强的胖蚂蚁2 小时前
openEuler 24.03 LTS SP3 使用指南
运维·云原生
枫桥骤雨2 小时前
Ubuntu配置XRDP远程桌面
linux·运维·ubuntu·xrdp
2401_877274242 小时前
System V 共享内存:Linux 最高性能 IPC 的设计与实现
linux·服务器·c语言
hljqfl2 小时前
银河麒麟桌面操作系统更改ROOT密码
linux·运维·服务器
哈__2 小时前
VERT:本地文件转换自由,随时随地轻松实现
linux
TG_yunshuguoji2 小时前
阿里云代理商:百炼声音复刻实战 3 步生成专属语音模型
服务器·人工智能·阿里云·云计算
今儿敲了吗2 小时前
Linux学习笔记第二章——虚拟机基础操作
linux·笔记·学习
物联网软硬件开发-轨物科技2 小时前
【技术白皮书】安全与加密机制:保障工业物联网设备数据接入安全的技术白皮书
运维·物联网·安全
博语小屋2 小时前
Reactor、epoll下设计一个简单的网络版本计算器
服务器·开发语言·网络·网络协议·http·php