树莓派不再吃灰 (二)   Docker中使用openwrt做旁路网关

树莓派不再吃灰 (二) Docker中使用openwrt做旁路网关

闲谈时光

openwrt

首先我们说一下openwrt,说白了你可以你理解为路由器系统的一种。

OpenWrt 是面向嵌入型设备的 Linux 发行版,所以 OpenWrt 系统运行时的资源占用率会很低。而树莓派的硬件性能要比普通路由器要高很多。虽然树莓派在硬件配置上的绝对优势能让 OpenWrt 有更大的施展空间,但相应的,硬件上的优势也带来了资源的浪费(OpenWrt 在树莓派上正常运行时,资源占用率只有不到 1/10)。再加上 OpenWrt 的可扩展性不是很强,所以很多能在 Raspbian/Debian 上能做的事情在 OpenWrt 上往往无法实现。

总不可能直接用树莓派只刷个openwrt就没了吧,那怕是有点奢侈了。那有什么方式呢?

没错就是Docker,这样就可以让linuxopenwrt 共存了。树莓派就不这么吃灰了。

旁路网关

那么什么又是旁路网关呢?其实他跟spring cloud 有那么几分相似之处。

普通路由器就像一开始的单机模式,什么都是它一台机器负责,比如信号转发、DNS、网关等,其中的“网关”角色负责路由器内部数据的处理。但因为一般家用的路由器硬件性能很有限,在运行一些比较吃资源的应用(如酸酸乳、去广告等)时,几乎会占满所有硬件资源,导致路由器网络/系统不稳定等诸多问题。这个时候我们把网关的这个角色划分出去单独的在树莓派上跑,是不是分担了主路由的压力,是不是有点微服务那个味道。这样子每个角色各司其职,树莓派也结束了它吃灰的命运了,更好的验证了那句 买前生产力,买后旁路由

注意:

  • 本文docker镜像只适用于树莓派 2B/3B/3B+/4B,在其他设备上理论上不能正常使用
  • 在 Docker 中运行 OpenWrt ,树莓派将工作在旁路网关模式下,在这种工作模式下,树莓派的板载无线网卡不会工作(同时在 OpenWrt 的控制面板中也找不到有关 WIFI 的设置)。所以,需要将树莓派与路由器通过网线连接来使用。

前期准备

Docker肯定是必不可少的,你也可以自己在树莓派上安装,莫度有很多教程,这里就不多说了,我这里用的不是树莓派官方的系统,

刷的是 树莓派爱好者基地 制作的树莓派的镜像,根据树莓派的特性专门做了优化,下面附上Github地址:

传送门

推荐刷入 无桌面增强版,这个版本是自带docker的,而且也有web管理界面,更加详细的都在Readme文档里面写着,自己研究把。默认用户:PI 默认密码:raspberry

插上网线,ssh登陆,等等!那又有一个疑惑,我怎么知道树莓派ip地址,这里有很多方式:

  • 接显示器,键盘,sudo ifconfig (麻烦)

  • 进入路由器后台查看(太麻烦)

  • IP Scanner 一款扫描局域网ip的工具 。传送门

当你连上树莓派之后,准备工作就完成了。

具体步骤

Step 1: 打开网卡混杂模式

sudo ip link set eth0 promisc on

Step 2 :创建docker网络**

注意了,这里需要结合自己的网络修改,不能照搬!! sudo ifconfig可以查看树莓派IP地址,不过刚刚不是都知道了嘛 [汗],多一种方式嘛

刚刚登陆ssh的ip地址 192.168.31.7 那么说明树莓派处在 192.168.31.x网段,那么下面的命令中的

--subnet=192.168.x.0/24--gateway=192.168.x.1将要替换成对应网段的地址。(此处的x请根据自己的网络进行修改)

替换后:

docker network create -d macvlan --subnet=192.168.31.0/24 --gateway=192.168.31.1 -o parent=eth0 macnet

这是我们 docker network ls就可以查看到刚刚创建的网络

pi@raspbian:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
e5988f578007        bridge              bridge              local
107c16227dd4        docker_gwbridge     bridge              local
3ceb60d85b9c        host                host                local
b1929166e45c        macnet              macvlan             local
93ad7ae8da72        none                null                local

这里我还特意去查了一下macvlan

macvlan 是一种虚拟网卡的解决方案:

  • macvlan并不创建网络,只创建虚拟网卡。
  • macvlan会共享物理网卡所链接的外部网络,实现的效果跟桥接模式是一样的。

