1、介绍
当我们想把内网的一些资源暴露在公网上时,可以使用内网穿透功能。比如公司的内网服务器,部署了平时需要开发的项目,但是回到家中无法访问,就可以使用内网穿透,将公司内网的接口映射到一台公网的服务器上,用这台公网服务器做转发即可实现在家中也能外网访问。这样的就不需要我们在公网上部署一套一模一样的服务了,费时费力,而且还要同步数据。
2、准备工作
想要实现内网穿透功能首先我们需要准备:
- 一台公网服务器(用作nps的服务端)
- 一台需要做转发的内网服务器(用作nps的客户端)
3、nps服务端安装及配置
3.1 下载nps服务端
注意nps服务端是安装在公网服务器上的!!!
服务端下载地址:https://github.com/ehang-io/nps/releases
可以看到有很多版本,我的外网服务器是Linux的,可以输入命令查看服务器架构版本:
arch
x86_64 直接下载 linux_arm64_server.tar.gz 这个版本即可。可以手动下载到本地,然后通过scp命令传到服务器,也可以直接在外网服务器上下载。
通过scp传送到外网服务器命令(如果开放了账号密码登录):
scp -P ssh开放的端口(如果为22,可以不用带此参数) 下载的linux_arm64_server.tar.gz的位置 登录的账号@外网服务器ip:你要拷贝到的外网服务器的位置
如:
scp -P 22 C:\Users\dxc\Downloads\linux_arm64_server.tar.gz root@xxx.xxx.xxx.xxx:/home/nps
按下回车,再输入密码即可(注意大小写)。
通过scp传送到外网服务器命令(只开放了通过证书登录的方式):
scp -i 你证书的位置 -P ssh开放的端口(如果为22,可以不用带此参数) -r 下载的linux_arm64_server.tar.gz的位置 登录的账号@外网服务器ip:你要拷贝到的外网服务器的位置
如:
scp -i C:\Documents\server-pro\ecmarkets-universal.pem -P 22 C:\Users\dxc\Downloads\linux_arm64_server.tar.gz root@81.xxx.xxx.xxx:/home/nps
直接在外网服务器上下载命令:
wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_arm64_server.tar.gz
下载完成后解压,输入命令:
tar -zxvf linux_arm64_server.tar.gz
解压完成后,输入指令,查看文件:
ll
我们能看到有如下这些文件:
这样nps就下载解压成功了。
3.2 nps配置
其中 conf 文件夹中的 nps.conf 就是我们服务端的配置文件,我们需要根据自己情况稍作修改。输入命令:
vim nps.conf
默认配置如图:
我们可以根据自己的场景稍作修改,找到 #web 下的内容,其中:
- web_username:登录管理端的账号。
- web_password:登录管理端的密码,默认为123,此处我改为123456。
- web_port:管理端页面的端口,默认为8080,我服务器的8080端口已被项目占用,因此我此处改为7002。
#web
web_host=a.o.com
web_username=admin
web_password=123456
web_port = 7002
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
修改完成后,按 esc 退出编辑模式,在输入:
:wq
保存并退出。
其余配置说明如下:内容来源于官方文档:https://ehang-io.github.io/nps/#/?id=nps
名称 | 含义 |
---|---|
web_port | web管理端口 |
web_password | web界面管理密码 |
web_username | web界面管理账号 |
web_base_url | web管理主路径,用于将web管理置于代理子路径后面 |
bridge_port | 服务端客户端通信端口 |
https_proxy_port | 域名代理https代理监听端口 |
http_proxy_port | 域名代理http代理监听端口 |
auth_key | web api密钥 |
bridge_type | 客户端与服务端连接方式kcp或tcp |
public_vkey | 客户端以配置文件模式启动时的密钥,设置为空表示关闭客户端配置文件连接模式 |
ip_limit | 是否限制ip访问,true或false或忽略 |
flow_store_interval | 服务端流量数据持久化间隔,单位分钟,忽略表示不持久化 |
log_level | 日志输出级别 |
auth_crypt_key | 获取服务端authKey时的aes加密密钥,16位 |
p2p_ip | 服务端Ip,使用p2p模式必填 |
p2p_port | p2p模式开启的udp端口 |
pprof_ip | debug pprof 服务端ip |
pprof_port | debug pprof 端口 |
disconnect_timeout | 客户端连接超时,单位 5s,默认值 60,即 300s = 5mins |
注意:如果你先进行了 install 操作,然后再去修改 conf 文件夹下的 nps.conf 文件,那么修改将不会生效。因为当我们 install 后默认的配置文件将会在 /etc/nps 下面的 nps.conf ,此时你需要去修改此处的配置,然后在切换到nps的安装目录输入 nps restart 重启即可生效!!!
3.3 nps服务端启动
输入启动命令,启动nps服务端,如果你和我一样修改了管理端的端口,那么启动服务端将会占用80、8024、7002端口。如果你存在某些端口被占用,请到配置文件自行修改即可。
./nps install
nps start
此时,我们打开浏览器输入:
xxx.xxx.xxx(你的外网服务器ip):你配置的web_port端口
即可看到如下登录界面:
输入配置的账号密码,默认为admin/123,点击登录,进入仪表盘:
此时nps的服务端我们就配置完毕了,接下来开始配置客户端。
4、nps客户端配置
4.1 管理端添加客户端配置
此处我们在管理界面点击左侧菜单栏的“客户端”,再点击“新增”按钮进行客户端的新增。
进入到新增客户端页面:
其中:
- 备注:客户端的备注,可填可不填,根据自身情况。
- Basic认证用户名:不需要填。
- Basic认证密码:不需要填。
- 唯一验证密钥:不需要填,让系统自动生成。
- 允许客户端通过配置文件连接:填“是”即可。
- 压缩:填“是”即可。
- 加密:填“是”即可。
填完之后,点击保存按钮,我们即可看到新增的客户端已经出现在列表中。
此时,我们还需要配置隧道,点击左侧的“TCP隧道”进行新增。
- 模式:我们选择TCP隧道。
- 客户端ID:填写刚刚我们创建的客户端的ID,如果是第一次创建,那客户端ID为2。
- 备注:不需要填。
- 服务端端口:该端口表示你的客户端的应用最后被映射到服务器上的访问端口,比如你的客户端应用的端口为3781,服务端端口填写8999,那么 访问服务端的ip:8999 相当于访问 你客户端ip:3781 的资源。
- 目标(IP:端口):客户端需要被代理的服务的端口。
配置好后点击“新增”即可。如果想在这个客户端配置多个映射,只需要添加隧道即可。
4.2 nps客户端安装及连接
下载地址:https://github.com/ehang-io/nps/releases
此处我用的是本地电脑作为客户端,本地电脑为win10,64位操作系统,其他操作系统流程几乎一致。
此处我下载 windows_amd64_client.tar.gz 这个版本。
解压文件,进入 windows_amd64_client 目录:
直接在当前路径下进入cmd:
此时我们需要启动客户端,而启动的命令在我们管理端的客户端配置页面,找到我们创建的客户端,点击最前面的“+”号,复制下方的“客户端命令”。注意如果在windows下执行,不要复制前面的“./”!!!
复制后在cmd窗口中执行,如图:
看到输出“Successful connection with server xx.xx.xx.xx:8024”,代表连接成功了。我们也可以在管理界面中看到连接变为了“在线”。
5、测试
到此处,nps的所有配置和启动事项都完成了,接下来我们可以通过访问我们的外网服务器ip + 我们配置的TCP隧道中的端口,就能直接转发到我们的本地服务上了。
我本地启动了一个端口为 3781 的 Java 服务,接下来我访问外网服务器的ip + 我们配置TCP隧道中的端口,能看到穿透成功。如图: