ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。可以被使用来进行微信借口的本地调试。在ngrok被墙之后,我们需要通过ngrok开源的源码自行搭建ngrok服务。具体步骤如下:

一、在服务器上安装配置go开发环境

  Ngrok是由go语言开发的,需要编译golang1.1以上的版本,所以首先要在服务器上安装配置go开发环境。

【以下步骤实验于CentOS 6.5 系统中,ubuntu中也可使用ap-get来完成安装】

  1.安装mercurial包 (分布式版本控制系统):

    yum install mercurial

  (可以通过hg version测试是否安装成功)

    可能出现的错误:

    --> Running transaction check
    ---> Package mercurial.x86_64 0:2.2.2-1.el5.rf will be installed
    --> Processing Dependency: python(abi) = 2.4 for package: mercurial-2.2.2-1.el5.rf.x86_64
    --> Finished Dependency Resolution
    Error: Package: mercurial-2.2.2-1.el5.rf.x86_64 (rpmforge)
    Requires: python(abi) = 2.4
    Installed: python-2.6.6-52.el6.x86_64 (@updates)
    python(abi) = 2.6
    Available: python-2.6.6-64.el6.x86_64 (base)
    python(abi) = 2.6
    You could try using --skip-broken to work around the problem
    You could try running: rpm -Va --nofiles --nodigest

    解决方法:

    01.[saas@test ]# su

    02.[root@test ]# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

    03.[root@test ]# rpm -Uvh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

    04.[root@test ]# yum clean all

    05.[root@test ]# yum update

        06.[root@test ]# yum install mercurial

  2.安装git包:

    yum install git

  3.安装gcc:

yum install gcc

  4.下载golang稳定版本的压缩包(建议在usr/local文件夹):

    前往golang中国下载 go1.4rc2.linux-amd64.tar.gz

http://www.golangtc.com/download

  5.解压压缩包(使用tar指令):

    tar -zxvf go1.4rc2.linux-amd64.tar.gz

  6.添加环境变量:

vi /etc/profile

在profile中添加:

export GOROOT=go的安装目录

export GOBIN=$GOROOT/bin

export PATH=$PATH:$GOBIN

    如下:

      # Add golang eviroment
      export GOROOT=/usr/local/go
      export GOBIN=$GOROOT/bin
      export PATH=$PATH:$GOBIN

    并刷新环境变量

    source /etc/profile

  7.测试是否安装成功:

  go version

二、在服务器上搭建Ngrok服务

  1.下载ngrok源码:

git clone https://github.com/inconshreveable/ngrok.git

2.在go目录解压ngrok源码

*.tar 用 tar –xvf 解压
           *.gz 用 gzip -d或者gunzip 解压
           *.tar.gz和*.tgz 用 tar –xzf 解压
           *.bz2 用 bzip2 -d或者用bunzip2 解压
           *.tar.bz2用tar –xjf 解压
           *.Z 用 uncompress 解压
           *.tar.Z 用tar –xZf 解压
           *.rar 用 unrar e解压
           *.zip 用 unzip 解压

3.在ngrok目录生成自签名证书

在使用官方提供的ngrok服务时我们可以使用官方的证书,而当我们使用自己搭建的ngrok服务时则需要自生成一份证书。

在自生成证书时需要一个解析到服务器上的主域名,现在以”abc.com”为例。

(建议将域名泛解析到服务器上,方便让不同的本地服务通过不同的二级域名进行转发)

openssl genrsa -out rootCA.key 2048

openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=abc.com" -days 5000 -out rootCA.pem

openssl genrsa -out device.key 2048

openssl req -new -key device.key -subj "/CN=abc.com" -out device.csr

openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

4.将新生成的证书,替换掉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

三:编译生成ngrokd(服务端)

maker release-server

在编译过程中有可能出现如下情况: 

1.

    GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata

      bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/client/assets/assets_release.go \

assets/client/...

    make: bin/go-bindata: Command not found

      make: *** [client-assets] Error 127

      解决方法:前往$GOBIN (cd $GOBIN) 找到go-bindata,将他移动到ngrok/bin下 (没有bin,可新建一个)

2.

package code.google.com/p/log4go: Get https://code.google.com/p/log4go/source/checkout?repo=: dial tcp 216.58.197.110:443: i/o timeout

因为google被墙,如果服务器不在墙外或者没有FQ则无法访问到code.google.com.