想要了解更多等会文末会附上个参考链接。

Step 3 :拉取镜像。

docker pull harryzhang6/openwrt:latest

我们可以通过docker images 查看本地的镜像

pi@raspbian:~$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
harryzhang6/openwrt   latest              5c354d2e6f6f        3 hours ago         235MB

这里也就说明镜像拉取成功了。

Step 4 :创建并启动容器

docker run --restart always --name openwrt -d --network macnet --privileged harryzhang6/openwrt:latest /sbin/init
  • --restart always参数表示容器退出时始终重启,使服务尽量保持始终可用;
  • --name openwrt参数定义了容器的名称;
  • -d参数定义使容器运行在 Daemon 模式;
  • --network macnet参数定义将容器加入 maxnet网络;
  • --privileged参数定义容器运行在特权模式下;

我们docker ps 确认一下容器是否启动成功

pi@raspbian:~$ docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS               NAMES
755d018206fd        harryzhang6/openwrt:latest   "/sbin/init"        2 minutes ago       Up 2 minutes                            openwrt

确认启动成功,下一步就是进入容器配置了

Step 5 :进入容器并修改相关参数

注意:这一步的某些配置也跟上面一样,不能照搬

docker exec -it openwrt bash

执行此命令后我们便进入 OpenWrt 的命令行界面,首先,我们需要编辑 OpenWrt 的网络配置文件:

vim /etc/config/network

我们需要更改 Lan 口设置:

config interface 'lan'
        option type 'bridge'
        option ifname 'eth0'
        option proto 'static' 
        option ipaddr '192.168.31.100' //需要更改处
        option netmask '255.255.255.0'
        option ip6assign '60'
        option gateway '192.168.31.1' //需要更改处
        option broadcast '192.168.123.255'
        option dns '192.168.31.1' //需要更改处

这里是我配置好的,需要自行更改。option gatewayoption dns填写路由器的 IP,若树莓派获得的 IP 为 192.168.31.154,路由器 IP 为192.168.31.1.

option ipaddr项目定义了 OpenWrt 的 IP 地址,在完成网段设置后,IP最后一段可根据自己的爱好修改(前提是符合规则且不和现有已分配 IP 冲突)。

Step 6 :重启网络

/etc/init.d/network restart

Step 7 : 进入openwrt 管理页面

在浏览器输入刚刚Step 5 中定义的 option ipaddr,我这里是192.168.31.1,就可以看到后台的管理界面

openwrt1

用户名:root

密码:password

Step 8 :关闭DHCP服务

在 “网络 - 接口 - Lan - 修改” 界面中,勾选下方的 “忽略此接口(不在此接口提供 DHCP 服务)”,并“保存&应用

openwrt2

Step 9: 主路由 DHCP 设置

这里不非必要的,

进入路由器后台中,将主路由的 DHCP 的默认网关和 DNS 服务器设置为第 5 步中option ipaddr项目中的 IP。

由于不想每台设备都通过这个opwrt,只有自己设置的设备才走openwrt这个网关。

如果你修改了主路由DHCP 请重启路由器。

到这里也差不多了教程,下面附上手动指定网关的教程

手动指定网关

如果路由器固件不支持自定义 DHCP 服务的网关及 DNS 地址(常见于路由器官方固件),或者只希望局域网下的个别设备接入旁路网关时,须在接入设备上做以下配置:

windows:

openwrt3

在无线热点的“属性”界面下,点击 “IP 设置 - 编辑”按钮,在弹出框中更改 IP 分配模式为“手动”,打开 IPV4 的开关,根据所处网段及上文安卓的相关设置填写相关参数即可。

安卓

openwrt4

需要在安卓的 WIFI 设置内将 IP 获取方式更改为“静态”或“手动”,其中:

ip地址跟上面一样,同网段不重复就行,前缀长度:24 两个DNS填写旁路网关ip地址。

openwrt 截图

有几个主题,但这个比较好看。

openwrt5

看看这个内存占用,还能干

openwrt6

openwrt7

openwrt8

openwrt9

openwrt10

END

最后说一下,这个openwrt 镜像是没有AP功能的,没有WIFI设置这个选项,但大多数功能可以使用。

openWrt 容器跟随树莓派系统启动,无需手动干预;

树莓派终于不在吃灰了!!!!

参考链接