不知什么时候,锅内电信把个人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.example.com,则此处域名填写example.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
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位:
- 服务端64位:
- 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="example.com" -httpAddr=":8080" -httpsAddr=":8081" -tunnelAddr=":4443"
|
第一个是服务器端的http映射地址,第二个是https,第三个是控制端口。若需直接访问请配通firewall。
客户端
创建一个ngrok.cfg,内容
1 2
| server_addr: "example.com:4443" trust_host_root_certs: false
|
启动
1
| ngrok -subdomain 相对二级域名地址 -config=ngrok.cfg 80
|
这里的相对二级域名就是xxx.example.com的xxx
其他及优化
域名DNS:将*.example.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):
- 修改src/ngrok/server/tls.go,第41行添加:
1
| vi src/ngrok/server/tls.go
|
![QQ20160808-16]()
2. 重新编译。
3. 启动:
![]()
![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 19
| domain="example.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]()