内网穿透工具NPS搭建

前置条件

一台具有固定公网IP地址、可以配置安全组的服务器,且已安装docker compose服务

足够的服务器带宽,建议≥5Mbps

(可选)可进行域名解析的服务器,以便于通过域名访问管理的web端

项目来源

NPS原版项目地址:https://github.com/ehang-io/nps

NPS优化二开项目地址:https://github.com/yisier/nps/

NPS优化二开项目文档:https://yisier.github.io/nps/

因NPS原版项目于2021年4月8号发布 v0.26.10 以后就没有更新,所以有热心大佬基于NPS原版项目进行额外维护,修复了原版项目的严重bug,优化了使用配置流程。以下安装都基于NPS优化二开项目进行配置。

安装配置

服务端是基于一台安装Rocky Linux 9的阿里云ECS服务器(主要用于运行NPS服务),一台已备案的安装Ubuntu 24.04LTS、宝塔面板的腾讯云服务器(主要用于域名解析),个人域名解析在腾讯云配置

受控客户端是一台Windows11的电脑

核心逻辑​:先建立目录结构 -> 初始化防崩溃数据库文件 -> 编写配置文件 -> 启动容器。

1.准备工作

https://github.com/yisier/nps/releases 下载同一个版本下的服务端和客户端代码,以当前安装环境为例,应该下载的文件是

服务端文件名称:linux_amd64_server.tar.gz

客户端文件名称:windows_amd64_client.tar.gz

2.阿里云ECS服务器

登录阿里云的ECS服务器,切换成root账户登录

1. 初始化目录与数据库

# 1. 创建项目主目录 (建议放在 /opt 或 /data 下 , 这里以 /opt 为例)
mkdir -p /opt/nps/conf

# 2. 进入配置目录
cd /opt/nps/conf

# 3. 初始化核心数据库文件 (至关重要!)
# clients.json: 存储所有客户端(NPC)的验证密钥、备注等信息
echo "[]" > clients.json

# tasks.json: 存储所有隧道(TCP/UDP)的端口映射规则
echo "[]" > tasks.json

# hosts.json: 存储域名解析规则 (如果不使用泛域名解析,此文件为空但也必须存在)
echo "[]" > hosts.json

2. 创建核心配置文件 (nps.conf​)

# 在 /opt/nps/conf 目录下创建
vi nps.conf

​nps.conf​ 详细配置内容:

# --- 基础配置 ---
appname = nps
# 运行模式:dev(开发) 或 pro(生产),dev 模式下日志更详细
runmode = dev

# --- 核心通信端口 ---
# [重要] 客户端(NPC)连接服务端的端口
# 需要在云服务器防火墙放行此端口 (TCP)
bridge_port=7001

# --- Web 管理后台配置 ---
# Web 管理界面访问端口 (如 http://IP:8080)
# 需要在云服务器防火墙放行此端口 (TCP)
web_port=7002

# Web 界面登录用户名
web_username=admin
# [必改] Web 界面登录密码 (请务必修改为强密码)
web_password=DTWjgeQ74Nu9RM8nP8AD

# --- 端口防冲突配置 ---
# 为了防止 NPS 占用了服务器原本的 80/443 端口 (通常被 Nginx/1Panel 占用)
# 我们将 NPS 的 HTTP 代理端口改为非常规端口
http_proxy_port=7003
https_proxy_port=7004

# 绑定 IP,0.0.0.0 代表允许所有外网连接
bridge_ip=0.0.0.0

# --- 高级限制与鉴权 ---
# 最大并发隧道数量
max_tunnel_num=100
# 最大客户端连接数
max_client_num=50
# 默认的公共连接密钥 (通常用不上,我们在网页端为每个客户端单独设置 vkey)
public_vkey=123

# 是否允许在 Web 界面进行用户注册 (个人使用建议关闭,更安全)
allow_user_login=false
allow_user_register=false

