前言
在之前的文章中,我们介绍了两种内网穿透工具frp和zerotier。frp可参照《利用frp工具实现内网穿透、随时随地访问内网服务》,zerotier可参照《ZeroTier实现内网穿透、异地组网》。
应当说各个工具均有其各自的优缺点,zerotier的缺点主要集中在:①安全性比较低;②免费版连接数量有限制;③每个终端均需要安装客户端。frp虽然避免了连接数量限制、每个终端安装客户端的麻烦,但其存在:①连接稳定性不够,比如长时间不使用后,客户端与服务端会出现连接超时的情况;②访问端自建立连接后、间隔一段时间再访问服务会出现响应较慢的情况;③管理界面不够友好,无法手动配置。
那么有没有一种工具可以同时解决以上问题呢,答案就是:NPS。实际上,NPS这款工具我也是在上一篇frp文章分享的底部评论中首次听说,这几天趁着空闲时间,研究了一下,果然非常强大!今天就带着实操案例和大家简单分享一下。
一、NPS简介
1.关于NPS
一款轻量级、高性能、功能强大的内网穿透代理服务器。支持tcp、udp、socks5、http等几乎所有流量转发,可用来访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析、内网socks5代理等等……,并带有功能强大的web管理端。
NPS项目地址:https://github.com/ehang-io/nps
2.NPS常见用途
- 做微信公众号开发、小程序开发等----> 域名代理模式
- 想在外网通过ssh连接内网的机器,做云服务器到内网服务器端口的映射,----> tcp代理模式
- 在非内网环境下使用内网dns,或者需要通过udp访问内网机器等----> udp代理模式
- 在外网使用HTTP代理访问内网站点----> http代理模式
- 搭建一个内网穿透ss,在外网如同使用内网vpn一样访问内网资源或者设备----> socks5代理模式
3.NPS特点
- 协议支持全面,兼容几乎所有常用协议,例如tcp、udp、http(s)、socks5、p2p、http代理...
- 全平台兼容(linux、windows、macos、群晖等),支持一键安装为系统服务
- 控制全面,同时支持服务端和客户端控制
- https集成,支持将后端代理和web服务转成https,同时支持多证书
- 操作简单,只需简单的配置即可在web ui上完成其余操作
- 展示信息全面,流量、系统信息、即时带宽、客户端版本等
- 扩展功能强大,该有的都有了(缓存、压缩、加密、流量限制、带宽限制、端口复用等等)
- 域名解析具备自定义header、404页面配置、host修改、站点保护、URL路由、泛解析等功能
- 服务端支持多用户和用户注册功能
二、安装部署
NPS提供了多种安装方式,分别为安装包安装、源码安装以及docker安装。我们这里选用的是安装包安装。
1.个人需求
1)远程桌面
在家中的Windows电脑上访问公司的Windows办公电脑。
2)访问指定内网服务
在任意可以访问互联网的终端设备的浏览器上访问公司内网服务器部署的gitlab、jira、Jenkins等内网服务,满足出差或居家办公需求。
2.部署规划
部署NPS同样需要一台带有公网IP地址的服务器,用于与内网服务的端口之间建立映射关系,IP地址假设为1.1.1.1;
服务器 |
地址 |
用途 |
公网服务器 |
1.1.1.1 |
部署服务端 |
内网服务器1 |
192.168.1.123 |
部署客户端 |
内网Windows办公电脑 |
192.168.1.131 |
部署客户端 |
其他Windows或Mac设备 |
- |
能上网即可,用于访问内网服务 |
2.安装服务端
1)下载解压安装包
下载对应的系统版本即可,服务端和客户端是单独的,因此需要下载多份文件。
将下载下来的服务端压缩包上传到公网服务器上并解压:
tar -xvf linux_amd64_server.tar.gz
2)目录解读
解压成功后,会得到以下文件及目录:
- nps文件:nps的服务端可执行的shell文件;
- conf目录:存放服务端配置文件等;
- web目录:存在web管理页面所需的css、html文件等;
2)安装NPS
./nps install
3)启动NPS服务
nps start# 停止和重启可用stop和restart
如果发现没有启动成功,可以使用nps(.exe) stop,然后运行nps.(exe)运行调试,或查看日志(Windows日志文件位于当前运行目录下,linux和darwin位于/var/log/nps.log)
4)前台访问
http://公网ip:8080访问nps登录页面:
使用用户名和密码登录(默认admin/123,正式使用一定要更改,可以通过conf/nps.conf文件修改)
5)新增客户端
在web管理页面--客户端,点击“新增”创建一个客户端,填写内容如下:
- 备注:就是这台客户端的备注信息,比如可以取名为这台设备的内网地址;
- 唯一验证密钥:用于后面客户端连接服务端时使用;
创建,点击客户端前面的+号,会自动展开并展示客户端命令,复制此条命令,后面会用到。
创建Windows和Linux客户端步骤一样,没有任何区别,只要设置的唯一验证密钥不一致,并且你能区分开哪个是Linux的、哪个是Windows的即可。
3.Linux安装客户端
1)下载解压安装包
将下载下来的客户端上传到内网服务器,随后进入文件所在目录并解压:
tar -xvf linux_amd64_client.tar.gz
2)连接服务端
在客户端终端上执行前面复制的命令,连接服务端(linux直接执行即可,windows将./npc换成npc.exe用cmd执行)。其中vkey就是我们前面创建客户端时设置的唯一验证密钥。
./npc -server=服务端IP:8024 -vkey=linux对应的密钥 -type=tcp
注意,如果出现如下图所示的连接超时情况,很可能是服务端所在的云服务器的安全组或防火墙没有放开8024端口
需要到安全组设置中放开8024端口:
再次执行连接命令,即可连接成功:
此时,web管理端中该客户端的连接就会处于在线状态:
3)注册到系统服务(可选)
上述在终端命令行执行连接命令,连接成功后一直处于前台执行,其他什么也做不了,一旦Ctrl+C就会强行终止,带来诸多不便,除非另开一个终端窗口。此时可以将其注册到系统服务,从而实现后台运行:
./npc install -server=服务端IP:8024 -vkey=linux对应的密钥 -type=tcp npc start# 启动客户端,停止和重启可用stop和restart
4.Windows安装客户端
1)下载解压安装包
将下载下来的客户端复制到需要穿透的内网Windows电脑,随后进入文件所在目录,使用解压工具进行并解压,解压成功后会得到以下文件及目录:
注意:npc-update.exe是后面启动客户端成功后生成的,不是一开始解压出来的。
2)连接服务端
在客户端终端上执行前面复制的命令,连接服务端(windows将./npc换成npc.exe用cmd执行)。其中vkey就是我们前面创建客户端时设置的唯一验证密钥。
npc.exe -server=服务端IP:8024 -vkey=Windows对应的密钥 -type=tcp
此时,web管理端中该客户端的连接就会处于在线状态:
3)注册到系统服务(可选)
npc.exe install -server=服务端IP:8024 -vkey=Windows对应的密钥 -type=tcp npc.exe start# 启动客户端,停止和重启可用stop和restart
此时在NPC已注册到Windows系统服务列表中,且处于正在运行状态:
注意: 如果需要更换命令内容需要先卸载npc.exe uninstall,再重新注册 。
三、配置穿透服务
我们本次的主要目的是通过TCP隧道实现远程桌面以及jira等内网服务的远程访问,所以会重点讲解TCP隧道的配置过程。
1.远程桌面(TCP隧道)
场景:想通过访问公网服务器1.1.1.1的6000端口,连接内网Windows个人办公电脑的3389(Windows远程桌面默认端口),实现远程桌面的连接。
1)创建TCP隧道
服务端端口填写6000,内网端口填写3389,可以不带ip地址,前提是客户端ID要是Windows那台设备对应的ID,另外公网服务器的安全组中需放开6000端口。
2)访问远程桌面
特别注意:被远程访问的电脑,需要提前在设置中打开允许被远程访问。
① 在其他可以访问互联网的Windows电脑上,通过win+R键调出运行窗口,输入mstsc回车
② 随后在弹出的远程桌面连接窗口中输入公网IP地址:6000,并点击连接。需注意用户名填写正确。
③ 填写该用户的访问密码,即锁屏密码
④ 用户名及密码正确,连接后会显示远程桌面的内容
2.内网服务映射(TCP隧道)
场景: 想通过访问公网服务器1.1.1.1的8888端口,连接内网机器192.168.1.123的8888端口,实现内网8888端口所在服务的访问。具体步骤如下:
1)创建TCP隧道
在刚才创建的客户端隧道管理中添加一条tcp隧道,填写监听的端口(8888)、内网目标ip和目标端口(192.168.1.123:8888),保存。
如下图列表所示,我在多台服务器上分别安装了客户端,并配置了多个内网服务(指定端口)的隧道转发
2)访问内网服务
① 访问mayfly-go
在之前的文章中分享过mayfly-go,详情可参照《一站式Linux&数据库管理平台mayfly-go》。访问公网服务器ip:8888,就相当于访问内网192.168.1.123:8888,访问页面如下:
通过穿透后的mayfly-go,即可随时随地在web端的ssh终端操作管理内网服务器以及内网服务器了,nice!
② 访问jira
jira部署在内网的211服务器上,端口为8088,访问公网IP:8088,也就相当于访问192.168.1.211:8088。
如果因为疫情居家办公,bug库部署在内网上,而恰好又需要提单或修复bug,通过这种内网穿透进行访问bug库倒也不失为一种好的选择。尽管受限于公网服务器的带宽限制,访问速度可能会稍微慢一些,不过聊胜于无。
小结
以上就是NPS的简单介绍,以及利用NPS实现远程桌面与内网服务穿透访问的全过程。总体来说,NPS比zerotier更加安全,没有连接数量上的限制;比frp反应速度更快,且支持可视化配置,省去因修改客户端配置而导致的来回重启客户端的麻烦。
除了上述提到的TCP转发外,NPS还提供了多种内网穿透模式:
- 域名解析
- UDP隧道
- Socket5代理
- HTTP正向代理
- 私密代理
- P2P服务
由于时间仓促,我还没有来得及一一试用,大家感兴趣的可以对照官方文档自行体验。也欢迎留言与我交流!