美文网首页linux tools
Ngrok搭建内网穿透--Centos 7.x

Ngrok搭建内网穿透--Centos 7.x

作者: 前端_逗叔 | 来源:发表于2019-06-03 23:07 被阅读15次

    说明

    前两天买的内网穿透服务到期了,买的是natapp这个,虽然也有免费的,但是每次都会换域名,用着不爽,之前还用过Sunny-Ngrok小米求等等。

    免费的用着始终觉得不爽,收费的我基本都是一个月一个月的开通,虽然钱不多,但是感觉时间过得特别快,还没怎么用就到期了。

    于是就想自己动手搭建一套,反正域名是有的,就差一台服务器了,由于之前项目都是买的阿里云服务器,所以看了一下阿里云的服务器,但是最便宜的也要500大洋左右,本来就是打算买来玩一玩的,500大洋有点舍不得,然后又看了腾讯云、华为云、百度云等,其实价格也都差不多。

    最后找到一个叫UCloud,这价格看下来还是可以的,准备是想买1C1G的,但是想着后面如果还要折腾点什么东西可能会卡,所以就买了一个1C2G的,因为我是新用户注册然后还送了50块钱,反正最后实付了150块。感觉还是挺值的,1年150块,一天也就5毛钱左右(少抽支烟就好了,啊哈哈,说这么多感觉像是在打广告似的,还特意的去搜索了一下UCloudUC浏览器是啥关系,好像没毛关系)

    image.png

    网上有很多关于Ngrok的搭建教程,但是在我实际操作的时候还是遇到了一些问题,所以这里记录一下。

    1.前期准备

    安装了XshellXftp这两个软件,然后就是破解,关于怎么安装、怎么使用、怎么破解百度就好了。

    2.系统选择

    在网上搜索了Ngrok的搭建,基本都是基于Linux的,加上最近也在试着逼着自己使用Linux,所以也没考虑直接买的Linux的服务器。【用了一天感觉还行,用XshellXftp连接的时候稍微有一点点慢,下载速度也还能接受,其他感觉都还行,毕竟一分钱一分货】

    image.png

    3.域名解析

    域名是刚开始入行的时候就购买的【intolearn.com】,刚入行的时候总是想拥有一个属于自己的网站,搭建过各种开源的博客系统,后面由于懒都不了了之了(主要是懒得维护),虽然没有坚持下来,但是有的事情总得经历一下,去折腾一下,比如这次搭建Ngrok也是在折腾,满足一下好奇心。

    域名是在阿里云上面解析的,由于一级域名intolearn.com解析到的是其他地方,所以我是用二级域名来搭建的。

    • ngrok.intolearn.com : 用来为ngrok服务器本身提供外部访问,解析到刚买的服务器上面
    • haiyang.ngrok.intolearn.com : 用来映射到我的笔记本,CNAME的方式解析到 ngrok.intolearn.com
      image.png

    4.服务器环境

    4.1.安装gcc

    先检查一下系统是否已经默认安装了,如果没有安装就安装一下就好了,我买的这个服务器上面默认是已经安装了的,所以我就没有安装了。

    yum install gcc -y    //安装
    gcc -v 或者 gcc --version  //检查是否安装成功
    
    image.png

    4.2. 安装git

    git是用来下载ngrok源码的,不是必选的,你可以先下载到本地然后上传到服务器也是可以的,我选择的是直接在服务器上下载。

    yum install git -y  //安装
    git --version  //检查是否安装成功
    
    image.png

    有几篇文章都说是版本要 >=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/

    image.png
    可以直接下载到本地然后上传到服务器上面,也可以直接在服务器上面执行命令下载,我是直接执行命令下载的,我是下载到的/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
    
    image.png
    export PATH=$PATH:/usr/local/go/bin
    export GOPATH=/root/go
    

    第一次使用这个vim,用着很别扭,可以直接把这个文件拉到本地用编辑器打开修改完成后在上传到服务器上面(虽然我很想这么干,但是还是强迫自己没有这么干,没有为什么就单纯的满足好奇心)。
    然后执行检查命令终于成功了,这一步真的是卡了大半天,查各种资料加上对linux不熟耗费了很多时间,还好最终出来了。

    image.png

    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文件夹中生成如下文件

    image.png

    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端口

    出现下图就表示成功了


    image.png

    tips: 第一次运行我是没有成功的,因为买的服务器防火墙并没有允许4443端口访问,自己添加上就可以了,阿里云是在安全组里面设置,ucloud里面是在外网防火墙里面设置。

    image.png

    7.启动客户端

    在第5.5步中生成了客户端,具体位置在/usr/local/ngrok/bin/windows_amd64,把里面的文件下载到本地来,我放在了本地E:\Ngrok文件夹里面。

    image.png

    然后在同级目录中创建ngrok.cfgstart.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文件运行

    image.png
    这就表示已经成功了。

    8.测试

    在浏览器中输入http://haiyang.ngrok.intolearn.com

    image.png
    然后用手机开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]部分主要是对这个服务的说明
    1. Description 用于描述服务
    2. After 用于描述服务类别
    • [Service]部分是服务的关键,是服务的一些具体运行参数的设置
    1. Type=forking是后台运行的形式;
    2. User=users是设置服务运行的用户;
    3. Group=users是设置服务运行的用户组;
    4. PIDFile为存放PID的文件路径;
    5. ExecStart为服务的具体运行命令;
    6. ExecReload为重启命令;
    7. ExecStop为停止命令;
    8. PrivateTmp=True表示给服务分配独立的临时空间
      [Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
    • [Install]部分是服务安装的相关设置,可设置为多用户的

    • systemctl 是管制服务的主要工具, 它整合了chkconfigservice功能于一体。

    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
      image.png
      然后start.bat文件中就可以随便写名字了
    ngrok -config=ngrok.cfg -subdomain 自定义域名前缀 自定义端口
    // ngrok -config=ngrok.cfg -subdomain test2 8080
    

    10.2. 问题

    客户端每次启动都会打开窗口,并且要一直不关闭,关闭后就不行了,有的时候就会不小心关闭了,要是能安装成window服务就好了。

    11.参考文章

    Centos搭建Ngrok实现内网穿透
    10分钟教你搭建自己的ngrok服务器
    阿里云搭建自己的ngrok服务-实现内网穿透

    相关文章

      网友评论

        本文标题:Ngrok搭建内网穿透--Centos 7.x

        本文链接:https://www.haomeiwen.com/subject/zoegtctx.html