使用 ngrok 进行内网穿透

使用 ngrok 进行内网穿透

2018年09月04日 19:51:59 一叶之秋Tel 阅读数 2409更多

个人分类: Linux环境搭建开发日志

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guoqian1408/article/details/82388642

 

革命的果实最香甜~~

劳动的人民最光荣~~


经过一下午的鼓捣,终于实现了ngrok内网穿透部署

软件需求

  • Git
  • Go
  • ntp

须知:

域名一定要使用二级域名

一级域名为 baidu.com

二级域名为 xxx.baidu.com不要用已经被占用的二级域名

建议重新解析一个,反正不花钱对不对

不然会出现莫名其妙的错误

:(

以下文中 主域名 皆为 二级域名 :test.baidu.com

次域名 为 :ngrok.test.baidu.com

PS:此处描述并不准确,请翻至最后参阅

防火墙记得要关掉,忘记的话你会恶心的一批

服务器域名 和 客户端域名的关系

环境:

  • server 端是在阿里云,阿里云的系统版本是 CentOS 7 amd64
  • client 端是对多的,有 centos、windows、Raspberry Pi,基本上要覆盖到所有的平台 linux 、 windows 和 arm 
  • 暂时使用树莓派进行记录

开始配置:

git安装(不做赘述)

yum install mercurial git gcc golang ntp 

 使用ntp进行时间同步

服务端和客户端都要,不然会有恶心的错误

ntpdate cn.pool.ntp.org

 开始clone ngrok

由于2.x版本好像不开源了,所以我们用1.7,这个git不是官方版,但是比官方版好用 XD

感谢开源社区,开源万岁!

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

 clone完成进行配置

 
  1. export NGROK_DOMAIN="主域名"

  2.  
  3. cd ngrok

  4.  

进入目录后生成证书(你抄就完事了)

 
  1. openssl genrsa -out rootCA.key 2048

  2. openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem

  3. openssl genrsa -out server.key 2048

  4. openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr

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

 拷贝证书到指定位置(你抄就完事了)

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

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

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

开始编译 ngrok 服务端

这里我主要是生成了 arm 和 Linux 的版本。继续在原先的目录下:

 
  1. #默认是linux 64位,和我一样

  2. #我的客户端是树莓派

  3.  
  4. make release-server

  5. GOOS=linux GOARCH=arm make release-client

  6.  
  7. # linux + win + mac + arm 配置

  8. #GOOS=linux GOARCH=amd64 make release-client release-server

  9. #GOOS=windows GOARCH=amd64 make release-client release-server

  10. #GOOS=darwin GOARCH=amd64 make release-client release-server

  11. #GOOS=linux GOARCH=arm make release-client release-server

不同平台使用不同的 GOOS 和 GOARCH,前面的编译选项就是指 go os , go 编译出来的操作系统 (windows,linux,darwin) ;go arch, 对应的构架 (386,amd64,arm)

  • 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

编译成功后会在ngrok/bin下生成ngrokd、ngrok两个文件,前者是服务端程序,后者是客户端程序。

生成的执行文件由于版本不同可能在不同文件夹内 ,如树莓派客户端在 linux_arm 内,请自行判断

把生成好的客户端传到对应服务器

可选方案:

  • FTP
  • lyzsz

FTP需要搭建

推荐lyzsz

没有办法的情况下用git

不再赘述

配置客户机

  • 建立文件夹ngrok
  • chmod 777
  • 把客户端导入
  • 新建文件 ngrok.cfg(内容如下)
 
  1. server_addr: 主域名:4443

  2. trust_host_root_certs: false

启动服务端 

 
  1. #服务端操作均在ngrok目录下

  2.  
  3. ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="主域名" -httpAddr=":8081" httpsAddr=":8082"

  • httpAddr 是访问普通的http使用的端口号,后面用 二级域名:8081 来访问服务
  • httpsAddr 是访问的https使用的端口号,同上,只不过是需要https的服务访问才用这个端口
  • tunnelAddr 是通道的端口号,这个端口是ngrok用来通信的,所以这个端口在服务器上和客户端上设置必须要对应才可以正常的链接,默认不填写好像是4443
 
  1. #服务端启动成功信息

  2.  
  3. ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="主域名" -httpAddr=":8081" httpsAddr=":8082"

  4.  
  5. [19:43:13 CST 2018/09/04] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified

  6. [19:43:13 CST 2018/09/04] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:8081

  7. [19:43:13 CST 2018/09/04] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443

  8. [19:43:13 CST 2018/09/04] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443

  9. [19:43:13 CST 2018/09/04] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds

启动客户端

 
  1. #linux

  2. ./ngrok -config ./ngrok.cfg -subdomain 次域名前缀(如:ngrok) -proto http 80

  3.  
  4. #windows

  5. ngrok.exe -subdomain=次域名前缀(如:ngrok) -config=ngrok.cfg 80

这个二级域名前缀最好一样,避免莫名其妙的报错

日志: -log=ngrok_log.txt 是记录ngrok的日志,如果前期调试的时候加上这个参数,如果不能访问就可以查看到底是什么问题

如下

./ngrok -log=ngrok_log.txt -config ./ngrok.cfg -subdomain 次域名前缀(如:ngrok) -proto http 80./ngrok

客户端启动成功

 
  1. #客户端启动成功信息

  2.  
  3. ngrok (Ctrl+C to quit)

  4.  
  5. Tunnel Status online

  6. Version 1.7/1.7

  7. Forwarding http://ngrok.test.baidu.com(次域名):8081 -> 127.0.0.1:80

  8. Web Interface 127.0.0.1:4040

  9. # Conn 1

  10. Avg Conn Time 66092.96ms

  11.  
  12.  
  13.  
  14.  
  15. HTTP Requests

  16. -------------

  17.  
  18. GET / 304 Not Modified

  19. GET / 200 OK

  20.  

 Tunnel Status 为 online 即为链接成功

如果出现reconnecting

请您自求多福

:(


二次更新:

发现退出终端后链接会自动断开

于是找了许多后台运行进程的资料

成果如下

服务端:

 
  1. nohup ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="主域名" -httpAddr=":8081" httpsAddr=":8082" &

  2.  
  3. [1] 1784

  4. nohup: 忽略输入并把输出追加到"nohup.out"

  5.  
  6.  
  7. #使用tail查看日志输出

  8. tail -f nohup.out

  9.  
  10. #1784为进程ID

  11. ps aux | grep ngrok

  12.  
  13. #使用 kill 结束进程

  14. ✗ kill -9 1784

客户端:

 
  1. setsid ./ngrok -log=ngrok_log.txt -config ./ngrok.cfg -subdomain ngrok -proto http 80

  2.  
  3. ps aux | grep ngrok

  4.  
  5. kill -9 1744

这样即使不链接服务器也能保持平稳运行


在此重点阐述 服务器域名 和 客户端域名的关系

假定你的域名为  baidu.com

 
  1. #服务端设定domain 域名 为 baidu.com

  2. nohup ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="域名" -httpAddr=":8081" httpsAddr=":8082" &

  3.  
  4. #客户端subdomain hostname 为 ngrok

  5. setsid ./ngrok -log=ngrok_log.txt -config ./ngrok.cfg -subdomain ngrok -proto http 80

  6.  
  7. #访问域名即为 ngrok.baidu.com

  8.  
  9. -----------------------------------------------------

  10.  
  11. #若服务端设定domain 域名 为 test.baidu.com

  12. nohup ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="域名" -httpAddr=":8081" httpsAddr=":8082" &

  13.  
  14. #客户端subdomain hostname 为 ngrok

  15. setsid ./ngrok -log=ngrok_log.txt -config ./ngrok.cfg -subdomain ngrok -proto http 80

  16.  
  17. #访问域名即为 ngrok.test.baidu.com

  18.  
  19. ##注意 无论是 ngrok.baidu.com 还是 ngrok.test.baidu.com

  20. ##最终访问的域名 必须在 域名商 处进行解析!!!

 

你可能感兴趣的:(使用 ngrok 进行内网穿透)