Centos搭建Ngrok实现内网穿透

首先说一下,什么是内网穿透?我举个栗子,比如你在本地搭建的网站,想让局域网外的人访问,该怎么实现?这里有个很多人都熟知的工具:花生壳。最开早我用的是向日葵+花生壳,一个实现远程连接;一个实现内网穿透;在后来通过室友知道了可以用centod搭建ngrok这个开源的双向代理,来实现向日葵+花生壳的功能。和另一个室友花了整整一天的时间完成了。在这里整理下完成的步骤以及过程中遇到的问题。


准备

一台云服务器,一个域名,并且域名泛解析解析到云服务器,此处我用的服务器的操作系统为CentOS7(amd64)

image

安装环境

安装gcc和git(用于下载ngrok源码)

1
2
yum install gcc -y
yum install git -y

安装go语言环境

1
yum install -y mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386

检查环境安装

1
2
git --version //( >= 1.7 )
go version

在服务器上搭建Ngrok服务

  1. 下载ngrok源码
    1
    git clone https://github.com/inconshreveable/ngrok.git
  2. 生成证书
    1
    cd ngrok
    abc.com这里修改为自己的域名
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    export NGROK_DOMAIN="abc.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
  3. 将新生成的证书替换,执行下面命令后 “y” 回车 一行一行执行代码!
    1
    2
    3
    4
    5
    cp rootCA.pem assets/client/tls/ngrokroot.crt

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

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

    编译生成ngrokd(服务端)

    1
    GOOS=linux GOARCH=amd64 make release-server
    生成在~/ngrok/bin/目录中

编译生成ngrok(客户端)

1
GOOS=windows GOARCH=amd64 make release-client

生成在~/ngrok/bin/windows_amd64/目录中

用SSH Secure Shell Client工具

将~/ngrok/bin/windows_amd64/里的文件下载到本地Windows下,如D:\ngrok

在D:\ngrok中新建文件,改名为 ngrok.cfg

文件中输入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server_addr: "abc.com:8083"
trust_host_root_certs: false
tunnels:
http:
subdomain: "www"
proto:
http: "80"

https:
subdomain: "www"
proto:
https: "443"

ssh:
remote_port: 2222
proto:
tcp: "22"

mstsc:
remote_port: 52222
proto:
tcp: "192.168.0.107:3389"

以上 8083 80 443 与 远程开启的端口一致,

####注意:一定要根据自己的实际情况在服务器后台安全组规则中开启或删除(我因为相对应的服务器安全组没开,卡了好久,希望可以帮助到大家)。

开启远程服务

在ngrok目录中

如果不在

1
2
3
cd ngrok

sudo ./bin/ngrokd -domain="abc.com"  -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":8083" &

这里的端口号与config文件对应,视情况而定

1
2
3
4
5
6
7
8
9
[16:05:23 CST 2018/01/09][INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry][tun] No affinity cache specified

[16:05:23 CST 2018/01/09][INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:80

[16:05:23 CST 2018/01/09][INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443

[16:05:23 CST 2018/01/09][INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:8083

[16:05:23 CST 2018/01/09][INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds

显示此为成功开启

补充:如果有关闭终端,相关程序就被杀死的情况,可以参考我的另一篇文章https://www.jianshu.com/p/dc6bb826045b

开启客户机服务

在Windows中D:\ngrok新建文件 改名 start.bat

输入:

ngrok -config=ngrok.cfg start http https ssh mstsc

直接双击运行
image.png

表示成功,

不成功的话看看自己的开启端口是否与config文件中对应

或查看服务器的远程端口是否在安全组中打开

###!!!这很重要!!!

关于ngrok在远程开机自启问题

服务器后台开机启动运行ngrok服务端:

  1. 以下内容新建一个 start.sh 文件 放到 ~/ngrok/start.sh

    1
    ~/ngrok/bin/ngrokd -domain="abc.com"  -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":8083" &

    给权限:

    1
    chmod 755 ~/ngrok/start.sh
  2. 新建ngrok启动脚本文件

    1
    sudo vi /etc/init.d/ngrok

    文件内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    !/bin/sh

    BEGIN INIT INFO

    Provides:          ngrok

    Required-Start:

    Required-Stop:

    Default-Start:    2 3 4 5

    Default-Stop:      0 1 6

    Short-Description: Start or stop the ngrok Proxy.

    END INIT INFO

    ngrok_path=~/ngrok/

    case "$1" in

        start)

                echo "start ngrok service.."

                sh ${ngrok_path}/start.sh

                ;;

      *)

        exit 1

        ;;

    esac

    提示 : 运行sudo vi /etc/init.d/ngrok之后 !!直接按键盘 I 进入编辑模式,然后复制下面内容 然后 “esc” “:” “wq” “!” “回车” 意思是保存退出!

  3. ngrok脚本文件 给权限

    1
    2
    3
    cd /etc/init.d

    chmod 755 ngrok
  4. 添加启动服务 ngrok

    1
    chkconfig –add ngrok
  5. 测试服务是否能启动成功

    1
    service ngrok start
  6. 查看自启动的服务 是否有 nrgok !!

    1
    chkconfig

    执行这个代码如果出现后面的就OK了!! ngrok 0:off 1:off 2:on 3:on 4:on 5:on 6:off

服务器ngrok的服务端开机自动启动成功了!!!

文章作者: Luis
文章链接: https://warrest.github.io/2020/05/08/Centos%E6%90%AD%E5%BB%BANgrok%E5%AE%9E%E7%8E%B0%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Luis's Blog