ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放
作为一个Web开发者,我们有时候会需要临时地将一个本地的Web网站部署到外网,以供他人体验评价或协助调试等等,通常我们会这么做:
找到一台运行于外网的Web服务器 服务器上有网站所需要的环境,否则自行搭建 将网站部署到服务器上 调试结束后,再将网站从服务器上删除有了ngrok我们能随心所欲的突破内网限制,远程管理,访问 我们内网主机
ngrok官网:https://ngrok.com
ngrok官方文档:https://ngrok.com/docs
ngrok 安装前准备
最佳使用姿势:
1.一台公网服务器(vps或云主机均可)
2.备案域名一枚,因为每个隧道用一个二级域名转发 (国外服务器就无需备案啦)
本次实验环境
一个备案的域名:xxx.top (xxx不表示真实的域名 可以为abc.om 123.cn 具体看你自己的域名)
服务端:阿里云 centos 6.5
客户端:orangepi armbian
开始搭建前的准备
安装go
yum install go
yum install -y perl-ExtUtils-MakeMaker mercurial
安装 git 1.7以上版本
安装最新版的git,请勿yum安装,yum最新才1.7.1
wget -O git.zip https://github.com/git/git/archive/master.zip
autoconf
./configure
make && makeinstall
ln -s /usr/local/bin/git /usr/bin/
编译到 go get gopkg.in/yaml.v1 的时候卡住不走了,说明是git比较低,版本需要大于1.7.9.5以上
fatal: Unable to find remote helper for 'https' 出现这个问题,
1.可以重新安装 curl curl-devel ( yum install curl curl-devel )
2.然后再重装git:
编译安装:
安装git-core
wget https://www.kernel.org/pub/software/scm/git/git-core-0.99.6.tar.gz
tar zxvf git-core-0.99.6.tar.gz
cd git-core-0.99.6
make prefix=/usr/libexec/git-core install
export PATH=$PATH:/usr/libexec/git-core/
编译安装ngrok和客户端
安装到这里 cd /usr/local/
1.下载ngrok源码:
git clone https://github.com/inconshreveable/ngrok.git
2.解压 进入ngrok目录生成自签名证书
在使用官方提供的ngrok服务时我们可以使用官方的证书,而当我们使用自己搭建的ngrok服务时则需要自生成一份证书。
在自生成证书时需要一个解析到服务器上的主域名,现在以”xxx.top”为例。
(建议将域名泛解析到服务器上,方便让不同的本地服务通过不同的二级域名进行转发)
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=xxx.top" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=xxx.top" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
3.将新生成的证书,替换掉assets/client/tls下的证书
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
这里分别编译服务端和客户端可通过GOARCH=xxx制定平台类型 当然还能直接编译出win下的客户端
编译服务端: GOOS=linux GOARCH=amd64 make release-server
编译客户端: GOOS=linux GOARCH=arm make release-client
生成的服务端程序在ngrok/bin 下
服务端 :ngrokd (不需变动)
客户端:arm_linux/ngrok (拷贝到客户设备 orangepi 下)
启动ngrok服务端
将ngrokd 链接到 /usr/bin
ln -s /usr/local/ngrok/bin/ngrokd /usr/bin/
执行命令启动
ngrokd -domain="xxxx.top" -httpAddr=":9090" -httpsAddr=":9091" -tunnelAddr=":4443"
看到此信息说明服务端成功启动 接下来配置开机自启动
vim /etc/rc.local
ngrokd -domain="xxxx.top" -httpAddr=":9090" -httpsAddr=":9091" -tunnelAddr=":4443"
加入到末尾 保存退出 重启系统
开机后查看是否成功启动
ps -aux | grep 9090
至此服务端启动完成
注意:ngrok 用 & 不能后台运行 -不想重启可用此方法
可以使用screen后台运行
首先安装screen
yum install screen / apt-get install screen
之后运行
screen -S 任意名字(例如:ngrokd)
然后运行ngrok 启动命令 : ngrokd -domain="xxxx.top" -httpAddr=":9090" -httpsAddr=":9091" -tunnelAddr=":4443"
快捷键 ctrl+A+D 既可以保持ngrok后台运行
ngrok客户端配置与启动
接下来的操作在orangepi(香橙派)armbian上完成
(自己想办法...)拷贝刚刚编译生成的客户端 在 bin/linux/ngrok 到我们的客户机
我放到了这里 /software/ngrok
cd /software/ngrok
新建log目录存放日志,bin (存放刚刚的ngrok客户端 ), conf 存放配置文件
mkdir logs conf bin
创建软连接 (这样每次执行命令不用输绝对路径啦)
ln -s /software/ngrok/bin/ngrok /usr/bin/ngrok
接下来编辑配置文件 vim conf/ngrok.cfg
opi.xxx.top:9090 即映射到 127.0.0.1 用于访问网站
mopi.xxx.top:9090 即映射到 127.0.0.1:8888 用于访问网站
xxx.top:5000 即映射到 127.0.0.1:22 用来远程ssh
opi.xxx.top:33060 即映射到 127.0.0.1:3306 用来连接mysql
需要更多隧道按自己需求添加就行
使用配置文件好处是可同时开启多个隧道(配置文件不能有制表符也就是tab 缩进只能用空格!)
准备就绪启动ngrok客户端
ngrok -config=/software/ngrok/conf/ngrok.cfg -log=/software/ngrok/logs/ngrok.log start http http2 https ssh mysql
-config 指定配置文件的
-log 指定输出日志位置
start 后跟启动的隧道服务 和配置文件里是对应的
ps:使用 ngrok -help 可查看帮助
如图成功与服务端连接 并有公网和本地的映射信息
ctrl+c 停止
将客户端加入开机自动启动
vim /etc/rc.local
在 exit 0; 之前加入以下命令 保存退出
setsid ngrok -config=/software/ngrok/conf/ngrok.cfg -log=/software/ngrok/logs/ngrok.log start http http2 https ssh mysql
可以重启测试下 ,或者直接执行 后台运行服务
setsid ngrok -config=/software/ngrok/conf/ngrok.cfg -log=/software/ngrok/logs/ngrok.log start http http2 https ssh mysql
tail -100f logs/ngrok.log 查看日志
web访问测试
可以看到已成功访问我内网中的web项目!
小结
1.目前ngrok版本已到2.0 作者貌似暂未放出源码 当前用的版本1.7 经测试 很稳定啦
2.自己搭建服务端还是比较费劲 还需要有公网服务器域名,但是必然是最稳定的
3.因为访问是从服务端映射到内网,所以公网服务器也会承担全部流量
4.推荐一个国内的 https://www.ngrok.cc/
5.当我们内网有不同设备 可用同样方法拷贝客户端到设备然后接连接到我们的服务端
附录
更多配置可参见官方文档 :ngrok官方文档:https://ngrok.com/docs
ngrok官方下载:https://ngrok.com/download
推荐博文:ngrok原理浅解析
转载请注明:左手代码右手诗 » 搭建属于自己的ngrok服务器 实现内网穿透