使用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