解决方法:在 ngrok/src/ngrok/log 目录下找到 logger.go 文件,修改其中第4或5行的:

log "code.google.com/p/log4go”为

log "github.com/keepeye/log4go"

3.

有时候在服务器上会出现下载速度极慢的情况,同时go get并不会显示进度条,所以需要耐心等待。 我在编译的时候,服务器上的速度慢得令人发指,在本机(OS X 10.10.1)中有一份已完成编译的ngrok,所以我尝试在本地已完成编译的ngrok中找到ngrok/src文件夹找到服务器中编译时卡顿的文件直接拷贝了一份上传服务器,再执行make编译后成功生成了ngrok执行文件。

解决方法:先清空ngrok下src文件夹,博客园上传的文件中有个ngrok_src压缩文件解压放到src文件夹,再执行make release-server编译后成功生成了ngrok执行文件。

若一切顺利,可以在ngrok/bin/ 文件夹下看到一个 ngrok 文件。

若是没有找到可以前往$GOBIN中找到。

这样服务器端程序就已经生成了,可以指定证书,域名,端口号来启动

./bin/ngrokd -tlsKey=device.key -tlsCrt=device.crt -domain="muxkou.com" -httpAddr=":8081" -httpsAddr=":8082" -tunnelAddr=":443"

            出现如下显示则说明服务已开启:

[12/28/15 10:46:19] [INFO] [registry] [tun] No affinity cache specified

[12/28/15 10:46:19] [INFO] [metrics] Reporting every 30 seconds

[12/28/15 10:46:20] [INFO] Listening for public http connections on 0.0.0.0:8081

[12/28/15 10:46:20] [INFO] Listening for public https connections on 0.0.0.0:8082

[12/28/15 10:46:20] [INFO] Listening for control and proxy connections on 0.0.0.0:443

四:编译生成ngrok(客户端)

ctrl+C 关闭ngrokd

在生成客户端的可执行文件时,要利用golang的跨平台交叉编译针对不同的系统生成不同的可执行文件。

1.生成go跨平添编辑工具

  (1)若是客户端使用与服务器相同系统可直接使用 make release-client指令。

  (2)若是不同系统,则需要通过go中的make.bash手工编译出跨编译工具。

   在$GOROOT/src目录下找到make.bash文件

  通过设置GOOS和GOARCH来完成生成跨编译工具:

  例如:

    MAC OSX: sudo GOOS=darwin GOARCH=amd64 ./make.bash

    Windows: sudo GOOS=Windows GOARCH=386 ./make.bash

生成的工具可以在 $GOROOT/pkg/tool中找到

2.生成ngrok可执行文件

在ngrok目录下使用

GOOS=darwin GOARCH=amd64 make release-client

GOOS=windows GOARCH=386 make release-client

在ngrok/bin 或$GOBIN 中找到darwin_amd64或windwos_386文件夹。在其中可以找到ngrok或ngrok.exe 对应系统的可执行文件。

3.将ngrok文件下载到客户端PC(内网),同时写一个配置文件:ngrok.cfg

server_addr: "abc.com:443"

trust_host_root_certs: false

【其中abc.com为主域名,443为开启服务时的tunnelAddr端口(若没有设置,默认为4443端口)】

4.在客户端启动ngrok:

ngrok -subdomain=test -config=ngrok.cfg 80

【80为想要暴露的端口】

若Tunnel status显示online则表示隧道已打通:

Tunnel Status                 online

Version                         1.7/1.7

Forwarding                    http://test.muxkou.com:8081 -> 127.0.0.1:80

Forwarding                    https://test.muxkou.com:8081 -> 127.0.0.1:80

Web Interface                 127.0.0.1:4040

# Conn                        0

Avg Conn Time                 0.00ms

此时可以再公网通过 http://test.abc.com:8081 访问到内网PC

            可以进入Web Interface显示的127.0.0.1:4040 查看日志 

5.若出现 bad certificate 的错误:

1. 确保生成证书时的NGROK_BASE_DOMAIN和ngrok.cfg填写的domian一致。

2.在使用自签证书时ngrok.cfg中的 trust_host_root_certs为false

6.使用80端口:

http://mp.weixin.qq.com/wiki/home/index.html 中可以看到公众平台接口调用仅支持80端口。

所以若要通过ngrok服务完成微信公众号的调试,则需要使用80端口,修改ngrokd启动指令如下:

