博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Linux搭建多操作系统ngrok服务(内网穿透)
阅读量:2047 次
发布时间:2019-04-28

本文共 6298 字,大约阅读时间需要 20 分钟。

文章目录


在这里插入图片描述

前言:ngrok是什么鬼?

如上封面图所示,举一个栗子:

1.橘色屏幕的笔记本是你的工作机器,安装了ngrok客户端

2.ngrok.com所在的服务器安装了ngrok的服务端(ngrokd)
3.利用ngrok 8080命令可以将你本机的8080端口暴露给反向代理至ngrok.com的某个二级域名如:xxx.ngrok.com
4.别人通过xxx.ngrok.com就可以访问你本机8080端口上的站点内容了。

简单来说:

ngrok是一个内网穿透的解决方案,它使得你本地的服务器可以被局域网外的公网访问到

ngork有服务端和客户端,服务端运行在公网服务器,客户端运行在本地服务器
ngrok服务端会建立http和https服务,默认端口80/443,以及供ngrok客户端连接的服务,默认端口4443

它的工作流程如下:

访问端输入域名—>DNS—>ngrok服务端—>请求映射到ngrok客户端—>客户端返回响应到ngrok服务端—>ngrok服务端返回响应到访问端


准备工作

1.域名和服务器(域名需要提前DNS解析到此服务器)

2.Linux操作系统(本文以Centos8为例)
3.开放需要用到的端口(80、443、4443等)


提示:以下是本篇文章正文内容,下面案例可供参考

一、编译ngrok与ngrokd

1.安装go语言开发环境

由于ngrok是利用go语言开发的,所以先要在Linux系统中安装go语言开发环境。

sudo yum install golang

安装完毕后,利用go version来验证是否安装成功。

在这里插入图片描述

2.安装git(用于拉取源码)

在Linux上是有yum安装Git,非常简单,只需要一行命令

yum -y install git

输入 git version查看Git是否安装完成以及查看其版本号

git version

3.fork并拉取ngrok的源码

下面编译过程需要改官方的部分源码,所以最好fork一份源码至自己的github账户。

$ mkdir -p ~/ngrok$ cd ~/ngrok$ git clone https://github.com/muyu1229/ngrok.git

4.生成自签名证书

