美文网首页Architecture
使用 Ngrok 实现内网穿透

使用 Ngrok 实现内网穿透

作者: 95a6af369245 | 来源:发表于2019-02-20 16:00 被阅读311次

      最近在做 Server 开发,需要将一个内网的服务暴露出去,使其在家也能访问到。

      ngrok 是一个反向代理工具,官方有免费的可以使用,但是由于海外原因速度非常慢。好在这套服务都开源了,我们可以用开源代码搭建一个服务,自己使用。

      搭建 Ngrok 服务器

      1、首先你需要:

      一个公网服务器

      备案过的域名

      如果你没有的话,可以加我微信说明来意,我愿意免费给你用我的。

      2、安装 Git 和 Golang

      apt-get install build-essential golang mercurial git

      ubuntu自带的 golang 是1.2,版本非常低,需要手动升级,而偏偏垃圾Golang 1.5开始自举,必须自己编译自己。所以如果你的版本是1.2或所有1.5以下的版本。

      你需要:首先升级到1.4,然后用1.4编译安装Golang1.5,然后从1.5开始安装最新版本。

      安装Golang1.4

      Golang下载地址: https://dl.gocn.io/

      首先下载一个1.4.3版本的golang,例如我的下载目录是/tmp下面

      tar -xzf go1.4.linux-amd64.tar.gz

      cd go/src

      ./make.bash 编译

      安装成功,将会输出:

      ALL TESTS PASSED

      —

      Installed Go for linux/amd64 in /home/you/go.

      Installed commands in /home/you/go/bin.

      *** You need to add /home/you/go/bin to your $PATH. ***

      cd /tmp

      mv go /{$HOME}/go1.4

      将编译好的golang1.4拷贝到{KaTeX parse error: Expected 'EOF', got '}' at position 5: HOME}̲目录下,在下一步编译golan…HOME}目录下找go1.4

      KaTeX parse error: Expected 'EOF', got '不' at position 5: HOME不̲同的环境不同,我的ubuntu…HOME

      安装golang1.9

      这个地方有一个坑,我编译1.8版本的时候会在中途卡死,编译不过去,因此建议最好不要编译1.8版本的,直接跳到1.9或者用1.7

      首先下载一个1.9版本的golang,我的下载目录是/tmp下面

      rm -rf go 删掉上一次编译的1.4

      tar -xzf go1.9.linux-amd64.tar.gz

      cd go/src

      ./all.bash 编译

      安装成功,将会输出:

      ALL TESTS PASSED

      —

      Installed Go for linux/amd64 in /home/you/go.

      Installed commands in /home/you/go/bin.

      *** You need to add /home/you/go/bin to your $PATH. ***

      cd /tmp

      mv go /{$HOME}/go1.9

      ln -s /{$HOME}/go1.9/bin/go /usr/bin/go

      完成安装

      执行命令 go version

      编译 Ngrok

      1、 首先从GitHub clone源码:

      git clone https://github.com/tutumcloud/ngrok.git

      2、 生产签名证书

      使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自建ngrokd服务,如果不想买SSL证书,我们需要生成自己的自签名证书,并编译一个携带该证书的ngrok客户端。

      证书生成过程需要一个二级域名。 比如,我的域名是kymjs.com,我替换成自己的二级域名ngrok.kymjs.com。

      cd ngrok

      NGROK_DOMAIN=ngrok.kymjs.com

      openssl genrsa -out base.key 2048

      openssl req -new -x509 -nodes -key base.key -days 10000 -subj /CN=$NGROK_DOMAIN -out base.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 base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

      3、复制生成的证书到ngrok目录中

      cp base.pem assets/client/tls/ngrokroot.crt

      4、开始编译服务端程序和客户端程序

      make release-server release-client

      编译成功后会在bin目录下找到ngrokd和ngrok这两个文件。其中ngrokd 就是服务端程序了。

      5、启动服务端程序

      /bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain=ngrok.kymjs.com -httpAddr=:9080 -httpsAddr=:9443

      httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,可以随意指定。ngrokd 还会开一个 4443 端口用来跟客户端通讯(可通过 -tunnelAddr=”:xxx” 指定)。由于我的80和443端口另有用处,这里就使用了9080和9443替代了,反正端口号无所谓。

      6、设置本地客户端

      在同级目录下新建一个配置文件ngrok.cfg

      server_addr: ngrok.kymjs.com:4443

      trust_host_root_certs: false

      然后命令行启动ngrok客户端

      ngrok -config=ngrok.cfg -log=ngrok.log -subdomain=tomcat 8080

      这样就成功将原本内网的localhost:8080代理到外网的tomcat.ngrok.kymjs.com:9080了

      注意事项

      mac系统如果是ssh登录的,当你退出当前ssh的时候,你启动的ngrok进程也会随之停止(类似ssh启动一个springboot程序的时候一样),解决方法是先用screen命令新开一个进程,然后再执行自己的程序:

      screen

      java -jar xxx.jar

    相关文章

      网友评论

        本文标题:使用 Ngrok 实现内网穿透

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