搭建ngrok服务器实现内网穿透

准备工作

  1. 云服务器,一个域名,域名解析到云服务器,本人用的阿里云ecs和域名
  2. 服务器环境
#安装gcc wget
yum install gcc wget -y
#下载yum仓库
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
#添加yum仓库
rpm -ivh epel-release-latest-7.noarch.rpm
#安装go
yum install golang
#验证go
go version
  1. 安装ngrok服务器
#下载ngrok1.7
cd /usr/local/src
wget https://github.com/inconshreveable/ngrok/archive/1.7.1.tar.gz
tar -xf 1.7.1.tar.gz && cd ngrok-1.7.1
#自己服务器的域名
echo export NGROK_DOMAIN="example.com">>~/.bash_profile
source ~/.bash_profile
#生成证书
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
#覆盖证书
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
#生成服务端  (路径/usr/local/src/ngrok-1.7.1/bin/ngrokd)
#在编译客户端的时候需要指明对应的操作系统和构架:
#Linux 平台 32 位系统:GOOS=linux GOARCH=386
#Linux 平台 64 位系统:GOOS=linux GOARCH=amd64
#Windows 平台 32 位系统:GOOS=windows GOARCH=386
#Windows 平台 64 位系统:GOOS=windows GOARCH=amd64
#MAC 平台 32 位系统:GOOS=darwin GOARCH=386
#MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64
#ARM 平台:GOOS=linux GOARCH=arm
GOOS=linux GOARCH=amd64 make release-server

可能碰到的问题

package code.google.com/p/log4go: Get https://code.google.com/p/log4go/source/checkout?repo=: dial tcp 216.58.197.110:443: i/o timeout
因为google被墙,如果服务器不在墙外或者没有FQ则无法访问到code.google.com.
解决方法:在 ngrok/src/ngrok/log 目录下找到 logger.go 文件,修改其中第4或5行的:
log "code.google.com/p/log4go”为
log "github.com/keepeye/log4go"

#生成客户端   (路径/usr/local/src/ngrok-1.7.1/bin/ngrok)
GOOS=linux GOARCH=amd64 make release-client
#后台启动服务端
nohup ./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="$NGROK_DOMAIN"  -httpAddr=":8081" -httpsAddr=":8082" -tunnelAddr=":8083" > ngrok.log 2>&1 &
  1. ngrok客户端服务器环境搭建
#安装gcc wget screen
yum install gcc wget screen -y
#下载yum仓库
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
#添加yum仓库
rpm -ivh epel-release-latest-7.noarch.rpm
#安装go
yum install golang
#验证go
go version
  1. 下载客户端到客户端服务器并添加配置文件ngrok.yml在ngrok同路径下:
#server_addr=${NGROK_DOMAIN}:${tunnelAddr}
server_addr: "example.com:8083"
#用证书生成出来的客户端为false
trust_host_root_certs: false
#具体映射的端口,ssh服务把本地的22端口映射到server的6666端口
tunnels:
  ssh:
    remote_port: 6666
    proto:
      tcp: 22
  1. 后台启动ngrok客户端
#利用screen启动session叫ngrok的终端
screen -S ngrok
#启动ngrok命令 -config为配置文件目录  ssh为配置文件中的映射服务名称
./ngrok -config=ngrok.yml start ssh
#看到界面中tunnel status 为online 说明启动成功,其他状态查看日志文件查找具体原因
#脱离ngrok的screen
crtl + a + d