树莓派 | Docker上运行 OpenWrt 做旁路由
一说到软路由,大家都会想到大名鼎鼎的 OpenWrt,不过一般大家通常都是将固件直接刷写为系统直接运行在各类盒子上。之前在树莓派 3 上用了一段时间发现 OpenWrt 对资源的消耗还是很低的,毕竟我的带宽只有 100M,而且树莓派的硬件性能相比传统的路由器还是高了很多。如果让 OpenWrt 运行在 dokcer 里将其与底层 linux 系统解耦,不仅可以利用树莓派的剩余性能去做一些其他的事情,对于 OpenWrt 的备份及迁移来说也更方便。本来很早就想把 pi3 上的 OpenWrt 迁移到 Docker 里去了,无奈只有一个树莓派,虽然是做的旁路网关,但也是挂在主路由器上的,所有的设备上网都会经过,如果迁移又需要要重新刷写 Linux 系统固件,会导致一小段时间的断网,而且上面还有 plex、aria2 的 Docker 在运行,折腾起来又是小半天没了。所以就搁置了一段时间,刚好最近新入手了一块树莓派 4 的板子,就折腾折腾。
直接刷写 OpenWrt 固件到 SD 卡作为树莓派系统的方法比较简单,而且相关教程也很多就不写了。本文主要是介绍基于 Docker 运行 OpenWrt。请先阅读完文章,再进行相关操作。
网络方案
开始之前请仔细阅读这一部分。
先来说一下网络情况,我的主路由是一台斐讯 k2p 博通版(也就是金色版),只能刷官改系统。当然使用官改系统也是能进行上网魔法加持的,但是受限于 k2p 的性能,带宽根本跑不满。故采取了树莓派做旁路网关的方法,这种方法最简单,只需要一根网线把树莓派接入到路由器上即可,对于现有网络侵入性低,而且配置简单、即插即用,甚至可以把树莓派作为便携式魔法上网盒子。简单来说就是把终端的上网流量引流到树莓派上进行魔法加持然后再返回给路由器,那么怎么引流呢?有两种办法:
- 需要你的路由器上可以配置 DHCP,把 DHCP 分发的网关地址更改为 OpenWrt 的地址。注意:因为是 Docker 运行的 OpenWrt 所以不是树莓派的地址
- 如果路由器不能自定义配置DHCP(很多都不能),那就需要使用 OpenWrt 来做 DHCP 服务器。只需要关闭路由器上的 DHCP服务即可(基本所有路由器都可以,如果不行说明该换路由器了)
如果你的路由器可以自定义 DHCP 分发的网关地址,那么建议使用第一种方式,就算是树莓派坏了,那么你也还是可以通过 DHCP 连接上路由器做配置。
旁路网关的方法既能弥补路由器的性能短板,同时也解决了树莓派板载无线垃圾的问题。路由器负责无线接入,树莓派负责流量处理,效率更高。
下面我们将在树莓派 4 上使用 Docker 运行自己编译的 OpenWrt 19.07 固件。并对 OpenWrt 的部分常用功能进行测试,让你的树莓派不再吃灰。
前期准备
固件介绍与下载
此次教程使用的镜像基于 project-OpenWrt 18.06 固件制作镜像,编译方法及模板来自 SuLingGG
https://github.com/SuLingGG/OpenWrt-Rpi 使用 Github Actions 编译固件,在此感谢! 基于官方 OpenWrt 19.07 编译的固件在插件兼容性上还有很多问题,极不稳定。如果是要稳定使用建议使用 Lean 或者 project-OpenWrt 18.06 固件,后面提供的下载链接里都可以下载到。想尝鲜的也可以使用 OpenWrt 19.07 固件。
项目 Github 地址:scenerycm/OpenWrt-Raspi
OpenWrt 下载地址如下:
- Github Actions : https://github.com/scenerycm/OpenWrt-Raspi/actions
- OneDrive : https://1drv.ms/u/s!Av7u9RDznxkxhoUTe2dFTkuDLPaGZw?e=5NkKo7
宿主机系统
本文提供的方法只在树莓派 3B+/4B 测试过,其他设备请自行探索,原理基本一致。
树莓派上可选择的系统有很多,如官方的 Raspbian、Ubuntu、Debain 等,为了尽量减少不必要的操作,我使用的是由树莓派爱好者基地
编译的 Debian-Pi-Aarch64
树莓派 64 位系统,后面的所有操作都将基于此系统。详细介绍及下载:https://github.com/openfans-community-offical/Debian-Pi-Aarch64/blob/master/README_zh.md
如果你选择其它系统也是没问题的,只要安装好 Docker 即可,教程百度一大堆,就不详细展开了。
推荐下载无桌面增强版 2019-12-30-OPENFANS-Debian-Buster-Aarch64-ext4-v2019-2.0-U2-Release-plus++.img.xz
将镜像烧录到 SD 卡上,并加点开机后,用网线将树莓派与路由器的 lan 口相连,在路由器上查看树莓派的 IP 地址,通过 ssh 登录树莓派。默认账户:pi
,默认密码:raspberry
登陆以后执行 sudo passwd root
,修改 root
用户密码。执行 passwd
修改默认用户 pi
密码。
开启 root 用户远程登录
因为是在内网所以开启远程登陆问题不大,执行 sudo vim /etc/ssh/sshd_config
修改 Authentication
配置如下:
开启 sftp 方便通过 ssh 客户端传输文件
同样修改 /etc/ssh/sshd_config
文件如下:
修改完之后保存 /etc/ssh/sshd_config
文件,执行 sudo systemctl restart sshd
,然后新开一个窗口测试一下使用 root 用户 ssh 登录树莓派。
如果想给树莓派配置静态地址可以修改 /etc/network/interfaces
文件,具体地址按需修改,此项可以不做,示例如下:
至此,系统方面的基础准备已经完成,下面马上开始在 Docker 中运行 OpenWrt。
注:后续所有操作都是使用 root 用户进行。
Docker 网络配置
打开网卡混杂模式
创建 macvlan 网络
在 Docker 中,macvlan 是众多 Docker 网络模型中的一种,并且是一种跨主机的网络模型,作为一种驱动(driver)启用(-d 参数指定),Docker macvlan 只支持 bridge 模式。相同的 macvlan 之间可以互相通信,不同的 macvlan 网络之间在二层上不能通信,需要借助三层的路由器才能完成通信。做这一步就是让 Docker 中的 OpenWrt 容器和路由器等其他终端设备处在同一个二层网络中。
命令解释如下:
-d
指定 Docker 网络 driver--subnet
指定 macvlan 网络所在的网络--gateway
指定网关-o parent
指定用来分配 macvlan 网络的物理网卡
很重要 命令中的 --subnet
和 --gateway
参数需要根据自己的网络环境修改,切记不要照抄。其中 --gateway
就是你的路由器地址,--subnet
是你路由器地址所在的网段。
创建完成后可以使用 docker network ls
查看当前主机的网络环境,其中出现了 macvlan
网络 macnet
:
创建并启动容器
首先下载编译好的官方固件,提供 Github 和 OneDrive 两种下载方式,Github 如果比加慢可以使用 OneDrive。由于 OneDrive 容量 有限只提供基于官方源码编译的固件。制作 Docker 镜像需要使用 rootfs
固件别下错了。
稳定使用建议下载 Lean 版固件。
下载好固件之后解压,得到文件 openwrt-bcm27xx-bcm2711-rpi-4-rootfs.tar.gz
,通过 sftp
将固件上传至树莓派。
推荐使用 ssh 客户端 MobaXterm 功能强大方便
将固件导入 Docker 镜像
执行命令导入,稍做休息
查看镜像 docker image ls
,可以看到镜像已经导入成功
启动 OpenWrt 容器
首先创建容器,命令如下
-v
参数用于挂载宿主机目录到 Docker 容器中,由于未知原因,每次重启 OpenWrt 容器都会导致其 DNS 服务器被修改为 127.0.0.11
,导致域名解析失败不能上网,所以使用挂载宿主机 DNS 服务器文件 /etc/resolv.conf
的方式解决此问题。
因为 OpenWrt 中有 smba 文件共享服务功能,所以使用 -v /mnt/sda1:/home/harddisk/
挂载 /mnt/sda1
作为媒体目录。如果不需要也可以不挂载此目录。
创建完成后使用 docker ps -a
查看容器创建情况
启动容器 docker start openwrt
修改 OpenWrt 容器相关配置
进入容器内部
修改容器网络配置
请根据自己的网络情况进行修改,不要照抄,修改后的完整配置如下
重启容器内部网络服务
这里需要提到的一点是,如果你需要同时使用多个 OpenWrt 容器,那么一定要修改 mac 地址,因为 OpenWrt 的固件 mac 地址都是一样的,不修改 mac 地址会出现冲突导致网络不稳定。
修改 lan 的 mac 地址 vi /etc/config/network
修改 eth0 mac 地址 vi /etc/rc.local
,之后重启 OpenWrt 容器 docker restart openwrt
至此 OpenWrt 容器的安装及配置部分我们就已经完成了。接下来就是登录 OpenWrt 的 web 页面操作了。
OpenWrt 上网配置
在浏览器输入之前在 OpenWrt 容器里配置的地址 192.168.2.240
,即可打开 OpenWrt 控制面板登陆页。默认密码:password
状态页面
第一次配置的时候可能会出现访问有卡住的现象,需要重启一下 OpenWrt 容器,ssh 登录树莓派执行 docker restart openwrt
重启过程中 ssh 可能会断开,属于正常现象,重连即可。
在 网络--接口
关闭接口的 DHCP 服务
配置 DNS 转发服务器
配置好 DNS 后在网络诊断部分进行网络测试,使用域名 baidu.com
。
如果此处网络不通,请登录树莓派检查 DNS 配置文件 /etc/resolv.conf
,将 nameserver 设置为 OpenWrt 的地址 。
至此上网的部分就基本设置好了,需要魔法加持的,可以先配置好酸酸乳 plus 或者 passwall,再进行下面的测试。
网络及功能测试
然后将电脑的自动获取地址改为手动设置,指定网关为 OpenWrt 的地址 192.168.2.240
进行测试。
通过 CMD 查看网关是否配置正确
Spedtest 网络测试
- 第一种上网方式,因为我是连的WIFI所以带宽基本上是跑满了。
- 第二种上网方式,速度也很不错,基本跑满服务器的带宽。
相关功能截图
使用的皮肤是 Argon
注意事项
- 如果要同时使用多个 OpenWrt 容器,一定要修改容器的 mac 地址,否则会上不了网。
- 固件中的功能插件不保证可用,建议使用 Lean 版固件,最稳定。
- 如果要使用 project 版 OpenWrt 固件,可以跳过固件下载与导入步骤直接从dockerhub 拉取镜像,这个镜像经过本人测试在树莓派4和3上都可以使用,而且比较稳定,基本上所有的功能插件都可以使用。
镜像地址:
https://hub.docker.com/repository/docker/scenerycm/openwrt
拉取方式:
docker pull scenerycm/openwrt:19.07
参考
- 在Docker 中运行 OpenWrt 旁路网关 https://mlapp.cn/376.html