# --- 端口开放范围 ---
# 限制网页上可以随意开启的端口范围,防止误占用系统端口
allow_ports=900-65500

数据交互端口:7001(主要服务端口)7002(web管理后台端口)7003(http代理端口)7004(https代理端口)

web管理后台的登录用户名和密码是web_username、web_password的配置项

3. 编写 Docker Compose

# 回到项目主目录 /opt/nps
cd /opt/nps
vi compose.yml

compose.yml​ 内容:

services:
  nps:
    # 使用社区维护的活跃镜像,替代原版 ffdfgdfg (已停更)
    image: yisier1/nps
    container_name: nps
    restart: always
    
    # [核心配置] Network Mode: Host
    # 容器直接共享宿主机(云服务器)的网络栈。
    # 优势:
    # 1. 性能最好,没有 NAT 损耗。
    # 2. 网页后台新增端口映射时,无需修改 compose 文件,无需重启容器,立即生效。
    network_mode: host
    
    volumes:
      # 将宿主机的配置目录挂载到容器内部
      # 包含了 nps.conf 和我们刚才初始化的 json 数据库
      - ./conf:/conf

4. 启动

# 启动服务
docker-compose up -d

# 查看日志 (确认无报错)
docker logs -f nps

3.阿里云防火墙配置

以上 nps.conf 配置的端口需要在阿里云防火墙上打开授权,否则会访问不通。

提前规划自己需要的端口,其中上面nps.conf已经用到的服务必须端口:7001(主要服务端口)7002(web管理后台端口)7003(http代理端口)7004(https代理端口),这些是必须要开启的

同时自己需要给每个受控客户端分配端口,比如我给我的未来受控端分配的端口是7011-7020,下面就会进行配置

阿里云控制台–>云服务器 ECS–>选择自己的ECS服务器–>进入之后选择安全组–>选择绑定的安全组,如果有多个选任一即可
入方向–>增加规则

配置类型自定义配置
授权策略允许
优先级1
协议自定义TCP
访问来源(ipv4) 0.0.0.0/0任何位置
只有这样能保证在任何网络下都能够连接和访问对应端口
访问目的(端口)可以用 / 表示端口起止范围,如果有多条,可以以数字逗号隔开
eg:7001/7004,7011/7011
或者更宽泛一些 7000/7020
描述NPS服务端口

点击提交即可

4.腾讯云服务器

1. DNS域名管理

进入域名解析界面,新增一条 Web管理后台域名 nps.tutuspring.com 的解析A记录,A记录的地址指向当前腾讯云服务器

2. 登录宝塔面板,网站–>PHP项目–>添加站点

域名nps.tutuspring.com
PHP版本纯静态

3. 点击新创建的站点

点击SSL,配置对应的SSL证书

点击反向代理,添加反向代理,打开高级功能

代理名称nps
代理目录/
目标URLhttp://<阿里云ecs服务器公网IP地址>:7002
eg:http://182.92.118.102:7002
发送域名182.92.118.102

4. 测试管理界面打开是否正常

访问 https://nps.tutuspring.com 即可登录nps的管理web端,用户名和密码为之前在nps.conf配置文件里面配置的,建议登陆以后第一时间修改密码,登录后查看“仪表盘”界面的显示信息是否和配置的一致

5.NPS的Web管理后台

登录 https://nps.tutuspring.com 网站

1.新增客户端

左侧列表 客户端–>新增

备注一般为设备名
eg:UM880Pro
Basic 认证用户名保持默认
Basic 认证密码保持默认
唯一验证密钥保持默认
允许客户端通过配置文件连接
启用IP白名单
IP黑名单(防暴力破解)保持默认
到期时间保持默认

点击新增后

2.新增隧道

在客户端列表页,点击刚刚新增记录的最右侧的 隧道 按钮 –> 进入隧道列表 –> 新增

