• 云服务器+ngrok搭建内网穿透服务(只有公网ip无域名)


    有的时候在项目开发或者远程开发时,需要把本地端口映射到公网上,让本地端口可以远程访问(TCP(ssh), http, https等),如果自己没有一台拥有公网ip的服务器的话可以租一台阿里云服务器或者腾讯云服务器。

    服务器上操作:

    购买完成后,在腾讯云服务器中添加安全组开放端口,注意,ngrok默认使用4443端口进行通信。
    远程ssh连接到阿里云服务器上,更新(由于腾讯云服务器默认没有root权限,所以加sudo,或者切换为root用户,如果是有root权限,则不用加上sudo)。

    apt-get update
    
    • 1

    安装git和go语言(为ngrok提供支持)

    go安装
    下载
    下载地址:https://studygolang.com/dl
    解压

    tar -zxvf go2.25.1.linux-amd64.tar.gz
    
    • 1

    配置
    vim /etc/profile

    #GO          
    export PATH=$PATH:/opt/go/go/bin
    #GOPATH
    #export GOPATH=/opt/go/workspace
    #export PATH=$PATH:$GOPATH/bin
        
    # Set the GOPROXY environment variable
    export GOPROXY=https://goproxy.io,direct
    # Set environment variable allow bypassing the proxy for specified repos (optional)
    export GOPRIVATE=git.mycompany.com,github.com/my/private
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    编辑完成之后运行下面的命令
    source /etc/profile
    验证

    go version
    
    • 1

    git 安装

    apt-get install git
    
    • 1

    验证

    git --version
    
    • 1

    在这里插入图片描述
    在这里插入图片描述

    下载源码ngrok (项目早已停止更新,源码完全固定)

    下载地址

    或者使用git下载。

     git clone https://github.com/inconshreveable/ngrok.git
    
    • 1

    使用ip生成自签证书
    解决报错:开启服务后,服务端报错 Failed to read message: remote error: bad certificate, 客户端端报错 x509: cannot validate certificate for xx.xx.xx.xx because it doesn't contain any IP SANs

    (参考 https://www.jianshu.com/p/d308b92e58ea)

    # 添加环境配置
    vim /etc/profile
    export DOMAIN=xx.xx.xx.xx # 域名,这里我用了 ip
    # 刷新配置
    serouce /etc/profile
    # 验证配置成功没有
    echo $DOMAIN
    # 生成自签证,一年过期
    echo subjectAltName = IP:xx.xx.xx.xx > extfile.cnf #如果使用ip直接访问的话必须加这一句以及最后的-extfile extfile.cnf
    
    openssl genrsa -out rootCA.key 2048
    openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$DOMAIN" -days 10000 -out rootCA.pem
    openssl genrsa -out device.key 2048
    openssl req -new -key device.key -subj "/CN=$DOMAIN" -out device.csr
    openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 10000 -extfile extfile.cnf
    
    # 复制并覆盖到 assets 构建的时候自动引用
    yes|cp rootCA.pem assets/client/tls/ngrokroot.crt
    yes|cp device.crt assets/server/tls/snakeoil.crt
    yes|cp device.key assets/server/tls/snakeoil.key
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    去掉随机生成的 subdomain

    ngrok 客户端会自动生成一个随机子域名或者用户自定义一个,总之无论如何都会有一个域名,这就会导致 ip 域名无效, 例如http://92832de0.1.1.1.1 -> localhost:80, 解决办法就是改源码,去掉随机生成的 subdomain。代码地址:src/ngrok/server/tunnel.go 第89 行

    // src/ngrok/server/tunnel.go  #89 行
    // Register for random URL
        t.url, err = tunnelRegistry.RegisterRepeat(func() string {
          return fmt.Sprintf("%s://%x.%s", protocol, rand.Int31(), vhost)
        }, t)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    修改后:
    return fmt.Sprintf("%s://%s", protocol, vhost)

    注意: 删掉 %x. ,rand.Int31(), 以及该文件第一行引入的 math/rand,重新编译出服务端与客户端即可。这样不加 -subdomain 选项就不会有子域名

    编译服务端(编译可能会很慢,慢慢等)

    如果出现GnuTLS recv error (-110): The TLS connection was non-properly terminated,安装gnutls-bin

    apt-get install gnutls-bin
    
    • 1

    如果出现go: go.mod file not found in current directory or any parent directory; see 'go help modules'
    解决办法
    开启go modules功能,命令行输入

    #开启
    go env -w GO111MODULE=on
    #关闭
    go env -w GO111MODULE=off
    
    • 1
    • 2
    • 3
    • 4

    再不行关了在开。

    生成客户端与服务端

    <!--linux服务端/客户端-->
    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位)
    
    <!--Mac OS服务端/客户端-->
    GOOS=darwin GOARCH=386 make release-server
    GOOS=darwin GOARCH=amd64 make release-server
    
    GOOS=darwin GOARCH=386 make release-client
    GOOS=darwin GOARCH=amd64 make release-client
    
    
    <!--windows服务端/客户端-->
    GOOS=windows GOARCH=386 make release-server
    GOOS=windows GOARCH=amd64 make release-server
    
    GOOS=windows GOARCH=386 make release-client
    GOOS=windows GOARCH=amd64 make release-client
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    编译完成后在bin目录下应当有如下文件:

    go-bindata  ngrok  ngrokd windows_amd64
    
    • 1

    在这里插入图片描述
    ngrokd是公网阿里云服务器上运行的程序,ngrok是本地运行的程序,可以使用scp拷贝到本地或者使用xftp传输到本地

    启动服务器

    ./bin/ngrokd -tlsKey=device.key -tlsCrt=device.crt -domain="xx.xx.xx.xx" -httpAddr=":8000" -httpsAddr=":8443"
    
    • 1

    参数说明:

    -httpAddr=":8000" http服务的访问端口 默认80
    -httpsAddr=":8443" https服务的访问端口 默认443
    -tunnelAddr=":4443" 客户端连接服务端的端口 默认4443
    注意事项,使用端口时,同时记得配置防火墙。

    启动客户端

    以windows为例:
    /bin/windows_amd64/ngrok.exe文件传输到本地。
    然后在当前目录下新建文件ngrok.cfg,注意与ngrok.exe在相同目录下。

    server_addr: "xx.xx.xx.xx:4443" 
    trust_host_root_certs: false
    
    • 1
    • 2

    然后新建脚本start.bat

    ngrok -config=ngrok.cfg -log=ngrok.log  8080  
    
    • 1

    8080就是本地端口的地址
    norok.log 就是日志的日志的名称
    双击start.bat即可。
    在这里插入图片描述
    在这里插入图片描述

    使用tmux在后台运行程序

    apt-get install tmux
    
    • 1

    新建tmux窗口(名称为ngrok)并进入,退出用Ctrl+D,或者直接关闭窗口

    tmux new-session -s ngrok
    
    • 1

    连接tmux窗口

    tmux attach-session -t ngrok
    
    • 1

    列出所有tmux窗口

    tmux ls
    
    • 1

    关闭某个tmux窗口

    tmux kill-window -t ngrok
    
    • 1
  • 相关阅读:
    Hadoop集群安装,mysql安装,hive安装
    学术论文写作
    macOS 挂载 windows 共享目录
    springboot配置全局异常拦截
    【Android】自制静音App,解决他人手机外放问题
    需求开发到一半需要改别的分支的bug该怎么办呢?(git stash 和 git commit)
    Linux学习第21天:Linux内核定时器驱动开发: 流淌的时间长河
    Nginx--单向链表分析
    关于序列化协议,你需要知道的一些内容(1)
    matlab 最小二乘拟合平面并与XOY平面对齐
  • 原文地址:https://blog.csdn.net/qq_44732146/article/details/126224523