说明
前两天买的内网穿透服务到期了,买的是natapp这个,虽然也有免费的,但是每次都会换域名,用着不爽,之前还用过Sunny-Ngrok、小米求等等。
免费的用着始终觉得不爽,收费的我基本都是一个月一个月的开通,虽然钱不多,但是感觉时间过得特别快,还没怎么用就到期了。
于是就想自己动手搭建一套,反正域名是有的,就差一台服务器了,由于之前项目都是买的阿里云服务器,所以看了一下阿里云的服务器,但是最便宜的也要500大洋左右,本来就是打算买来玩一玩的,500大洋有点舍不得,然后又看了腾讯云、华为云、百度云等,其实价格也都差不多。
最后找到一个叫UCloud,这价格看下来还是可以的,准备是想买1C1G的,但是想着后面如果还要折腾点什么东西可能会卡,所以就买了一个1C2G的,因为我是新用户注册然后还送了50块钱,反正最后实付了150块。感觉还是挺值的,1年150块,一天也就5毛钱左右(少抽支烟就好了,啊哈哈,说这么多感觉像是在打广告似的,还特意的去搜索了一下UCloud
和UC浏览器
是啥关系,好像没毛关系)
网上有很多关于Ngrok
的搭建教程,但是在我实际操作的时候还是遇到了一些问题,所以这里记录一下。
1.前期准备
安装了Xshell
和Xftp
这两个软件,然后就是破解,关于怎么安装、怎么使用、怎么破解百度就好了。
2.系统选择
在网上搜索了Ngrok
的搭建,基本都是基于Linux
的,加上最近也在试着逼着自己使用Linux
,所以也没考虑直接买的Linux
的服务器。【用了一天感觉还行,用Xshell
和Xftp
连接的时候稍微有一点点慢,下载速度也还能接受,其他感觉都还行,毕竟一分钱一分货】
3.域名解析
域名是刚开始入行的时候就购买的【intolearn.com】
,刚入行的时候总是想拥有一个属于自己的网站,搭建过各种开源的博客系统,后面由于懒都不了了之了(主要是懒得维护),虽然没有坚持下来,但是有的事情总得经历一下,去折腾一下,比如这次搭建Ngrok
也是在折腾,满足一下好奇心。
域名是在阿里云上面解析的,由于一级域名intolearn.com
解析到的是其他地方,所以我是用二级域名来搭建的。
-
ngrok.intolearn.com
: 用来为ngrok
服务器本身提供外部访问,解析到刚买的服务器上面 -
haiyang.ngrok.intolearn.com
: 用来映射到我的笔记本,CNAME
的方式解析到ngrok.intolearn.com
4.服务器环境
4.1.安装gcc
先检查一下系统是否已经默认安装了,如果没有安装就安装一下就好了,我买的这个服务器上面默认是已经安装了的,所以我就没有安装了。
yum install gcc -y //安装
gcc -v 或者 gcc --version //检查是否安装成功
4.2. 安装git
git
是用来下载ngrok
源码的,不是必选的,你可以先下载到本地然后上传到服务器也是可以的,我选择的是直接在服务器上下载。
yum install git -y //安装
git --version //检查是否安装成功
有几篇文章都说是版本要 >=1.7,不然会有问题,这个我没试过,反正执行安装命令后就是1.8了。
4.3. 安装go语言环境
yum install -y mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386
这一串命令我也不知道是干嘛的,反正就是按照教程执行。然后就是检查是否安装成功。
go version //检查是否安装成功
这一步反正我是没有成功,提示找不到go
命令。
然后我又重新执行了一下 yum install golang
,可是还是没有成功,提示No package golang available.
然后百度一番别人说要先安装epel
这个东西,具体是啥我也不知道,yum install epel-release
再次执行 yum install golang
还是没有成功,相同的提示,别人都应该已经成功,但是我也不知道为啥我的就不成功。
最后是安装官网教程安装成功成功的,https://golang.google.cn/dl/
可以直接下载到本地然后上传到服务器上面,也可以直接在服务器上面执行命令下载,我是直接执行命令下载的,我是下载到的
/usr/local
这个目录里面的。
cd /usr/local //进入目录
wget https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz //下载
tar -C /usr/local -xzf go1.12.5.linux-amd64.tar.gz //解压
然后设置环境变量
vim /etc/profile
export PATH=$PATH:/usr/local/go/bin
export GOPATH=/root/go
第一次使用这个vim
,用着很别扭,可以直接把这个文件拉到本地用编辑器打开修改完成后在上传到服务器上面(虽然我很想这么干,但是还是强迫自己没有这么干,没有为什么就单纯的满足好奇心)。
然后执行检查命令终于成功了,这一步真的是卡了大半天,查各种资料加上对linux不熟耗费了很多时间,还好最终出来了。
5.安装Ngrok
5.1.下载Ngrok源码
cd /usr/local/
git clone https://github.com/inconshreveable/ngrok.git
会在当前目录生成ngrok文件夹
5.2. 生成证书
cd ngrok
export NGROK_DOMAIN="ngrok.intolearn.com" //记得域名换成自己的
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
5.3. 替换证书
//一行一行执行,然后会提示是否覆盖,输入 “y” 回车就可以了
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
5.4. 生成服务端
GOOS=linux GOARCH=amd64 make release-server
5.5. 生成客户端
我的笔记本是window 64位,所以我生成的window版本,其他版本不知道对不对。
GOOS=windows GOARCH=amd64 make release-client //windows 64位
GOOS=windows GOARCH=amd64 make release-client //windows 32位
GOOS=darwin GOARCH=386 make release-client //Mac OS 32位
GOOS=darwin GOARCH=amd64 make release-client //Mac OS 64位
GOOS=linux GOARCH=amd64 make release-client //Linux 64位
GOOS=linux GOARCH=arm make release-client //ARM 平台
服务端和客户端会在/usr/local/ngrok/bin
文件夹中生成如下文件
6.启动服务端
cd /usr/local/ngrok
./bin/ngrokd -domain="ngrok.intolearn.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
//或者
./bin/ngrokd -domain="ngrok.intolearn.com"
- -domain : 域名
- -httpAddr :
ngrok
用来转发http
服务的端口,默认80
端口 - -httpsAddr :
ngrok
用来转发https
服务的端口,默认443
端口 - -tunnelAddr :
ngrok
用来跟客户端通讯的端口,默认4443
端口
出现下图就表示成功了
tips: 第一次运行我是没有成功的,因为买的服务器防火墙并没有允许4443
端口访问,自己添加上就可以了,阿里云是在安全组里面设置,ucloud里面是在外网防火墙里面设置。
7.启动客户端
在第5.5步中生成了客户端,具体位置在/usr/local/ngrok/bin/windows_amd64
,把里面的文件下载到本地来,我放在了本地E:\Ngrok
文件夹里面。
然后在同级目录中创建ngrok.cfg
和start.bat
文件。
-
ngrok.cfg
文件内容
server_addr: "ngrok.intolearn.com:4443"
trust_host_root_certs: false
-
start.bat
文件内容
ngrok -config=ngrok.cfg -subdomain haiyang 80
// haiyang就是你想要访问域名的前缀
// 80表示本地需要穿透的端口
创建完成后双击start.bat
文件运行
这就表示已经成功了。
8.测试
在浏览器中输入http://haiyang.ngrok.intolearn.com
然后用手机开4G网络访问也能访问到,这样就已经搭建了。
9.将Ngrok(服务端)添加到服务
每次关闭Xshell
,服务就关掉了,总不能一直开着窗口吧,怎么才能后台运行呢或者安装成服务设置开机启动?
9.1. 新建ngrok.service文件
cd /usr/lib/systemd/system //进入目录
cat >>ngrok.service //创建文件夹,回车后直接按`ctrl+d`
vim ngrok.service //编辑文件
输入一下信息:
[Unit]
Description=Share local port(s) with ngrok
After=syslog.target network.target
[Service]
PrivateTmp=true
Type=simple
Restart=always
RestartSec=1min
StandardOutput=null
StandardError=null
ExecStart=/usr/local/ngrok/bin/ngrokd -domain=ngrok.intolearn.com -httpAddr=:80 -httpsAddr=:443 -tunnelAddr=:4443 %i
ExecStop=/usr/bin/killall ngrok
[Install]
WantedBy=multi-user.target
然后运行
systemctl daemon-reload
systemctl start ngrok.service
9.2.文件参数说明
-
[Unit]
部分主要是对这个服务的说明
-
Description
用于描述服务 -
After
用于描述服务类别
-
[Service]
部分是服务的关键,是服务的一些具体运行参数的设置
-
Type=forking
是后台运行的形式; -
User=users
是设置服务运行的用户; -
Group=users
是设置服务运行的用户组; -
PIDFile
为存放PID的文件路径; -
ExecStart
为服务的具体运行命令; -
ExecReload
为重启命令; -
ExecStop
为停止命令; -
PrivateTmp=True
表示给服务分配独立的临时空间
[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
[Install]
部分是服务安装的相关设置,可设置为多用户的systemctl
是管制服务的主要工具, 它整合了chkconfig
与service
功能于一体。
systemctl enable ngrok.service #加入开机启动
systemctl daemon-reload #重新载入 systemd,扫描新的或有变动的单元
systemctl is-enabled iptables.service
systemctl is-enabled ngrok.service #查询服务是否开机启动
systemctl enable ngrok.service #开机运行服务
systemctl disable ngrok.service #取消开机运行
systemctl start ngrok.service #启动服务
systemctl stop ngrok.service #停止服务
systemctl restart ngrok.service #重启服务
systemctl reload ngrok.service #重新加载服务配置文件
systemctl status ngrok.service #查询服务运行状态
systemctl --failed #显示启动失败的服务
10.其他问题
10.1.问题1
现在有同事也需要用我这个域名,那么正常的方法就是在阿里云域名解析里面在解析一条记录就好了,但是这样感觉有点麻烦,要是客户端能随便定义名字就好了。
- 解决方法
在阿里云域名解析成*.ngrok
然后start.bat
文件中就可以随便写名字了
ngrok -config=ngrok.cfg -subdomain 自定义域名前缀 自定义端口
// ngrok -config=ngrok.cfg -subdomain test2 8080
10.2. 问题
客户端每次启动都会打开窗口,并且要一直不关闭,关闭后就不行了,有的时候就会不小心关闭了,要是能安装成window
服务就好了。
- 解决方法
之前搞Grafana的时候搞过,安装方法一摸一样。
把Grafana作为Windows服务来启动
11.参考文章
Centos搭建Ngrok实现内网穿透
10分钟教你搭建自己的ngrok服务器
阿里云搭建自己的ngrok服务-实现内网穿透