自搭Ngrok实现树莓派内网穿透

144
作者 popy32
2016.09.10 17:02 字数 1390

我的博客部分文章讲同步至简书。

如果把花生壳类比为使用别人搭好的ss服务,那么自建Ngrok就是使用自己的ss服务,可见自搭Ngrok的优势不言而喻,流量费用十分经济,速度,稳定性和安全性将远远胜过花生壳。

现在花生壳是一种比较流行的穿透内网的方式,不过其稳定性随着使用人数的增多而大打折扣,内网穿透的价格也不便宜,一套花生棒就是动轭上百,而且流量还要单独买,如果遭遇流量攻击套餐基本就泡汤了。

Ngrok编译部署条件:

  • 域名 (.top域名4元首年)

  • 拥有独立IP的VPS或云主机 (标准配置低于50一年)

编译Ngrok客户端时会使用openssl生成证书来加密通讯,保证了安全性,使用时必须和签署证书时的域名吻合。

一个拥有独立IP的VPS或云主机,地区的话推荐选择 香港国外的,配置可以参考 搭建ss服务的标准,其对 延迟带宽速度的要求高于内存和CPU。(这里我用的只是openvzcc年付35元的vps,当然这个配置还不是最低价的)

使用国内云主机的话第一个是要考虑域名备案,因为一般反向代理网页时使用了服务器的80端口。第二个是国内符合配置条件的vps比较少,因为没人直接拿国内的服务器番茄,市场的需求催生了国外VPS低内存高带宽而且非常优惠的配置。

编译环境:腾讯云上海节点CentOS 6.7

部署环境:阿里云青岛节点CentOS 6.7+OpenVZCC洛杉矶节点CentOS 6

也可以选择在本地编译好客户端然后部署在服务器上

编译Ngrok

配置科学上网环境(香港或国外主机可省略此步骤)

由于编译过程中会导入包的网址,而这些网址基本都被墙了。

方法不用多说了,这里我图方便采取修改hosts的方法(有点low),最新的hosts文件可以在老D博客获取。

vim /etc/hosts

安装Go语言环境

安装必要包

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++ build-essential  mercurial

由于Go官方地址也被墙了,这里使用国内镜像下载源码。

wget http://www.golangtc.com/static/go/1.7rc6/go1.7rc6.linux-386.tar.gz

tar -zxvf go1.7.6.linux-386.tar.gz

mv go /usr/local/

ln -s /usr/local/go/bin/* /usr/bin/

安装成功后查看可Go编译环境

go env

goenv

升级Git版本

Go编译过程中要求高版本的git,而yum源里面默认只有1.7.1版本。

wget https://www.kernel.org/pub/software/scm/git/git-2.9.3.tar.gz

tar zxvf git-2.9.3.tar.gz

cd git-2.9.3

./configure --prefix=/usr/local/git-2.9.3

make

make install

取代yum安装的低版本git

yum remove git*

ln -s /usr/local/git-2.9.3/bin/* /usr/bin/

检查git版本是否为2.9.3

git --version

Ngrok源码配置

声明编译的路径和必要的域名(域名改成你自己的)

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

export GOPATH=~/ngrok/

export NGROK_DOMAIN="ngrok.sfantree.com"

cd ~/ngrok

生成证书,Ngrok会使用此证书加密通讯

openssl genrsa -out base.key 2048

openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem

openssl genrsa -out server.key 2048

openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr

openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

将证书文件复制到指定位置

cp rootCA.pem assets/client/tls/ngrokroot.crt -i

cp server.crt assets/server/tls/snakeoil.crt -i

cp server.key assets/server/tls/snakeoil.key -i

编译服务器端与客户端

服务器端为linux-x86-64

export GOOS=linux

export GOARCH=386

make release-server

编译完成过后~/ngrok/bin/ngrokd即为服务端运行文件


compline

树莓派为linux-arm架构,重新声明go env里的变量

export GOOS=linux

export GOARCH=arm

make release-client

编译完成过后~/ngrok/bin/linux_arm/ngrok即为树莓派客户端运行文件

注:这里测试时只编译了i386的服务器端和arm的客户端,实际上可以通过改变GOOSGOARCH来获取各个平台的客户端与服务端,GOOS可以指定为windowslinuxfreebsddarwin (Mac OS X 10.5 or 10.6) 和 nacl (Chrome 的Native Client 接口) ,GOARCH可以指定为amd64 (64-bit x86) 、386 (32-bit x86) 、 和arm (32-bit ARM),可见Go语言的跨平台能力相当彪悍。

部署Ngrok

绑定域名

在编译配置时的域名ngrok.sfantree.com解析到服务器IP

注意:指定A记录时ngrok与*.ngrok都要填上,这样能方便地使用不同子域转发不同的本地服务。


dns

服务器端部署

将编译好的可执行文件移至/usr/bin/

cp ~/ngrok/bin/ngrokd /usr/bin/

为ngrokd单独开一个screen

yum install -y screen

screen -S ngrokd

`

运行ngrokd

sudo ngrokd -domain="ngrok.sfantree.com" -httpAddr=":80" -httpsAddr=":443"

servicerun

屏幕会输出一连串日志信息,ttpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,ngrokd 还会开一个 4443 端口用来跟客户端通讯,注意设置防火墙使端口开放。

客户端部署

~/ngrok/bin/linux_arm/ngrok移至树莓派下

新建配置文件

mkdir ~/ngrok/ && cd ~/ngrok/

touch ~/ngrok/ngrok.cfg

echo "server_addr: ngrok.sfantree.com:4443" >> ~/ngrok/ngrok.cfg

echo "trust_host_root_certs: false" >> ~/ngrok/ngrok.cfg

运行客户端

#指定子域名为pi,采用http协议和使用80端口

./ngrok -subdomain pi -proto=http -config=ngrok.cfg 80

看见Tunnel Status变为online说明成功连接服务器端


armrun

访问测试

浏览器地址栏输入pi.ngrok.sfantree.com


web

32M内存的VPS测试成功

关于树莓派的博客搭建可以参考我前面的文章

总结

从Ngrok强大的反向代理功能可以看出Go语言独特魅力,除了glibc的版本有一定要求,其跨平台编译为部署省去了不少时间,当然Go还有更多的优点,本文提到的也只是Ngrok的冰山一角,利用其TCP转发也可以远程SSH树莓派,更多玩法就自行百谷了。

原文地址:https://www.sfantree.com/ngrok-raspberry-cross-nat/

本站原创文章采用 “署名-非商业性使用-相同方式共享 3.0 中国大陆 ”创作共用协议。转载时请以链接形式标明本文地址。

博客同步