本文部分内容是本人撰写后经由 AI 润色的
NPS 是一款设计精致、性能出众且功能齐全的内网穿透代理服务器解决方案。
它支持 TCP、UDP、SOCKS5 代理、HTTP 代理等多种数据转发类型,大幅增强了对内网资源的访问能力。
使用 NPS,用户可以轻松完成访问内部网站、安全调试本地支付接口、SSH 远程连接、远程桌面控制、内网 DNS 解析服务以及建立内网 SOCKS5 代理等多种应用场景。
NPS 提供了一个直观的 Web 管理面板,而且其客户端连接时无需任何配置文件,这在功能上远超过 Frp。
服务端和客户端是单独的。服务端称为 NPS,客户端软件称为 NPC(NPS Client)。NPS 项目的 Release 文件包括了 NPS 和 NPC 两部分。
NPS 具有以下特点
- 协议支持全面,兼容几乎所有常用协议,例如 tcp、udp、http(s)、socks5、p2p、http 代理。
- 全平台兼容(linux、windows、macos、群辉等),支持一键安装为系统服务,亦可直接运行调试。
- 控制全面,同时支持服务端和客户端控制。
- https 集成,支持将后端代理和 web 服务转成 https,同时支持多证书。
- 操作简单,只需简单的配置即可在 web ui 上完成其余操作。
- 展示信息全面,流量、系统信息、即时带宽、客户端版本等
- 扩展功能强大,具有缓存、压缩、加密、流量限制、带宽限制、端口复用等功能
- 域名解析具备自定义 header、404 页面配置、host 修改、站点保护、URL 路由、泛解析等功能
- 服务端支持多用户和用户注册功能
由于原作者长时间不更新 NPS,这里使用 yisier 修改的的分支版本,大体使用和原版无异。
NPS 服务端安装
以 AMD64 架构下 Debian 11 系统为例进行展示,在 Releases · yisier/nps (github.com) 里找到对应系统架构的文件,注意服务端要选 server 字样的。
# 创建一个名为 NPS 的目录
mkdir NPS
# 进入 NPS 目录
cd NPS
# 下载 nps 服务器二进制文件的压缩包(发稿时最新版本是 0.26.19,以实际情况为准)wget https://github.com/yisier/nps/releases/download/v0.26.19/linux_amd64_server.tar.gz
# 列出当前目录下的文件和目录(此时应该只看到下载的压缩包)ls
# 输出应该类似于:# linux_amd64_server.tar.gz
# 解压压缩包
tar -xzf linux_amd64_server.tar.gz
# 再次列出当前目录下的文件和目录(此时应该看到解压后的内容)ls
# 输出可能类似于(具体取决于压缩包中的内容):# conf linux_amd64_server.tar.gz nps web
在当前目录下,直接运行
./nps
即可以默认配置直接启动 NPS 服务器,此时使用的是 /NPS/conf/nps.conf 的配置(即二进制文件目录下的 conf 文件)
Ctrl+ C 可以终止进程
用于正式环境时,请将 nps 注册为系统服务,使用如下命令
sudo ./nps install
此时 NPS 会在 /etc/nps/conf 下生成 nps.conf 配置文件,随后均以该配置文件为准
nano /etc/nps/conf/nps.conf
配置文件说明:
appname = nps
#Boot mode(dev|pro)
runmode = dev
## 下面是 http/https 代理使用的默认端口
#HTTP(S) proxy port, no startup if empty
http_proxy_ip=0.0.0.0
http_proxy_port=80
https_proxy_port=443
https_just_proxy=true
#default https certificate setting
https_default_cert_file=conf/server.pem
https_default_key_file=conf/server.key
#用于和 NPC 客户端链接的配置
##bridge
bridge_type=tcp
bridge_port=8024 #NPC 客户端链接的端口,NPC 客户端会与 NPS 服务端的 bridge_port 保持链接,请确保该端口可被访问。bridge_ip=0.0.0.0
# Public password, which clients can use to connect to t>
# After the connection, the server will be able to open >
public_vkey=123
#Traffic data persistence interval(minute)
#Ignorance means no persistence
flow_store_interval=1
# log level LevelEmergency->0 LevelAlert->1 LevelCritic>
log_level=6
log_path=nps.log
#Whether to restrict IP access, true or false or ignore
#ip_limit=true
#p2p
#p2p_ip=127.0.0.1
#p2p_port=6000
## 下面是用于 Web 管理 NPS 面板的信息,如需使用域名访问控制面板,请把域名解析到 NPS 服务器的 IP,然后把下面 web_host 改为你的域名。## 用户名和端口需要注意修改
#web
web_host=a.o.com
web_username=admin
web_password=123
web_port = 8081
web_ip=0.0.0.0
web_base_url=
web_open_ssl=false
web_cert_file=conf/server.pem
web_key_file=conf/server.key
# if web under proxy use sub path. like http://host/nps >
#web_base_url=/nps
#Web API unauthenticated IP address(the len of auth_cryp>
#Remove comments if needed
#auth_key=test
auth_key=123
#获取服务端 authKey 时的 aes 加密密钥,16 位
auth_crypt_key =213
#allow_ports=9001-9009,10001,11000-12000
#Web management multi-user login
allow_user_login=false
allow_user_register=false
allow_user_change_username=false
#extension
#流量限制
allow_flow_limit=true
#带宽限制
allow_rate_limit=true
#客户端最大隧道数限制
allow_tunnel_num_limit=true
allow_local_proxy=false
#客户端最大连接数
allow_connection_num_limit=true
#每个隧道监听不同的服务端端口
allow_multi_ip=true
system_info_display=true
#获取用户真实 ip
#获取用户真实 ip
http_add_origin_header=true
#cache
http_cache=false
http_cache_length=100
#get origin ip
#http_add_origin_header=false
#pprof debug options
#pprof_ip=0.0.0.0
#pprof_port=9999
#client disconnect timeout
disconnect_timeout=60
#管理面板开启验证码校验
open_captcha=true
# 是否开启 tls
tls_enable=true
tls_bridge_port=8025
NPS 存在严重的未授权访问漏洞,未授权用户可伪造请求,具体参考以下:
参见:NPS 未授权访问漏洞详解 – FreeBuf 网络安全行业门户
NPS 反制之绕过登陆验证 (huclilu.github.io)
解决方案:去除 #auth_key=test 前的注释,auth_key 和 auth_crypt_key 改为随机值
保存并关闭 nano,
sudo nps start
即可启动 nps
此时可通过
sudo nps status
来查看 NPS 的运行情况,
图片中的错误信息指示 8081 和 443 端口被占用
sudo npc start
和
sudo npc stop
进行启动停止,无需人为干涉。
NPC(客户端)默认是不需要进行参数配置的,只需要程序本身和一行命令即可,使用起来极其方便。
当 NPC 与 NPS 建立链接后,即可在 NPS 面板上操作,无需理会 NPC
此外,如需更改注册参数(如更换 NPS 服务器),需要
sudo npc uninstall
卸载后,再次执行 install。
需要注意的是,也可以直接运行:./npc -server=1.1.1.1:8024 -vkey=verifykey -type=tcp 运行,在 ssh 中观察情况。
注意,这种情况下,ssh 断开后立刻停止
在临时调试时,也可以使用 nohup ./npc -server=1.1.1.1:8024 -vkey=verifykey -type=tcp >/var/npClient/nps.txt &
命令,让 npc 在后台运行。此时,使用
ps -ef
找到 npc 进程的 id 后,kill。即可停止运行。这种情况在测试时相对方便。