您的位置:首页 > 其它

树莓派通过ngrok实现内网穿透

2017-09-16 21:38 246 查看
最近在折腾树莓派,想要实现远程对寝室内的监控和对部件的控制,即通过外网访问本地树莓派。自然而然想到使用内网穿透,百度了一下有花生壳和NATAPP之类的服务提供商。不过这种事情还是自己折腾有意思,而且手头也有一个没用的域名和两台VPS,就决定自己来做了。

一.内网穿透的简介

简单说就是内网中的一台计算机具有自己的内部IP,外网的计算机具有公共的IP,而内部IP是无法直接通过外网来访问的,这就需要一种方式来将外网的IP转化为内部的合法IP来进行合法访问。

二.ngrok

ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。(来自百度百科)总之就是一个很厉害的东西,使用方便。

三.具体实现:

1.准备好域名和具有公网IP的VPS,之前租过一台bandwagon的VPS,就用它了。

使用的系统是Centos 6。

2.VPS安装go语言

下载tar包:

wget  https://storage.googleapis.com/golang/go1.9.linux-386.tar.gz[/code] 
tar zxvf go1.9.linux-386.tar.gz -C /usr/local

环境变量配置:

vi /etc/profile


文件的最后加入:

export GOROOT=/usr/local/go
export GOBIN=/home/N/ngrok
export PATH=$GOROOT/bin:$PATH


编译文件:

source /etc/profile


查看go语言状态:

go env


3.树莓派安装go语言:

go语言官方二进制包

下载go1.9.linux-armv6l.tar.gz再用ftp传入树莓派

解压

tar -C /usr/local -xzf go1.9.linux-armv6l.tar.gz


配置环境变量,偷懒直接和VPS下配置相同,编译文件。

4.安装ngrok

由于安装有linux的移动硬盘被我格式化了,所以想试试在树莓派上编译好客户端和服务器端。

在树莓派上执行:

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


然后在ngrok下执行:

$ openssl genrsa -out rootCA.key 2048
$ openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=xxx.com" -days 5000 -out rootCA.pem
$ openssl genrsa -out device.key 2048
$ openssl req -new -key device.key -subj "/CN=xxx.com" -out device.csr
$ openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000


这个xxx.com替换为自己的根域名。

我在这里执行到最后一个命令的时候报错了,发现是第一个命令中-out 后的文件名多打了个’-‘号,怪不得。。

接下来:

cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key


到这里证书就完成了。

编译服务器端:

export GOOS=linux
export GOARCH=386
make release-server


编译需要等待一段时间,完成后文件位于 ngrok/bin/linux_386/ngrokd

然后编译客户端:

export GOOS=linux
export GOARCH=arm
make release-client


完成后文件位于ngrok/bin/ngrok

将编译后的ngrokd放到VPS的$GOROOT/bin下,然后使用命令

nohup ngrokd -domain="xxx" -httpAddr=":aaaa" -httpsAddr=":bbbb" -log ./ngrokd.log &


如果出现permission denied的问题使用chmod+x增加权限

nohup … &表示SSH断开后服务仍然运行

aaaa和bbbb两个端口号自己选择

设置树莓派:

将ngrok复制到$GOROOT/bin下,并创建一个ngrok.cfg文件

vim ngrok.cfg


写入以下内容

server_addr: xxxx:4443
trust_host_root_certs: false


xxx是前面使用的域名, 在树莓派上使用如下命令:

ngrok -log /usr/local/go/bin/ngrok.log -subdomain yyyy -config /usr/local/go/bin/ngrok.cfg 80


这个yyyy自己决定,最后就可以通过浏览器地址栏yyyy.xxxx:port 这样的形式访问树莓派的HTTP服务了。但是自己使用后还是没有办法通过外网来访问,后来给域名增加了一条CNAME,过一段时间就可以正常访问了。

成功后树莓派显示如下图:



后面需要再次更改cfg文件时一定要注意空格,不然会报错,自己粗心少了空格,一直出错。之后再添加一下自动启动就可以了。下一步打算远程通过flask来控制树莓派的GPIO,做一些应用。

参考:

http://www.vuln.cn/8634

LeeHDsniper的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: