自建 ngrok 内网穿透服务

本着玩玩的心态,搭建一个内网穿透的服务。内网穿透:即外网可以直接访问你内网

准备工作

有公网 IP 服务器一台

可以配置域名解析的域名一个。

系统:CentOS (也可为其他,命令稍有不同)

配置域名解析

先把域名给配置了,比如我的域名是yun996.cn,那么建立ngrok.yun996.cn和*.ngrok.yun996.cn解析到 你的 VPS 的 IP 上 (A 记录)。

安装 go 语言环境

ngrok是基于go语言开发的,所以需要先安装go语言开发环境,CentOS可以使用yum安装:

  yum install golang

如果没有权限,请使用sudo安装,安装完成之后,执行go version看到类似信息,证明安装成功:

  go version go1.7.3 linux/amd64

安装 git 环境

有些 VPS 的系统中自带了 git 环境,有的没有带,如果你的 git 使用不正常,请卸载自带的 git,重装安装。

卸载原有 git (根据需要自选):

   yum remove git

更新 yum 源:

   yum update

安装 git :

   yum install git

安装完后执行git --version,返回类似的信息,证明安装成功:

   git version 2.5.0

下载 ngrok 源码:

找一个存放ngrok的文件夹 ,clone 一份源码:

(为了方便演示,本文使用root用户,所以存放在/root/路径下)

  cd/root

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

  exportGOPATH=/root/ngrok

生成自签名证书

使用ngrok官方服务时,我们使用的是官方的SSL证书。自己建立ngrok服务,需要我们生成自己的证书,并提供携带该证书的ngrok客户端。

证书生成过程需要有自己的一个基础域名,官网随机生成的地址,如:695a358d.ngrok.com,基础域名就是ngrok.com。而在上文中提到的二级域名ngrok.yun996.cn就是用来作为这次要提供的基础域名。如果你的域名是abc.com,那么域名基础域名可以设置为ngrok.abc.com。

以我的基础域名为例(注意替换成自己的域名),生成证书过程如下:

cd/root/ngrokopenssl genrsa-out rootCA.key2048openssl req-x509-new-nodes-key rootCA.key-subj"/CN=ngrok.yun996.cn"-days5000-out rootCA.pemopenssl genrsa-out device.key2048openssl req-new-key device.key-subj"/CN=ngrok.yun996.cn"-out device.csropenssl x509-req-indevice.csr-CA rootCA.pem-CAkey rootCA.key-CAcreateserial-out device.crt-days5000

执行完成以上命令后,在ngrok目录下,会新生成 6 个文件:

 device.crt  device.csr  device.key  rootCA.key  rootCA.pem  rootCA.srl

我们在编译可执行文件之前,需要把生成的证书分别替换到assets/client/tls和assets/server/tls中,这两个目录分别存放着ngrok和ngrokd的默认证书。

cp rootCA.pem assets/client/tls/ngrokroot.crt

cp device.crt assets/server/tls/snakeoil.crt

cp device.key assets/server/tls/snakeoil.key

中间会提示是否覆盖,输入 y 确认即可。这里最好一行一行复制执行,别一起复制执行。

编译 ngrokd 和 ngrok

ngrokd 是服务端的执行文件,进入到 ngrok 目录下,执行如下命令编译:

make release-server

ngrok 是客户端的可执行文件,进入到 ngrok 目录下,执行如下命令编译:

GOOS=xxx GOARCH=xxx make release-client

不同平台使用不同的GOOS和GOARCH,GOOS为编译出来的操作系统 (windows,linux,darwin),GOARCH对应的构架 (386,amd64,arm)编译成你想在哪个客户端使用的配置

例如: GOOS=windows GOARCH=amd64  make release-client

 Linux 平台32位系统:GOOS=linux GOARCH=386

 Linux 平台64位系统:GOOS=linux GOARCH=amd64

  Windows 平台32位系统:GOOS=windows GOARCH=386

  Windows 平台64位系统:GOOS=windows GOARCH=amd64

  MAC 平台32位系统:GOOS=darwin GOARCH=386

  MAC 平台64位系统:GOOS=darwin GOARCH=amd64

   ARM 平台:GOOS=linux GOARCH=arm

然后下载编译后的客户端,通过 ftp 或 scp 等都可以,生成的目录在 ngrok 的 bin 目录下(bin目录是编译成功后才生成的),当前例子的路径为      /root/ngrok/bin/windows_amd64/ngrok.exe

启动 ngrokd 服务器

在 ngrok 的 bin 目录下执行:

  ./ngrokd -domain="ngrok.yun996.cn" -httpAddr=":8080" -httpsAddr=":8081"

出现想提示,即为启动成功:

[09/14/15 04:47:24] [INFO] [registry] [tun] No affinity cache specified 

[09/14/15 04:47:24] [INFO] [metrics] Reporting every 30 seconds 

