使用Ngrok实现内网穿透

Ngrok是国外的一款基于Go语言开发的内网穿透神器,基于Ngrok可以实现TCP、http/https的内穿穿透,并且支持二级域名绑定等等功能。mrcms官网就是采用内网穿透方式部署部署在内网机器里。

实现内网穿透需要有一台公网的服务器,服务器可以选择低配的即可,ngrok占用内存并不高。

下载ngrok1.7.1 源代码

https://github.com/inconshreveable/ngrok

安装GIT

go会利用git拉取相关的依赖代码

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++ git

安装GO运行环境

由于Ngrok采用Go语言开发的,环境是必须的。

wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz
vim /etc/profile
//添加以下内容:
export PATH=$PATH:/usr/local/go/bin
source /etc/profile
//检测是否安装成功go
go version

SSL证书生成

注意:test.cn域名为根级域名,需要将A记录@(泛解析)解析到服务器IP地址。

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=test.cn" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=test.cn" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

将证书拷贝到Ngrok安装目录里:

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

修改log4go依赖

google已经被屏蔽了,因此国内访问不到,改用其他的log4go代码库即可。
如果不改将会在编译的时候不成功。
src/ngrok/log/

package log

import (
        log "code.google.com/p/log4go"
        "fmt"
)

修改为

package log

import (
        log "github.com/keepeye/log4go"
        "fmt"
)

注意:这块可能github的新版本作者已经修复了。

编译服务端

可以编译各种系统服务器的版本。使用
go env查看系统环境填写参数。

GOOS=linux GOARCH=amd64 make release-server

后台运行Ngrokd(服务器端)

setsid ./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="test.cn"  -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":8083"

编译客户端

执行命令后,会在bin目录生成ngrok命令。这就是客户端。

GOOS=linux GOARCH=amd64 make release-client

启动客户端

客户端启动方式有配置形式和命令形式。具体参考帮助文档。命令如下:

ngrok -help

启动例子(配置方式):

ngrok -config=ngrok.cfg start web

后台启动:

setsid ./ngrok -config=ngrok.cfg start kod ngrok bt

客户端配置文件

配置未见为yaml格式。

server_addr: "test.cn:8083"
trust_host_root_certs: false
tunnels:
  webxin:
    subdomain: "weixin"
    proto:
      http: "8080"
  ssh:
    remote_port: 23
    proto:
      tcp: 22

远程连接到服务器

ssh root@test.cn -p 8088
来源: 雨林博客(www.yl-blog.com)