Contents
之前写过一篇利用frp实现Mac的内网穿透的文章,刚好最近在和群里的大佬@九歌
谈论内网http文件服务器部署,又想起了穿透这回事。之前群友向我推荐nps这个开源项目,趁此机会上手体验了一番,以下是我的部署过程和体会。
交流群:Newlearnerの水群
项目介绍与部署
-
nps简介
NPS是一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式。
所以这是一款集「代理」和「穿透」于一体的工具,我认为最大的优点就是图形化。
相比于frp、ngrok等,你不需要配置繁琐的客户端与服务端文件,只需要搭建好web管理环境,就可以用图形化界面配置客户端。
-
项目结构
nps├── conf (server配置文件)│ ├── clients.json│ ├── nps.conf│ ├── tasks.json│ └── hosts.json├── web(web端静态页面)│ ├── static│ └── views└── nps(二进制文件)npc├── npc.conf (client配置文件)└── npc(二进制文件)
-
服务端部署
项目releases地址:github—nps
支持Linux、Windows、Mac和安卓,下载时候注意对应架构和操作系统位数。下载完毕解压,运行二进制文件即可。
1 2 3 4 5 6 7 |
cd /path/to/nps #Mac/Linux ./nps test|start|stop|restart|status 测试配置文件|启动|停止|重启|状态 #Windows nps.exe test|start|stop|restart|status 测试配置文件|启动|停止|重启|状态 |
不得不承认nps的守护进程真的省了很多事,赞一个!
当然你也可以用docker部署,前人之述备矣:Docker安装一个带web界面的内网穿透工具-nps
配置文件详解
-
服务端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#HTTP(S) 代理 http_proxy_ip=0.0.0.0 http_proxy_port=80 https_proxy_port=443 https_just_proxy=true #https证书存放路径 https_default_cert_file=conf/server.pem https_default_key_file=conf/server.key #服务端与客户端连接方式 bridge_type=tcp/udp/kcp bridge_port=8024 bridge_ip=0.0.0.0 #客户端连接服务端密钥 public_vkey=123 #web web_host=服务端域名(如果有的话) web_username=admin web_password=123 web_port = 8080 web_ip=0.0.0.0 |
-
客户端
因为nps有其自身的特点,可以在web端处理客户端的配置,因此在这里不详细阐述客户端的配置方式。
请参照client文件给出的参考配置和客户端文档。
-
web端
部署好服务端之后就可以根据指定的ip和端口登录web管理界面了,如图所示。nps的web界面做的十分优秀,我们可以直接在里面设置client端,并进一步设置客户端需要的代理和穿透方式,十分方便并且容易上手。
实战示例
-
给Mac做ssh内网穿透
首先在「设置」—「共享」中开启远程登录。
打开web端,新建一个客户端,输入服务端的代理端口以及用于认证的vkey即可。
保存之后可以看到「客户端」一栏中多了我们刚刚添加的名为MacBook Pro的项目,接着点击tunnel。
在tunnel里面我们配置访问ssh的服务器端口(外网port)和Mac的ssh port(内网端口),传输方式为tcp。
填写目标的时候注意ip地址即为内网设备获得的内网ip,如192.168.x.xxx等。如果你的内网ip会变动,这里直接填写端口即可。
web端配置好之后开始运行客户端,此时client的二进制文件完全可以丢开本地的客户端配置,灵活的对应上刚刚配置好的内容。客户端支持无配置文件启动模式是我写第二篇内网穿透工具介绍的主要原因。
1 2 3 4 5 6 7 |
#打开终端 cd /path/to/npc ./npc -server 服务端ip/域名:端口 -vkey=xxxxxx 如果觉得一直开着进程不妥当,可以在command后面加上&,挂载后台运行即可,期间不可关闭terminal 想要关闭进程,输入killall npc |
- 给Mac做VNC穿透
觉得用ssh看命令行不过瘾?不如我们来远程桌面吧!
在「设置」—「共享中」打开屏幕共享,记得加上一个访问密码。
按照案例一的做法,其他不变,将端口更改为5900即可。Mac上的VNC viewer默认访问地址的端口是5900,所以最好把内网端口和服务端的端口都设置成5900。
下载VNC viewer:传送门
即可享受远程的“乐趣”,服务器与本地网络连接速度太慢请不要轻易尝试,卡顿感十足。
-
Mac文件服务器和静态页面部署
安装caddy,并配置好Caddyfile
如下:
1 2 3 4 5 6 7 |
:2015 { browse } :2016{ gzip root /srv/www } |
启动caddy,在nps的web管理界面按实例一的方法配置好tcp端口,并解析域名到服务器ip,输入域名和端口即可访问。由于nps支持端口复用,将bridge_port
、 http_proxy_port
、 https_proxy_port
、web_port
都设置为同一端口,也能正常使用。因此我们可以通过域名来区分不同的web页面。
通过穿透2015端口,我们在外网可以访问到Mac的文件。我认为caddy做的file index页面挺好看的,如果觉得不安全还可以使用filebrowser这个项目。打开后如下图:
通过穿透2016端口,访问部署在Mac上面的静态网页。
当然,如果你觉得输入域名+端口还不够简洁,想要让全部网页走80/443,也可以借助服务端的nginx做反代,nginx配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
server { listen 80; server_name xxxx.xx; location / { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8024; } } server { listen 443; server_name xxxx.xx; ssl on; ssl_certificate certificate.crt; ssl_certificate_key private.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8024; } } |
其他
nps还有很多其他花里胡哨的功能,可惜我用不到。相信需求不同的人使用nps的功能也不尽相同,所以简单阐述一下我没有提及的功能。详细的文档请到github看readme:github—nps
- p2p穿透
- 内网socks5代理
- 内网安全私密代理
- 简单的内网文件访问服务,实际上配合内网电脑的http服务器(caddy等)更加,并且局域网内可共享
- 代理到服务端本地,避免和服务器的web环境冲突
- webAPI
- 端口范围限制、连接数/流量限制、白名单、限制访问ip等
我个人觉得nps是比frp易上手、功能丰富的,但是nps仍然存在一些问题:比如在web管理界面设置tcp隧道等传输协议时,时常发现不能在网页上及时显示出设置好的配置。此时tcp隧道实际已经设置成功但web界面仍然不显示(V0.23.1)。希望后续的版本能够改进。
还有一个问题就是稳定性,这点来讲frp做的好些,毕竟功能不是这么丰富,也希望后续的更新能够慢慢完善这些问题!
就酱,等以后有了路由器和nas、树莓派之后,这些穿透项目的运用可能会变得频繁些。还是先种草吧!