[Docker]使用Docker为树莓派做内网穿透

最近买了一个树莓派 Model 3B放在了办公室的桌子上,让它平时替我跑一些脚本,好不惬意。但是当下班回家后就与它失去了联系,比较苦恼,为树莓派做内网穿透的想法应运而生。

内网穿透 ssh

使用到的开源项目或工具有:

  • Docker
  • ngrok 1.7
  • openssl
  • (非必需)国内Docker云服务提供商 + 备案的域名

编译 ngrok server 和 client

我的编译机器是 VPS Ubuntu 16.06
首先安装必要的工具:

sudo apt-get install build-essential golang mercurial git

clone 源码,签发自己域名的证书用于建立可信的连接。

git clone https://github.com/tutumcloud/ngrok.git ngrokcd ngrok
cd ngrok
NGROK_DOMAIN="sample_domain.com" //替换成你自己的域名
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.csropenssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt
cp base.pem assets/client/tls/ngrokroot.crt

开始编译:

sudo make release-server release-client
//编译运行于macOS的可以使用如下命令
sudo GOOS=darwin GOARCH=amd64 make release-server release-client
//编译运行于树莓派的可以使用如下命令
sudo GOOS=linux GOARCH=arm make release-server release-client

编译完成后可以发现 bin目录出现一个 ngrokd的二进制可执行文件,说明编译是成功的。

连接 ngrok server 和 ngrok client

我在VPS上,使用如下命令开启了一个 ngrok server, 可以通过 8081 和 8082 端口访问转发到 ngrok client, 只差客户端来连接了。

sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="sample_domain.com" -httpAddr=":8081" -httpsAddr=":8082"  

在树莓派上,建立一个简单的配置文件 ngrok.cfg:

server_addr: sample_domain.com:4443
trust_host_root_certs: false

运行命令:

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

不出意外,可以看到终端会输出 Tunnel Status onlie的字样,然后我们通过 pi.sample_domain.com:8081访问的请求就会转发到树莓派的 80端口上。

去掉该死的 :8081,我只想通过域名就能访问

ngrok server 在不指定 httpAddr的情况下会使用 80端口

Docker镜像制作

ngrok和 nginx都在抢 80端口该怎么办??显然 nginx更重要,所以我打算用 Docker欺骗 ngrok,让它误以为自己绑定到了机器的 80端口。
工程目录结构如下:

.├── Dockerfile
 ├── ngrok
 └── run.sh

Dockerfile 如下:

FROM hub.c.163.com/public/ubuntu:16.04
MAINTAINER summerbabybiu admin@stephenw.cc
ENV NGROK /opt/ngrok
ENV DOMAIN sample_domain.com //替换你自己的域名
EXPOSE 80 443 4443 59900
COPY ngrok/bin/ngrokd $NGROK/
COPY ngrok/server.crt $NGROK/ssl.crt
COPY ngrok/server.key $NGROK/ssl.key
COPY ngrok/server.csr $NGROK/ssl.csr
COPY run.sh $NGROK/
RUN chmod +x $NGROK/run.sh
CMD .$NGROK/run.sh

其中 run.sh 内容如下:

#!/bin/sh
/opt/ngrok/ngrokd -tlsCrt /opt/ngrok/ssl.crt -tlsKey /opt/ngrok/ssl.key -domain "sample_domain.com"

然后在工程目录下执行:

//$REPO_NAME 你的 repo名称
//$TAG 你的镜像 tag
docker build -t $REPO_NAME:$TAG .

不出意外地,镜像 build成功,然后我把它 push 到了 Docker Hub。在 VPS上,把镜像 pull下来,执行命令:

docker run -d -p 127.0.0.1:8080:80 -p 127.0.0.1:8081:443 -p 4443:4443 -p 59900:59900 $REPO_NAME:$TAG

此时再次尝试树莓派连接,然后 VPS配置一下 pi.sample_domain.com proxy_pass 到 127.0.0.1:8080, 你就会发现可以不带端口访问到树莓派了!

树莓派的 ngrok client 自动启动与 ssh 穿透

ssh 穿透和 http 原理差不多,不过它不需要分配子域名,只需要简单的端口建立 tcp连接。编写一个 ngrok client的配置文件:

server_addr: sample_domain.com:4443
trust_host_root_certs: false
tunnels: 
  http:
     proto: 
       http: 80
     subdomain: pi 
  ssh: 
    proto: 
       tcp: 22 
  remote_port: 59900

然后再次通过命令启动:

ngrok client 二进制被我放在了 /opt/ngrok下,配置文件被我放在了 /opt/config下

/opt/ngrok/bin/linux_arm/ngrok -config=/opt/config/ngrok.cfg start http ssh

这样启动后,可以通过 59900端口 ssh到树莓派上。
还不够,目前的 ngrok client启动处于阻塞态,一旦 tty失去连接就会断开。为此我配置了一个 systemd service:

/etc/systemd/system/ngrok.service

[Unit]
Description=ngrok
After=network.target
[Service]
Type=simple
ExecStart=/opt/ngrok/bin/linux_arm/ngrok -config=/opt/config/ngrok.cfg start http ssh
[Install]
WantedBy=multc-user.target

然后通过 systemctl enable ngrok.service来使其开机自启,service ngrok start来使其自动启动。

优化 ngrok server的连接速度

我的 VPS地理位置处于日本,我在家时访问树莓派会比较慢(150ms左右),但是单独为一个树莓派开一台国内的虚机很不划算(月花费65元左右),于是我想到可以托管在 Docker云服务商那边。具体做法很简单,在 Docker云服务商提供的控制台运行刚才 build好的镜像,然后绑定你的域名(需要备案),根据 docker容器运行实际提供出来的端口对 client端的配置文件端口稍作修改就可以建立连接了。实测连接速度在 30ms左右,并且费用降到了 10-15元每月左右。
这只是 流量密集型的操作,所以实际上非常低的云服务配置也能提供非常多稳定的连接,性价比非常高。

手机SSH到远程服务器可以安装 Serverauditor这一款免费的 App,亲测实用。

- EOF-

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 最近几天,因为质子的大力助攻,写起代码来帅的不行,我已经成为质砸迷妹> < 我要好好做人,爱智求真。真心的。 全班...
    燃音Chelsea阅读 399评论 0 0
  • 经过商场你会看到有很多打折的衣服,路过广场你会看到不少面容惨淡的人。这本是两种不同性质的事物却有着共同点:被打过折...
    16aa5fab5f62阅读 398评论 0 0
  • 这部以「丧」而在中国大火的美剧《马男波杰克》,第四季终于回归了! 可能你没看过它,但你一定见过出自此剧的金句截图。...
    假装大导演阅读 279评论 0 1
  • 阴天的懒觉 阴暗的一本《悬崖山庄奇案》 玩不坏的替身反转梗,阿婆套路深啊 马普尔小姐《谋杀启事》来一回,波洛大侦探...
    披着马甲写日记阅读 175评论 0 0