背景
跟很多人一样,我也有很多理由和原因需要穿透内网,最主要的是我建立了一个私有部署的密码保管箱(可以搜我的博客或者点击这里/post),需要随时从外网访问。
开源的内网穿透有很多工具,frp,nps,zerotier,总之各有各的特点,我用过好几种,我最终的选择是nps,原因是配置比较简单
内网穿透的原理
nps和npc分别是服务端和客户端,原理是服务端运行在外网的vpc上,内网的客户端主动连接过去建立一个私有通道,后续服务器接到的请求(可以区分TCP/UDP)会根据私有协议通过上述私有通道发回给客户端,由于客户端位于内网里面,客户端可以访问内网上的资源(例如一个web站点),客户端在内网资源上获取数据后,返回给服务端,服务端再原路返回给用户。
之所以要介绍一下原理,是因为理解原理之后可以帮助理解服务端和客户端的配置。 其实frp也是类似的原理。但zerotier是通过创建虚拟网络进行组网来实现相互访问的。
还要说一下的是,一个nps服务端可以被多个客户端连接,客户端之间互不干扰。
服务器配置
下载
github上有release版本直接下载二进制文件,选择你系统对应的文件下载,我的云vpc是ubuntu20的,所以我用“linux_amd64_server.tar.gz”这个。
wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.gz
tar xzf linux_amd64_server.tar.gz
配置
由于我的云vpc是Oracle Cloud薅羊毛来的,1cpu+1G内存,干不动docker啥的,所以我就在上面直接安装nps了,就不再搞docker这些了。
下载并解压后,进入解压目录里面,打开nps.conf文件,注意修改以下几个地方
runmode = dev #可以改为pro
...
bridge_port=8024 #可改可不改
...
public_vkey=KDeioeDJFK3647834DJLKFkjkld#$DHJK #这个是客户端用于连接的,改复杂些
...
web_username=admin
web_password=&^*DFJKLfhdjYU4538732GJfdu #web访问密码
web_port = 8080 #改为你自己的端口,等下通过这个端口访问服务端的web界面
好了,记下上述vkey和password,后面我们要用的,下面开始安装
sudo ./nps install
然后,非常重要的是:要把云vpc的防火墙上对应的端口打开,以上述配置为例,至少以下端口要开放:8024,8080,后续给应用添加访问端口时也要记得到这里来修改,比如我们增加一个9022端口穿透到内网一台机器上ssh的22端口,那么9022就需要暴露给外网。
运行
安装之后,安装位置的nps和nps.conf文件就可以删除了,nps.conf会被拷贝到“/etc/nps/“目录里,“nps”二进制文件会被拷贝到“/usr/bin"目录,可以用“which nps” 进行查看位置。
现在可以在任意位置运行
sudo nps start
Web管理
如果你的云vpc的公网IP是“172.11.12.13”,用上面设置的用户名和密码来登录:
http://172.11.12.13:8080
登录后
界面如下,具体的配置我会在“内网穿透(二)”中结合客户端安装来介绍
点击“客户端” 来新增一个客户端,在弹出的对话框中全部默认直接点最下面的“新增”
这样会新增一条客户机信息,注意“唯一验证密钥”不要公布,下一步我们客户端连接时需要使用的。