本文共 6298 字,大约阅读时间需要 20 分钟。
如上封面图所示,举一个栗子:
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是利用go语言开发的,所以先要在Linux系统中安装go语言开发环境。
sudo yum install golang
安装完毕后,利用go version来验证是否安装成功。
在Linux上是有yum安装Git,非常简单,只需要一行命令
yum -y install git
输入 git version查看Git是否安装完成以及查看其版本号
git version
下面编译过程需要改官方的部分源码,所以最好fork一份源码至自己的github账户。
$ mkdir -p ~/ngrok$ cd ~/ngrok$ git clone https://github.com/muyu1229/ngrok.git
首先安装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
在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服务端的配置过程。
下载地址:
默认安装目录为C:\go,将编译生成的ngrokd.exe复制到C:\Go\bin目录下。新建一个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代替,服务端到此配置成功。大多数人都是使用Windows系统,这里用Windows10进行演示。
在本地新建一个文件夹,拷贝ngrok.exe到此目录。新建一个txt文件,编写如下代码,修改文件名为ngrok.cfg
server_addr: "muyu1229.xyz:4443" trust_host_root_certs: false
把server_addr修改成自己使用的域名和服务端端口即可。
新建一个txt文件,编写如下代码,修改文件名后缀为http.bat
ngrok -config=ngrok.cfg -subdomain=ngrok 80
这里演示穿透本地80端口,运行此bat文件显示如下图:
建一个txt文件,编写如下代码,修改文件名后缀为tcp.bat
ngrok -proto=tcp -config ngrok.cfg 3389
这里演示穿透远程桌面服务的3389端口,运行此bat文件显示如下图:
如果没有指定tcp穿透端口,ngrok会随机分配一个端口进行映射,重新启用时端口号可能会有所变化。将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服务名称
需要已经编译好的客户端文件,以及编写好的cfg文件和一个运行的bat批处理文件,如图
注意事项(请仔细阅读后进行后面的操作): 1.首先确保bat文件运行之后能正常实现穿透,不然无窗口运行之后无法进行正常穿透 2.其次确保穿透的端口为指定的tcp端口,否则无窗口运行之后无法查看随机分配的端口 3.开机自启和无窗口运行的目的是为了更方便的进行穿透,能有效得防止手残党误关闭穿透窗口导致穿透终止用记事本编辑下列代码,保存为vbs脚本文件
Set ws = CreateObject("Wscript.Shell")ws.run "cmd /c start.bat",vbhide //将 start.bat 替换成自己的bat文件
1.创建vbs脚本的快捷方式,如图:
2.按下Win+R键打开运行,输入shell:startup回车,打开启动文件夹。3.将创建的vbs脚本的快捷方法复制到启动目录中。
4.打开任务管理器-启动,查看启动项,如图: 重启电脑,程序就能开机自启了,并且无窗口运行 Windows server 服务器端开机自启的配置方法相同,这里就不再赘述了。到这里总算大功告成了,首先说说感想吧,本人比较喜欢白嫖,所以起初使用的内网穿透服务都是服务商搭建好的,但是感觉用起来很不自在,毕竟是别人提供的服务。虽然免费吧,但是速度的确很慢,穿透本地80端口访问站点的时候总是需要响应很长时间。花钱用付费的话,感觉那些服务商都很不地道,价格普遍偏高,还时不时的会访问超时,各种不稳定的情况时常发生。所以我就萌生了自己搭建一个ngrok服务的想法,上网各种搜索方法,虽然有很多大佬也发布了很多的文章,但我也折腾的挺久的,最后总算折腾成功了。这篇文章写来记录一下自己搭建的一个过程,一是怕自己以后慢慢的就忘了,二是也可以分享给你们,文章里应该有很多不足的地方,请大家帮我指出来,我会及时的改正的,希望大家支持。
Centos 8
Golang
ngrok源码(github)
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/