前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >丢弃花生壳,搭建自己的ngrok作为内网穿透服务器

丢弃花生壳,搭建自己的ngrok作为内网穿透服务器

作者头像
幻影网络
发布2022-11-08 15:57:57
1.4K0
发布2022-11-08 15:57:57
举报
文章被收录于专栏:幻影网络科技

> 支持tcp,http 本文为转载!

背景:

公司没有公网,公司在二级路由下面(就是服务商没有给独立IP,也无法动态获取公网IP),然而公司在开发程序的时候,如对接微信等需要返回数据,或者需要别人能访问我们网址,一般我们就只能购买花生壳内网穿透,但是在使用中发现速度慢,经常掉。所以搭建自己的ngrok服务器来保证内网穿透。

环境:

1.一台公网服务器,如阿里云,腾讯云 centos系统。。。

2.一个全新域名或者二级域名泛解析到公网服务器

搭建:

我的域名是ngrok.52hyjs.com,以后解析的子域名是*.ngrok.52hyjs.com

1.域名解析,这里我用的腾讯的解析,其他公司域名解析一样

此图略 懒得截图

2.安装ngrok服务端,由于太繁琐,需要go环境等,这里已经打包脚本,centos系统,其他没有测试,注意ngrok默认需要监听80 443 4443

代码语言:javascript
复制
    #!/bin/bash
# -*- coding: UTF-8 -*-
#############################################
#作者网名:Tommy                            #
#作者博客:www.iyunw.cn                     #
#作者QQ:351937287                          #
#############################################
# 获取当前脚本执行路径
SELFPATH=$(cd "$(dirname "$0")"; pwd)
echo '请输入你的域名'
read DOMAIN
install_yilai(){
    yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ unzip
}

