搭建私人 Ngrok 转发通道

不知什么时候,锅内电信把个人pppoe上网的80端口都给封了,更有甚者加入了大内网。于是,苦逼的猿们调微信时候就更崩溃了。。
好在网上有不少内网穿透工具,说白了就是从内网主动发送消息,穿透网关,那么必须就得有一台位于公网的Server来转发消息。具体原理可百度。

众多网站提供的转发服务中,有花生棒之类的限流量,也有不限制但是带宽不足的,毕竟这么多人挤在一起想不慢都难。于是乎,本子自己动手丰衣足食的想法,自己搭建一个吧。

ngrok是这类工具中比较出名的一个了,可惜的是官方已经放弃了开源的1.x版本,2.x版本是官方提供做商业用。关于2.x版本的使用,可以参照这篇文章:http://www.jianshu.com/p/a0a34f770837(PS:简书不错,不像很多网站到处粘贴格式都看不舒服)。

下载ngrok 1.x源码

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

生成证书,比如要使用xxx.tunnel.meanevo.com,则此处域名填写tunnel.meanevo.com

1
2
3
4
5
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=填写域名" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=填写域名" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 3650

替换掉原来的cert

1
2
3
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key

配置Go语言环境,编译参数

安装Go
1
yum install go


4.2、这里可以两种方式
4.2.1、软连接
ln -s /usr/local/go/bin/* /usr/bin/
4.2.2、
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
4.3、
export GOPATH=/usr/local/ngrok/

设置编译参数
  • 服务端32位:

    1
    GOOS=linux GOARCH=386
  • 服务端64位:

    1
    GOOS=linux GOARCH=amd64
  • MacOS:

    1
    GOOS=darwin GOARCH=amd64
  • Windows:

    1
    GOOS=windows GOARCH=amd64

编译server和client,注意client得用自己编译出来的,有些现成的连不上,可能是证书原因

1
2
3
make release-client
make release-server
make release-all
  • 不同平台:
1
2
GOOS=darwin GOARCH=amd64 make release-client
GOOS=linux GOARCH=amd64 make release-server

运行

服务端
1
./bin/ngrokd -domain="tunnel.meanevo.com" -httpAddr=":8080" -httpsAddr=":8081" -tunnelAddr=":4443"

第一个是服务器端的http映射地址,第二个是https,第三个是控制端口。若需直接访问请配通firewall。

客户端
创建一个ngrok.cfg,内容
1
2
server_addr: "tunnel.meanevo.com:4443"
trust_host_root_certs: false
启动
1
ngrok -subdomain 相对二级域名地址 -config=ngrok.cfg 80

这里的相对二级域名就是xxx.tunnel.meanevo.com的xxx

其他及优化

域名DNS:将*.tunnel.meaneovo.com改A记录至服务器IP
个人建议在访问前再加一层nginx反向代理,使用特定域名访问外网80转发到ngrok

ngrok说白了是个被抛弃的项目,官方也说了,存在很大的性能以及内存泄漏问题,并且不会被(官方)修复,可以试试寻找github上修改好的的开源项目

可用于路由ngrok连接(需修改源码,附)

用于Koolshare固件连接,修改源码(https://github.com/koolshare/ngrok-1.7/blob/master/src/ngrok/server/tls.go#L41):

  1. 修改src/ngrok/server/tls.go,第41行添加:
    1
    vi src/ngrok/server/tls.go

QQ20160808-16

  1. 重新编译。
  2. 启动:

    38839900-DD59-45C4-AEA0-0471FB6BFE0B
分享一个启动脚本,可添加此脚本至rc.local实现开机启动

启动脚本(注意修改path、证书位置):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
domain="tunnel.meanevo.com"
http_port=8080
https_port=8081
remote_port=4443
path=/usr/share/ngrok
cert_path=$path/assets/server/tls

NPID=`ps -ef|grep ngrokd|grep -v grep|awk '{print $2}'`
if [ -z "$NPID" ]; then
echo "Not running, starting..."
else
echo "Already running, restarting..."
kill $NPID
fi

nohup $path/bin/ngrokd -domain="$domain" -httpAddr=":$http_port" -httpsAddr=":$https_port" -tlsCrt=$cert_path/snakeoil.crt -tlsKey=$cert_path/snakeoil.key -tunnelAddr=":$remote_port" > /var/log/ngrok.log 2>&1 &
sleep 1
head /var/log/ngrok.log

QQ20160808-12