介绍一下工具ngrok 和 inlets,将本地服务暴露到公网
通过使用ngrok和inlets将本地web服务暴露到公网,方便本地WEB外网访问、本地开发微信、TCP端口转发等。
先在本地启动一个web服务,我用Flask在本地5000端口启动了一个web服务,本地访问如下,Flask启动web服务可参考Flask使用教程
下面分别介绍一下如何使用ngrok和inlets在公网暴露本地web服务
ngrok国外服务
Sunny-Ngrok国内服务
解压
unzip /path/to/ngrok.zip
ngrok启动时设置账户的token,运行命令如下
./ngrok authtoken token
token为ngrok官网账户的token,在个人页面获取,如下
./ngrok http 5000
转发本地5000端口,运行成功如下图所示
访问https://626888298b58.ngrok.io ,即可访问到本地服务,访问如下
ngrok提供了http和https两种访问方式,不过每次重启,ngrok提供的域名前缀都会变的,想固定域名前缀的话就要收费了。
浏览器访问 http://127.0.0.1:4040/ ,可进入管理页面,查看本地服务访问情况。
ngrok我记得之前官网还提供了服务端配置教程,现在官网好像没了这个教程,而且客户端升级后也不支持了,可能官方不想让我们自己搭建ngrok服务了。
更多教程参考官网
登录,进入管理界面,开通隧道,不想付费的话有免费的服务器可用
获取隧道id,本地映射的是5000端口,可获得一个免费域名进行访问,该域名是固定的,不像国外的ngrok服务,每次启动都会变。
运行ngrok服务
下载地址,使用下面的命令启动ngrok,使用上一步获取隧道id
./sunny clientid 隧道id
访问 http://dxysun.free.idcfengye.com/ ,即可访问到本地服务,访问如下
Sunny-Ngrok 不提供https的访问,想要https的访问就要付费了,免费的服务器访问速度比较慢,想要提高访问速度也需要付费。
浏览器访问 http://127.0.0.1:4040/ ,可进入管理页面,查看本地服务访问情况。
更多教程参考官网
inlets 利用反向代理和 Websocket 隧道,将内部、或是开发中的服务通过「出口节点」暴露到公网。出口节点可以是几块钱一个月的 VPS,也可以是任何带有公网 IPv4 的电脑。
github地址
inlets服务是需要自己搭建的,不想自己搭建使用官方服务是要付费的。
首先要有一台服务器,最好可以域名访问。
服务端自动安装
可使用 curl
和辅助脚本:
# 安装到当前目录
curl -sLS https://get.inlets.dev | sh
# 安装到 /usr/local/bin/
curl -sLS https://get.inlets.dev | sudo sh
使用以上命令安装时可能会报如下错误
[root@dxy conf.d]# curl -sLS https://get.inlets.dev | sudo sh
curl: (7) Failed connect to raw.githubusercontent.com:443; 拒绝连接
由于某些你懂的原因
,导致GitHub的raw.githubusercontent.com
域名解析被污染了。
查询真实IP
在 https://www.ipaddress.com/ 查询raw.githubusercontent.com的真实IP。
通过修改/etc/hosts
解决此问题
199.232.28.133 raw.githubusercontent.com
修改完成后再执行一次自动安装命令
使用以上办法如果安装还有问题的,则可以自己手动安装
使用如下命令下载inlets
curl -sSLf https://github.com.cnpmjs.org/inlets/inlets/releases/download/2.7.12/inlets --output ./inlets
https://github.com.cnpmjs.org ,是github的加速地址,国内访问速度还是可以的,比raw.githubusercontent.com要快
然后加执行权限,移到bin目录下,方便其他用户直接使用
chmod +x inlets
mv inlets /usr/local/bin
以上均在root用户下执行,如不是root用户,需要用sudo命令执行
如果是Mac,则可以使用 brew
:
brew install inlets
其他客户端可直接下载安装,下载地址
首先在服务端运行inlets,运行端口为8090
inlets server --port=8090 --token=dxysun
token可以自定义,客户端运行需要设置这个token
上面的命令只能在前台运行,若想在后台运行,可使用如下命令
nohup inlets server --port=8090 --token=dxysun > nohup.log 2>&1 &
运行结果
然后在客户端运行
inlets client --remote=vps.dxysun.com:8090 --upstream=http://127.0.0.1:5000 --token=dxysun
remote 参数是远程服务器的地址,我的服务器的域名是 vps.dxysun.com
upstream 参数是本地服务的地址
token是服务端设置的token
上面的命令只能在前台运行,若想在后台运行,可使用如下命令
nohup inlets client --remote=vps.dxysun.com:8090 --upstream=http://127.0.0.1:5000 --token=dxysun > nohup.log 2>&1 &
运行结果
服务访问地址为 http://vps.dxysun.com:8090/ ,访问情况如下
由于inlets并不直接提供https服务,inlets pro 提供https服务,不过需要付费。
但是如果自己拥有域名和服务器,想要使用https,可配合nginx配置https访问。
配置教程如下
首先要对要使用的域名申请ssl证书,阿里云、腾讯云、网易云都可申请免费的ssl证书,我这边之前配置过https的域名是love.dxysun.com
,就拿这个域名来示例一下。
https的nginx配置可自行百度,下面只介绍inlets相关的nginx配置。
先启动服务端的inlets服务,这里服务端运行端口为 8090
inlets server --port=8090 --token=dxysun
然后配置nginx
服务端nginx的配置文件如下
#http访问配置
location / {
proxy_pass http://127.0.0.1:8090;
}
# ws通道访问配置
location /tunnel {
proxy_pass http://127.0.0.1:8090;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
nginx配置完成后使用nginx -s reload
重新加载配置
客户端启动
inlets client --remote=love.dxysun.com --upstream=http://127.0.0.1:5000 --token=dxysun
配置成功,运行结果如下
访问情况
至此,inlets的https配置访问成功。
对这三种内网穿透工具做下对比
工具 | 配置 | https | 访问速度 | 管理页面 | 固定域名 |
---|---|---|---|---|---|
ngrok | 简单 | 支持 | 国外的,慢,提速需付费 | 支持 | 不支持,固定域名需付费 |
Sunny-Ngrok | 简单 | 支持,需付费 | 国内的,速度一般,提速需付费 | 支持 | 支持,免费的 |
inlets | 稍微复杂点 | 支持,需自行配置,也可使用官方的,需付费 | 自己的服务器,视服务器带宽而定 | 不支持 | 支持,使用自己的域名,也可使用官方的,需付费 |
总的来说,三个工具各有优缺点,若只是简单使用下,推荐使用Sunny-Ngrok,配置简单,还有免费自定义域名;如果有自己的服务器和域名,并且不嫌配置麻烦的话(其实也不麻烦),推荐使用inlets,灵活度高;至于ngrok,由于是国外的服务,速度你懂的,而且不支持固定域名,就不推荐了。
inlets
inlets.dev
ngrok国外服务
Sunny-Ngrok国内服务