# 安装git
install_git(){
    unstall_git
    if [ ! -f $SELFPATH/git-2.6.0.tar.gz ];then
        wget http://img.iyunw.cn/git-2.6.0.tar.gz
    fi
    tar zxvf git-2.6.0.tar.gz
    cd git-2.6.0
    ./configure --prefix=/usr/local/git
    make
    make install
    ln -s /usr/local/git/bin/* /usr/bin/
    rm -rf $SELFPATH/git-2.6.0
}

# 卸载git
unstall_git(){
    rm -rf /usr/local/git
    rm -rf /usr/local/git/bin/git
    rm -rf /usr/local/git/bin/git-cvsserver
    rm -rf /usr/local/git/bin/gitk
    rm -rf /usr/local/git/bin/git-receive-pack
    rm -rf /usr/local/git/bin/git-shell
    rm -rf /usr/local/git/bin/git-upload-archive
    rm -rf /usr/local/git/bin/git-upload-pack
}


# 安装go
install_go(){
    cd $SELFPATH
    uninstall_go
    # 动态链接库,用于下面的判断条件生效
    ldconfig
    # 判断操作系统位数下载不同的安装包
    if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ];then
        # 判断文件是否已经存在
        if [ ! -f $SELFPATH/go1.7.6.linux-amd64.tar.gz ];then
            wget http://img.iyunw.cn/go1.7.6.linux-amd64.tar.gz
        fi
        tar zxvf go1.7.6.linux-amd64.tar.gz
    else
        if [ ! -f $SELFPATH/go1.7.6.linux-386.tar.gz ];then
            wget http://img.iyunw.cn/go1.7.6.linux-386.tar.gz
        fi
        tar zxvf go1.7.6.linux-386.tar.gz
    fi
    mv go /usr/local/
    ln -s /usr/local/go/bin/* /usr/bin/
}

# 卸载go
uninstall_go(){
    rm -rf /usr/local/go
    rm -rf /usr/bin/go
    rm -rf /usr/bin/godoc
    rm -rf /usr/bin/gofmt
}

# 安装ngrok
install_ngrok(){
    echo '请输入你的域名'
    read DOMAIN
    GOOS=`go env | grep GOOS | awk -F\" '{print $2}'`
    GOARCH=`go env | grep GOARCH | awk -F\" '{print $2}'`
    uninstall_ngrok
    cd /usr/local
    if [ ! -f /usr/local/ngrok.zip ];then
        cd /usr/local/
        wget http://img.iyunw.cn/ngrok.zip
    fi
    unzip ngrok.zip
    export GOPATH=/usr/local/ngrok/
    export NGROK_DOMAIN=$DOMAIN
    cd ngrok
    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 server.key 2048
    openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
    openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
    cp rootCA.pem assets/client/tls/ngrokroot.crt
    cp server.crt assets/server/tls/snakeoil.crt
    cp server.key assets/server/tls/snakeoil.key
    # 替换下载源地址
    sed -i 's#code.google.com/p/log4go#github.com/keepeye/log4go#' /usr/local/ngrok/src/ngrok/log/logger.go
    cd /usr/local/go/src
    GOOS=$GOOS GOARCH=$GOARCH ./make.bash
    cd /usr/local/ngrok
    GOOS=$GOOS GOARCH=$GOARCH make release-server
    echo "install done"
    /usr/local/ngrok/bin/ngrokd -domain=$NGROK_DOMAIN -httpAddr=":80" &
    echo "/usr/local/ngrok/bin/ngrokd -domain=$NGROK_DOMAIN -httpAddr=':80' &" >>/etc/rc.local
}

# 卸载ngrok
uninstall_ngrok(){
    rm -rf /usr/local/ngrok
}

# 编译客户端
compile_client(){
    
    GOOS=`go env | grep GOOS | awk -F\" '{print $2}'`
    GOARCH=`go env | grep GOARCH | awk -F\" '{print $2}'`
    cd /usr/local/go/src
    GOOS=$1 GOARCH=$2 ./make.bash
    cd /usr/local/ngrok/
    GOOS=$1 GOARCH=$2 make release-client
}

# 生成客户端
client(){
    echo '请输入你的域名'
    read DOMAIN
    echo "1、Linux 32位"
    echo "2、Linux 64位"
    echo "3、Windows 32位"
    echo "4、Windows 64位"
    echo "5、Mac OS 32位"
    echo "6、Mac OS 64位"
    echo "7、Linux ARM"

    read num
    case "$num" in
        [1] )
            compile_client linux 386
        ;;
        [2] )
            compile_client linux amd64
        ;;
        [3] )
            compile_client windows 386
        ;;
        [4] ) 
            compile_client windows amd64
        ;;
        [5] ) 
            compile_client darwin 386
        ;;
        [6] ) 
            compile_client darwin amd64
        ;;
        [7] ) 
            compile_client linux arm
        ;;
        *) echo "选择错误,退出";;
    esac

}


echo "请输入下面数字进行选择"
echo "------------------------"
echo "1、全新安装"
echo "2、安装依赖"
echo "3、安装git"
echo "4、安装go环境"
echo "5、安装ngrok"
echo "6、生成客户端"
echo "7、卸载"
echo "8、启动服务"
echo "9、查看配置文件"
echo "------------------------"
read num
case "$num" in
    [1] )
        install_yilai
        install_git
        install_go
        install_ngrok
    ;;
    [2] )
        install_yilai
    ;;
    [3] )
        install_git
    ;;
    [4] )
        install_go
    ;;
    [5] )
        install_ngrok
    ;;
    [6] )
        client
    ;;
    [7] )
        unstall_git
        uninstall_go
        uninstall_ngrok
    ;;
    [8] )
        echo "输入启动域名"
        read domain
        echo "启动端口"
        read port
        /usr/local/ngrok/bin/ngrokd -domain=$domain -httpAddr=":$port"
    ;;
    [9] )
        echo "输入启动域名"
        read domain
        echo server_addr: '"'$domain:4443'"'
        echo "trust_host_root_certs: false"
    ;;
    *) echo "";;
esac

选择1安装完成后,如下图代表已经启动

以后服务端单独启动命令

代码语言:javascript
复制
/usr/local/ngrok/bin/ngrokd -domain=ngrok.iyunw.cn -httpAddr=':80' & #ngrok.52hyjs.com是你的ngrok的域名

2.运行脚本生成客户端,根据你自己的客户端系统的平台选择

生成后在/usr/local/ngrok/bin/下面对应平台的目录下面,如我是windows 64 位,/usr/local/ngrok/bin/windows_amd64/ngrok.exe拷贝到客户机上的一个目录文件夹下

在客户机ngrok.exe该目录下写入配置文件ngrok.cfg,内容是

代码语言:javascript
复制
server_addr: "ngrok.iyunw.cn:4443"
trust_host_root_certs: false
tunnels:
  manager:
    subdomain: "www"
    proto:
      http: "80"

server_addr:你域名的地址:隧道端口 subdomain:域名前缀 proto: http: "80" :客户端需要映射的端口

tcp配置文件

代码语言:javascript
复制
server_addr: "ngrok.iyunw.cn:4443"
trust_host_root_certs: false
tunnels:
  ssh:
    remote_port: 10086 #远程ngrok服务器暴露端口,需要打开ngrok服务器的这个端口防火墙
    proto:
      tcp: 22

在客户机ngrok.exe该目录下写入启动文件ngrok.bat,内容是

代码语言:javascript
复制
ngrok.exe -config ngrok.cfg start manager
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云解析 DNS
云解析 DNS 提供快速、稳定且高可用的 DNS 解析服务,支持智能解析、流量调度、安全防护。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档