模式TCP隧道
客户端 ID不用修改,查看是否是自己刚刚添加的客户端即可
备注根据用途填写,用来标识该端口的作用
eg: MSTSC
服务端端口(留空自动生成)阿里云服务器的端口,需要在ECS防火墙上打开该端口,如果使用内网穿透的服务比较多,建议创建表格进行记录和梳理
eg:7011
目标 (IP:端口)需要内网穿透电脑的IP地址,如果是客户端当前电脑,IP可以直接填写127.0.0.1,端口写自己需要透传的端口,3389是Windows远程连接的默认端口
eg:127.0.0.1:3389
Proxy Protocol Version建议留空,不要设置。

点击新增。

3.复制启动命令

点击左侧菜单栏的“客户端”,在展示的客户端列表中,点击刚刚添加的客户端所属行前面的加号,展出的详情里面,点击“快捷启动命令”后面的复制按钮

6.受控端-Windows客户端

登录受控端Windows电脑,检查电脑的远程连接开关已开启,当前电脑账户的登录密码已设置,能够在锁屏后输入密码进行登录。

在非系统盘(即非 C 盘)下创建一个路径没有空格(不能是Program Files、Program Files (x86)这样的目录)的npc文件夹

在电脑D盘下,创建 D:\GreenSoft\npc 目录,并在npc目录下,把上面的客户端 windows_amd64_client.tar.gz 移动到当前目录并解压,删除冗余的压缩包后,D:\GreenSoft\npc 目录仅需要留 npc.exe文件即可

右键点击npc.exe,选择“以管理员权限运行”,在出现的黑窗口根据显示内容,输入 1,然后粘贴在Web后台管理复制的“快捷启动命令”的那串字符串,回车。没有报错信息后,就可以输入 0 关闭,或者直接关闭黑窗口。

7.测试连接端

1. 测试设备是Windows时,使用的客户端可以是Windows自带的RDP客户端,如果需要远程连接多个电脑,建议下载并安装开源工具1Remote,下载地址:https://github.com/1Remote/1Remote/releases

2. 远程连接设备是IOS时,需要去 Apple应用商店下载 Windows App mobile(原先的远程桌面)

3. 远程连接设备是Android时,暂时没有测过。

连接填写内容:

地址<阿里云ECS服务器的公网地址>
eg:182.92.118.102
端口<需要访问的受控端,对应的端口>
eg:7011
用户名<受控端电脑的登录用户>
密码<受控端电脑的登录密码>

FAQ

1.远程访问以后,可以连接,但会每隔几秒出现断连情况

检查受控电脑启动的后台程序,有没有流量过滤的软件,此类软件有Adguard、火绒、clash翻墙软件等,他们对于流量会进行二次处理,进而影响连接的稳定性。

如果受控电脑安装了Adguard客户端 v8.0+,需要设置下面两个地方才能使内网穿透功能稳定

1. Adguard客户端–>应用管理–>搜索npc–>找到受控端电脑的npc,点击配置–>关闭通过 AdGuard 路由流量、关闭过滤流量、关闭过滤 HTTPS 流量

2. 如果在nps的Web管理后台,其中隧道–>目标(IP 端口) 填写了127.0.0.1,就涉及到了本地回环问题

设置–>应用设置–>高级设置–>关闭 过滤localhost连接

重新启动Adguard,然后再次进行连接即可

参考连接:

https://www.lvtu.site/archives/nps-fu-wu-duan-bu-shu NPS 服务端部署 docker
https://www.lvtu.site/archives/npc-ke-hu-duan-bu-shu NPC 客户端部署 docker
https://github.com/1Remote/1Remote
https://github.com/yisier/nps/
https://yisier.github.io/nps/
https://github.com/ehang-io/nps

© 版权声明
THE END
喜欢就支持一下吧
点赞1 分享
真不错鸭的头像-真不错鸭
评论 抢沙发

请登录后发表评论

    暂无评论内容