不积跬步,无以至千里;不积小流,无以成江海。

搭建属于自己的ngrok服务器 实现内网穿透

服 务 器 康康 6194℃ 4评论

ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放

     作为一个Web开发者,我们有时候会需要临时地将一个本地的Web网站部署到外网,以供他人体验评价或协助调试等等,通常我们会这么做:
  1. 找到一台运行于外网的Web服务器
  2. 服务器上有网站所需要的环境,否则自行搭建
  3. 将网站部署到服务器上
  4. 调试结束后,再将网站从服务器上删除

有了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"

qq%e6%88%aa%e5%9b%be20161120202343

看到此信息说明服务端成功启动 接下来配置开机自启动

vim /etc/rc.local

ngrokd -domain="xxxx.top" -httpAddr=":9090" -httpsAddr=":9091" -tunnelAddr=":4443"

加入到末尾 保存退出 重启系统

开机后查看是否成功启动

ps -aux | grep 9090

qq%e6%88%aa%e5%9b%be20161120202926

至此服务端启动完成

注意: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

qq%e6%88%aa%e5%9b%be20161120204036

创建软连接 (这样每次执行命令不用输绝对路径啦)

ln -s  /software/ngrok/bin/ngrok /usr/bin/ngrok

 接下来编辑配置文件 vim conf/ngrok.cfg

qq%e6%88%aa%e5%9b%be20161120205003

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 可查看帮助

qq%e6%88%aa%e5%9b%be20161120211454

如图成功与服务端连接 并有公网和本地的映射信息

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 查看日志

qq%e6%88%aa%e5%9b%be20161120211932

web访问测试

qq%e6%88%aa%e5%9b%be20161120212318

可以看到已成功访问我内网中的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服务器 实现内网穿透

喜欢 (9)or分享 (0)
发表我的评论
取消评论

 

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(4)个小伙伴在吐槽
  1. 不错,请问博主你这个博客是基于香橙派搭建的么? 我也想入手一块搭建wordpress,长期运行的话稳重?另刷什么系统?我只用来搭建lnmp刷并不需要!
    匿名2017-02-22 11:13 回复
    • 不是,阿里云的虚拟主机
      Chen2017-03-13 16:00 回复
  2. 我就想知道楼主用这个远程Mac么? 远程的话卡不卡? 我现在Mac都是用TV 内网穿透卡成幻灯片
    max2020-09-07 16:56 回复
    • 用来远程香橙派的,不推荐用ngrok了,内网穿透可以用frp
      康康2020-09-07 17:11 回复