使用树莓派让外网设备拥有内网环境
使用场景
手里有个项目是需要在内网环境进行开发的,但是我们开发人员平时都是在外网环境连接不上内网,每次部署调试的时候都得跑到内网环境中部署,非常不方便
一、整体思路
- 如何让树莓派同时拥有外网与内网网络
- 如何让外网与树莓派相通
- 如何将内网环境代理出去
- 如何制定容灾机制
二、树莓派同时拥有外网与内网网络
1)环境准备:
- 树莓派系统:ubuntu mate 18.04
- 树莓派型号:3b+
- 树莓派联网:以太网口连接内网,wifi连接外网
2)网络设置:
- 以太网与wifi同时上网
单击 桌面右上角的网络图标
选择 编辑连接
双击 以太网Wired Connection
选择 ipv4设置
点击 路由
勾选仅将此连接用于相对应的网络上的资源
重启机器。 - 设置wifi系统启动自动连接
单击 桌面右上角的网络图标
选择 编辑连接
双击 WIFIxxx
网络配置界面有一个connect automatically
勾上
重启机器 - 为以太网添加网关路由(设置仅将此连接用于相对应的网络上的资源后,该网卡的网关就设没有了,需要手动添加),
eth0
代表以太网的网卡,192.168.8.254
为以太网的网关,192.168.8.0/24
代表是访问192.168.8.x
的内网ip是会走192.168.8.254
这个网关
route add -net 192.168.8.0/24 gw 192.168.8.254 dev eth0
三、外网与树莓派相通:使用ngrok内网穿透
我们是将内网设备穿透出去,为了安全考虑,最好是自己搭建ngrok服务,如果没条件的也可以使用其他人搭建的ngrok服务
1)环境准备:
- 云服务器:各大云的ubuntu 18.04 64位服务器(例如:192.168.8.1)
- 安全组:放开4443、80、43端口,51000-52000端口(51000-52000端口用作穿透的tcp端口使用)
- 域名:购买个域名,有需要备案的可以进行备案(例如:linker.ren)
- 域名解析:解析 ngrok.linker.ren 到 192.168.8.1,和解析 *.ngrok.linker.ren 到 192.168.8.1
2)安装搭建
1.安装git
sudo apt-get install git
2.安装golang
sudo wget https://studygolang.com/dl/golang/go1.15.linux-amd64.tar.gz
解压到/usr/bin
目录中
sudo tar zxf go1.15.linux-amd64.tar.gz -C /usr/bin
添加环境变量
echo "export PATH=/usr/bin/go/bin:$PATH" >> /etc/profile
source /etc/profile
3.安装部署ngrok
配置ngrok的domain
export NGROK_DOMAIN="ngrok.linker.ren"
克隆ngrok
cd /usr/local
git clone https://github.com/tutumcloud/ngrok.git ngrok
进入/usr/local/ngrok
目录
cd ngrok
安装证书
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
替换旧证书,请确保证书被替换成功,如果替换不成功可以删除原有证书再复制
cp -rf rootCA.pem assets/client/tls/ngrokroot.crt
cp -rf device.crt assets/server/tls/snakeoil.crt
cp -rf device.key assets/server/tls/snakeoil.key
编译安装ngrok服务端
GOOS=linux GOARCH=amd64 make release-server
编译完成后,nohup后台运行服务端
nohup ./bin/ngrokd -domain="ngrok.linker.ren" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" &
编译客户端
# arm平台客户端,运行在树莓派
GOOS=linux GOARCH=arm make release-client
# 生成的可执行文件为:bin/linux_arm/ngrok
# Linux平台32和64位系统客户端
GOOS=linux GOARCH=386 make release-client
GOOS=linux GOARCH=amd64 make release-client
# 生成的可执行文件分别为:bin/linux_386/ngrok
# bin/ngrok
# Windows平台32和64位系统客户端
GOOS=windows GOARCH=386 make release-client
GOOS=windows GOARCH=amd64 make release-client
# 生成的可执行文件分别为:bin/windows_386/ngrok.exe
# bin/windows_amd64/ngrok.exe
# MacOs平台客户端
GOOS=darwin GOARCH=amd64 make release-client
# 生成的可执行文件为:bin/darwin_amd64/ngrok
客户端配置模板(ngrok.conf)
server_addr: "ngrok.linker.ren:4443"
trust_host_root_certs: false
tunnels:
httptun:
remote_port: 80
subdomain: xxx
proto:
http: 127.0.0.1:80
httpstun:
remote_port: 443
subdomain: xxx
proto:
https: 127.0.0.1:443
tcptun:
remote_port: 51000
proto:
tcp: 127.0.0.1:22
客户端启动命令
./ngrok -config=ngrok.conf start-all
四、如何将内网环境代理出去(ss/ssr服务代理)
1)安装部署ss/ssr
下载自动部署脚本
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && chmod +x ssr.sh && bash ssr.sh
执行自动部署ssr脚本
bash ssr.sh
之后的步骤
- 输入数字1选择安装ssr
- 设置ssr服务端口:2333
- 设置密码:xxxx
- 设置加密方式:ase-256-cfb
- 设置协议插件:auth_sha1_v4
- 设置协议插件兼容原版:y
- 设置混淆插件:plain
- 然后设备数限制、单线程限速、端口总限速都按回车选择默认
- 遇到Total download size:63M,Is this ok 选择y
- 之后开始自动部署
2)将ss/ssr穿透到外网
树莓派运行ngrok客户端,客户端配置加入ss/ssr的服务端口2333,穿透出的端口为51001,
则外网对应的ssr链接为:ngrok.linker.ren:51001
修改客户端配置(ngrok.conf)
server_addr: "ngrok.linker.ren:4443"
trust_host_root_certs: false
tunnels:
httptun:
remote_port: 80
subdomain: xxx
proto:
http: 127.0.0.1:80
httpstun:
remote_port: 443
subdomain: xxx
proto:
https: 127.0.0.1:443
tcptun:
remote_port: 51000
proto:
tcp: 127.0.0.1:22
tcptun2:
remote_port: 51001
proto:
tcp: 127.0.0.1:2333
五、容灾机制
1)定时任务
为ngrok客户端编写了个启动脚本,使用crontab -e
定时5分钟执行一次,保证ngrok服务运行正常
*/5 * * * * /usr/local/ngrok/start.sh
2)脚本原理:
先访问当前启动的ngrok客户端的端口是否可以访问,如果可以访问则不做处理,如果访问失败,则先kill掉ngrok进程,然后再执行一遍启动命令
3)ngrok的启动脚本:start.sh
#!/bin/sh
SERVER=ngrok.linker.ren
PORT=51000
`nc -z -v -w5 $SERVER $PORT`
result1=$?
if [ "$result1" != 0 ]; then
#先杀进程
PROCESS=`ps -ef|grep ngrok|grep -v grep|grep -v PPID|awk '{ print $2}'`
for i in $PROCESS
do
if ["$i" !=0 ]; then
echo "Kill the ngrok process [ $i ]"
kill -9 $i
else
echo '一个不删'
fi
done
path=/usr/local/ngrok
nohup $path/ngrok -config=$path/ngrok.conf start-all &
echo "RESTART Ngrok"
else
echo 'Ngrok is live'
fi