./bin/ngrokd -tlsKey=device.key -tlsCrt=device.crt -domain="muxkou.com" -httpAddr=":80" -httpsAddr=":8082" -tunnelAddr=":443"

自建Ngrok服务与使用方法的更多相关文章

  1. 搭建自己的ngrok服务(国内直接可用http://qydev.com/#)

    ngrok 服务可以分配给你一个域名让你本地的web项目提供给外网访问, 特别适合向别人展示你本机的web demo 以及调试一些远程的API (比如微信公众号,企业号的开发) ngrok的官方服务可 ...

  2. 搭建自己的ngrok服务

    转载:http://tonybai.com/2015/03/14/selfhost-ngrok-service/ 在国内开发微信公众号.企业号以及做前端开发的朋友想必对ngrok都不陌生吧,就目前来看 ...

  3. 小程序server-3-搭建WebSocket 服务

    小程序server-3-搭建WebSocket 服务: 1.安装 Node 模块 使用 ws 模块来在服务器上支持 WebSocket 协议,下面使用 NPM 来安装: cd /var/www/wxp ...

  4. windows运行打开服务命令的方法 :

    windows运行打开服务命令的方法 : 在开始->运行,输入以下命令 1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup------ ...

  5. 浅谈android Socket 通信及自建ServerSocket服务端常见问题

    摘  要:TCP/IP通信协议是可靠的面向连接的网络协议,它在通信两端各建立一个Socket,从而在两端形成网络虚拟链路,进而应用程序可通过可以通过虚拟链路进行通信.Java对于基于TCP协议的网络通 ...

  6. (转)ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法

    早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误,帮其解决后,发现很多人遇到过这样的问 ...

  7. JS提交对象数组到服务端的方法总结(C#实例)

    *转载请注明出处: 作者:willingtolove: 本文链接:http://www.cnblogs.com/willingtolove/p/4741549.html 正文: 1. 方法一:利用aj ...

  8. 使用AIDL远程调用服务中的方法

    AIDL:android interface define language(接口定义语言) 作用:方便远程调用其他服务中的方法 注意:安卓四大组件都要在清单文件注册 aidl创建图: AIDL的全称 ...

  9. windows7安装phpnow Apache非管理员权限不能操作Windows NT服务的解决方法

    科普一下:PHPnow 是什么?        Win32 下绿色免费的 Apache + PHP + MySQL 环境套件包.简易安装.快速搭建支持虚拟主机的 PHP 环境,可以安装 Discuz! ...

随机推荐

  1. python开发编译器

    引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...

  2. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  3. Pivot 和 Unpivot

    在TSQL中,使用Pivot和Unpivot运算符将一个关系表转换成另外一个关系表,两个命令实现的操作是“相反”的,但是,pivot之后,不能通过unpivot将数据还原.这两个运算符的操作数比较复杂 ...

  4. C#基础篇 - 正则表达式入门

    1.基本概念 正则表达式(Regular Expression)就是用事先定义好的一些特定字符(元字符)或普通字符.及这些字符的组合,组成一个“规则字符串”,这个“规则字符串”用来判断我们给定的字符串 ...

  5. 学习ASP.NET Core, 怎能不了解请求处理管道[3]: 自定义一个服务器感受一下管道是如何监听、接收和响应请求的

    我们在<服务器在管道中的"龙头"地位>中对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了介绍,为了让读者朋友们对管道中的服务器具有更 ...

  6. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

  7. Xamarin+Prism小试牛刀:定制跨平台Outlook邮箱应用

    通过本文你将学会如下内容: 1,如何使用Xamarin开发跨平台(Windows,Android,iOS)应用. 2,如何使用微软的登录界面登入Microsoft账号. 3,如何使用Outlook邮箱 ...

  8. 软件工程(C编码实践篇)学习心得

    孟繁琛 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程 http://mooc.study.163.com/course/USTC-1000002006 软件工程 ...

  9. U盘安装Kali 出现cd-rom无法挂载 已解决

    用U盘安装Kali Linux的过程中,出现cd-rom无法挂载的现象,百度坑比啊,醉了.下面亲测成功 出现无法挂载后,选择执行shell 第一步:df -m此时会看到挂载信息,最下面的是/dev/* ...

  10. ubuntu进行子域名爆破

    好记性不如烂笔头,此处记录一下,ubuntu进行子域名的爆破. 先记录一个在线的子域名爆破网址,无意中发现,很不错的网址,界面很干净,作者也很用心,很感谢. https://phpinfo.me/do ...