首先安装OpenSSL(Centos 8含有Openssl工具,无需重复安装

yum install openssl openssl-devel

检测OpenSSL安装是否成功

openssl version

使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自建ngrokd服务,如果不想买SSL证书,我们需要生成自己的自签名证书,并编译一个携带该证书的ngrok客户端。

证书生成过程需要一个NGROK_BASE_DOMAIN。 以ngrok官方随机生成的地址693c358d.ngrok.com为例,其NGROK_BASE_DOMAIN就是”ngrok.com”,如果你要 提供服务的地址为”example.ngrok.xxx.com”,那NGROK_BASE_DOMAIN就应该 是”ngrok.xxx.com”。

我们这里以NGROK_BASE_DOMAIN=“muyu1229.xyz”为例,将后面的域名替换成自己的即可,生成证书的命令如下:

$ cd ngrok$ openssl genrsa -out rootCA.key 2048$ openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=muyu1229.xyz" -days 5000 -out rootCA.pem$ openssl genrsa -out device.key 2048$ openssl req -new -key device.key -subj "/CN=muyu1229.xyz" -out device.csr$ openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

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

-rw-rw-r-- 1 lv lv  985 Feb 17 19:04 device.crt-rw-rw-r-- 1 lv lv  895 Feb 17 19:04 device.csr-rw-rw-r-- 1 lv lv 1679 Feb 17 19:03 device.key-rw-rw-r-- 1 lv lv 1675 Feb 17 19:01 rootCA.key-rw-rw-r-- 1 lv lv 1103 Feb 17 19:03 rootCA.pem-rw-rw-r-- 1 lv lv   17 Feb 17 19:04 rootCA.srl

ngrok通过bindata将ngrok源码目录下的assets目录(资源文件)打包到可执行文件(ngrokd和ngrok)中 去,assets/client/tls和assets/server/tls下分别存放着用于ngrok和ngrokd的默认证书文件,我们需要将它们替换成我们自己生成的:(因此这一步务必放在编译可执行文件之前)

cp过程中提示overwrite,输入y回车即可

cp rootCA.pem assets/client/tls/ngrokroot.crtcp device.crt assets/server/tls/snakeoil.crtcp device.key assets/server/tls/snakeoil.key

5.编译客户端程序ngrok和服务端程序ngrokd

在ngrok目录下执行如下命令,编译ngrok和ngrokd,

不同版本的命令如下,按需生成:

GOOS=linux GOARCH=386 make release-server (32位)GOOS=linux GOARCH=amd64 make release-server(64位)GOOS=linux GOARCH=386 make release-client (32位)GOOS=linux GOARCH=amd64 make release-client(64位)
GOOS=darwin GOARCH=386 make release-serverGOOS=darwin GOARCH=amd64 make release-serverGOOS=darwin GOARCH=386 make release-clientGOOS=darwin GOARCH=amd64 make release-client
GOOS=windows GOARCH=386 make release-serverGOOS=windows GOARCH=amd64 make release-serverGOOS=windows GOARCH=386 make release-clientGOOS=windows GOARCH=amd64 make release-client

所有程序都将生成在bin目录中,不同平台将建立不同的子目录

在这里插入图片描述

二、服务端的配置

因为我的服务器是Windows server 2012,所以我编译生成的是ngrok.exe文件,这里演示windows服务端的配置过程。

1.服务端安装golang语言环境

下载地址:

默认安装目录为C:\go,将编译生成的ngrokd.exe复制到C:\Go\bin目录下。

2.编写配置文件

新建一个txt文件,编辑以下内容,然后进行保存,修改后缀名为.bat

ngrokd -domain="muyu1229.xyz" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"

-domain=“muyu1229.xyz"访问内网穿透的域名

-httpAddr=”:80" http服务的访问端口 默认80
-httpsAddr=":443" https服务的访问端口 默认443
-tunnelAddr=":4443" 客户端连接服务端的端口 默认4443
双击运行bat文件,显示为如下图:
在这里插入图片描述
由于80端口被占用,这里用8088和8089代替,服务端到此配置成功。

三、客户端的配置

1.拷贝ngrok文件到客户端

大多数人都是使用Windows系统,这里用Windows10进行演示。

在本地新建一个文件夹,拷贝ngrok.exe到此目录。

2.编写配置文件

新建一个txt文件,编写如下代码,修改文件名为ngrok.cfg

server_addr: "muyu1229.xyz:4443"  trust_host_root_certs: false

把server_addr修改成自己使用的域名和服务端端口即可。

3.启动http和https穿透服务

新建一个txt文件,编写如下代码,修改文件名后缀为http.bat

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

这里演示穿透本地80端口,运行此bat文件显示如下图:

在这里插入图片描述

4.启动tcp穿透服务

建一个txt文件,编写如下代码,修改文件名后缀为tcp.bat

ngrok -proto=tcp -config ngrok.cfg 3389

这里演示穿透远程桌面服务的3389端口,运行此bat文件显示如下图:

在这里插入图片描述
如果没有指定tcp穿透端口,ngrok会随机分配一个端口进行映射,重新启用时端口号可能会有所变化。

5.指定tcp穿透端口

将ngrok.cfg配置文件修改为以下内容:

注意事项(请仔细阅读后进行后面的操作):

1.注释不能出现在cfg配置文件中,不然无法运行,这里只用于解释说明!
2.指定tcp端口最好是50000-65535之间,不容易与其他服务端口冲突。

server_addr: "muyu1229.xyz:4443"  //修改成自己使用的域名和服务端口trust_host_root_certs: falsetunnels:      rdp:                        //自定义tcp服务名称        remote_port: 50000        //服务端端口        proto:            tcp: 3389             //本地端口

将tcp.bat文件修改为以下内容:

ngrok -proto=tcp -config=ngrok.cfg start rdp   //这里的rdp为自定义tcp服务名称

在这里插入图片描述

四、Windows系统下实现开机自启(无窗口运行)

1.准备工作

需要已经编译好的客户端文件,以及编写好的cfg文件和一个运行的bat批处理文件,如图

在这里插入图片描述
注意事项(请仔细阅读后进行后面的操作):
1.首先确保bat文件运行之后能正常实现穿透,不然无窗口运行之后无法进行正常穿透
2.其次确保穿透的端口为指定的tcp端口,否则无窗口运行之后无法查看随机分配的端口
3.开机自启和无窗口运行的目的是为了更方便的进行穿透,能有效得防止手残党误关闭穿透窗口导致穿透终止

2.编写vbs脚本文件

用记事本编辑下列代码,保存为vbs脚本文件

Set ws = CreateObject("Wscript.Shell")ws.run "cmd /c start.bat",vbhide         //将 start.bat 替换成自己的bat文件

在这里插入图片描述

3.创建脚本快捷方式,添加到开机启动目录

1.创建vbs脚本的快捷方式,如图:

在这里插入图片描述
2.按下Win+R键打开运行,输入shell:startup回车,打开启动文件夹。
在这里插入图片描述

3.将创建的vbs脚本的快捷方法复制到启动目录中。

在这里插入图片描述
4.打开任务管理器-启动,查看启动项,如图:
重启电脑,程序就能开机自启了,并且无窗口运行
在这里插入图片描述
Windows server 服务器端开机自启的配置方法相同,这里就不再赘述了。


总结

        到这里总算大功告成了,首先说说感想吧,本人比较喜欢白嫖,所以起初使用的内网穿透服务都是服务商搭建好的,但是感觉用起来很不自在,毕竟是别人提供的服务。虽然免费吧,但是速度的确很慢,穿透本地80端口访问站点的时候总是需要响应很长时间。花钱用付费的话,感觉那些服务商都很不地道,价格普遍偏高,还时不时的会访问超时,各种不稳定的情况时常发生。所以我就萌生了自己搭建一个ngrok服务的想法,上网各种搜索方法,虽然有很多大佬也发布了很多的文章,但我也折腾的挺久的,最后总算折腾成功了。这篇文章写来记录一下自己搭建的一个过程,一是怕自己以后慢慢的就忘了,二是也可以分享给你们,文章里应该有很多不足的地方,请大家帮我指出来,我会及时的改正的,希望大家支持。


本文使用到的下载链接

Centos 8

Golang

ngrok源码(github)


Q&A

1.使用yum安装的时候,下载速度太慢,如何解决?

可以通过修改yum镜像源为国内镜像解决此问题

这里修改为阿里yum源mirrors.aliyun.com
具体操作如下:
1.备份

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2.下载 CentOS-Base.repo 到 /etc/yum.repos.d/(下载对应系统版本)

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-6.repo      //CentOS 6wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo      //CentOS 7wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo      //CentOS 8

3.运行 yum makecache 生成缓存

yum makecache

4.非阿里云ECS用户会出现 Couldn’t resolve host ‘mirrors.cloud.aliyuncs.com’ 信息

不影响使用,用户也可自行修改相关配置

sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo

2.出现“不支持的16位应用程序”错误?

错误如图:

在这里插入图片描述
原因: 使用ftp传输ngrok文件,导致文件异常
解决方法:
        服务器:使用宝塔面板或者其他方式将文件从服务器中下载出来。
        虚拟机:使用VMware Tools将文件从虚拟机直接复制到本地

转载地址:http://fyqof.baihongyu.com/

你可能感兴趣的文章
【Pyton】【小甲鱼】永久存储:腌制一缸美味的泡菜
查看>>
【Pyton】【小甲鱼】异常处理:你不可能总是对的
查看>>
APP性能测试工具
查看>>
【Pyton】【小甲鱼】类和对象
查看>>
压力测试工具JMeter入门教程
查看>>
作为一名软件测试工程师,需要具备哪些能力
查看>>
【Pyton】【小甲鱼】类和对象:一些相关的BIF(内置函数)
查看>>
【Pyton】【小甲鱼】魔法方法
查看>>
单元测试需要具备的技能和4大阶段的学习
查看>>
【Loadrunner】【浙江移动项目手写代码】代码备份
查看>>
Python几种并发实现方案的性能比较
查看>>
[Jmeter]jmeter之脚本录制与回放,优化(windows下的jmeter)
查看>>
Jmeter之正则
查看>>
【JMeter】1.9上考试jmeter测试调试
查看>>
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Python】用Python打开csv和xml文件
查看>>
【Loadrunner】性能测试报告实战
查看>>
【面试】一份自我介绍模板
查看>>