… …

其中,-domain为你的 ngrok 服务域名,-httpAddr为 http 服务端口地址,访问形式为:xxx.ngrok.yun996.cn:8088,也可设置为 80 默认端口,注意端口冲突即可,-httpsAddr为 https 服务,同上。

ngrokd启动后,退出命令行即关闭服务。如果想要在后台运行,则执行:

  nohup ./ngrokd -domain="ngrok.yun996.cn" -httpAddr=":8080" -httpsAddr=":8081" &

注意末尾需要有&号,详细搜索nohup了解。关闭服务只需通过:

ps -A  # 找到PID,执行关闭

  kill xxxid

启动 ngrok 客户端

上面我们编译好了客户端并下载到了本地,演示路径为d:/ngrok/ngrok.exe

在d:/ngrok/目录下,建立 ngrok 配置文件:ngrok.cfg  然后把下面的内容复制进去 (记得修改为自己的子域名)

 server_addr: "ngrok.yun996.cn:4443"

 trust_host_root_certs: false

server_addr端口默认 4443,还需要服务器开启 4443 端口,使用阿里云或腾讯云的需要去安全组放行 4443 外网端口,不然无法正常使用。

然后使用 cmd 到这个路径下(d:/ngrok/),执行命令启动并转发本地的 4000 端口:

  ngrok -subdomain example -config=ngrok.cfg 8080

运行完了以后会有提示域名,根据提示域名访问,我这里这里为 :http://demo.ngrok.yun996.cn:8080,访问这个就等于访问到你的http://127.0.0.1:8080下的内容了。

更详细的 ngrok 配置,请参考官方文档 :https://ngrok.com/docs

踩坑提醒:

     1.一定先去ping 一下你的域名,看看能不能ping的通,还有就是你启动客户端的时候,验证是否与服务器端能连接

     2.  如果你现在才刚刚有自己的服务器的话,先检查dns 是否配置 ,解析是否正常,还有是否 备案 


dns检查
备案检查


解析检查

 3.检查4443端口是否开放 ,没有的话  记得开放

 4.如果你有出现过 

 .....

 make: bin/go-bindata: Command not found 

 make: * [client-assets] Error 127  

  这个错误的情况  是由于 go-bindata被安装到了GOBIN下了,go编译器找不到了。修正方法是将GOBIN/go-bindata拷贝到当前ngrok/bin下。

$ cp /home/ubuntu/.bin/go14/bin/go-bindata ./bin

或者  直接 yum install golang  重新安装go的环境 即可 (简单粗暴,反正我就是这么干的)

5. 如果你有出现过

Tunnel Status       reconnecting 

Version                 1.7/ 

Web Interface       127.0.0.1:4040 

# Conn                   0 

Avg Conn Time 0.00ms

第一反应先去检查下上面说的  1、2、3这三点是否都没有问题  

如果都没有问题了,那你就留言吧。否则你应该就是这样的展示

Tunnel Status     online 

Version              1.7/1.7 

Forwarding http://xxxx:8080 -> 127.0.0.1:8080 

Forwarding http://xxxx:8080 -> 127.0.0.1:8080 

Web Interface 127.0.0.1:4040 

# Conn              0 

Avg Conn Time 0.00ms

6. 如果你还出现过这样的情况

[09/13/15 09:55:46] [INFO] [tun:15dd7522] New connection from 54.149.100.42:38252 

[09/13/15 09:55:46] [DEBG] [tun:15dd7522] Waiting to read message 

[09/13/15 09:55:46] [WARN] [tun:15dd7522] Failed to read message: remote error: bad certificate 

[09/13/15 09:55:46] [DEBG] [tun:15dd7522] Closing

那么 你要去看看 你客户端  ngrok.cfg  中server_addr后的值是否与 -domain以及证书中的NGROK_BASE_DOMAIN相同,如果有不同,就改成相同的

除此之外的一些情况,目前还有遇见过。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 原文地址:https://blog.qjm253.cn/?p=395 包含依赖包的项目(可直接编译):https:...
    SunnyQjm阅读 3,325评论 2 12
  • 需要先安装go环境设置环境变量12345 # 可以根据自己需要调整路径 echo 'export GORO...
    加菲猫Jack阅读 1,952评论 3 1
  • 一般来说,外网要访问服务器,那么这个服务器必须绑定一个公网ip,现在可以购买的云服务器都是这样。比如个人要在家里组...
    vczyh阅读 3,383评论 0 1
  • 年后把之前工作上的一些事情了断了。 原本打算安心看书学习,为5月份的考试做准备。然而一旦闲下来,即使有很多书要看,...
    大鸟和小鸟阅读 292评论 1 2
  • 三亚,中国目前唯一一座身处热带的旅游城市,2018年的灵性之美就在这座美丽的城市拉开了序幕。 三亚...
    四爷_61ef阅读 197评论 2 1