树莓派里直刷 OpenWrt 当旁路网关用时,资源使用率长期不到 5% 比较浪费,OpenWrt 也不太能胜任通用 Linux 的功能,通过 Docker 的方式运行 OpenWrt 可以完美解决这个问题,树莓派依然可以保留通用 Linux 能力。
Docker Image:sulinggg/openwrt
详细说明:https://mlapp.cn/376.html
我是在 4B + Manjaro 上跑的,其它发行版应该差别不大。
1. 网卡混杂
混杂模式是指一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它。
一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。
当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。
以 Docker 方式运行 OpenWrt 时,树莓派网卡不仅要接收它自己的数据,还要接收流向 OpenWrt 的数据,因此需要打开网卡混杂模式。
Manajro 下临时打开:sudo ip link set eth0 promisc on
,这种方式重启后失效。
永久打开:Promiscuous mode,添加文件 /etc/systemd/system/promiscuous@.service,增加以下内容。
1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=Set %i interface in promiscuous mode
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/ip link set dev %i promisc on
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
通过命令 systemctl enable promiscuous@eth0.service
开启。(不同网卡请修改 eth0)
2. 安装 Docker
Manjaro 下安装软件太简单。
1
2
3
4
5
6
7
8
9
10
11
12
# 安装
$ sudo pacman -S docker
# 开机启动
$ systemctl enable docker.service
# 启动
$ systemctl start docker.service
# 添加用户到 docker 组,username 改成自己,需要注销或者重启下生效
$ sudo usermod -aG docker [username]
# 测试 hello world
$ docker run hello-world
Hello from Docker!
...
3. 创建 Docker 网络
1
2
3
4
# 创建
$ docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 macnet
# 查看
$ docker network ls
192.168.0.x 取决于树莓派所在子网,要与树莓派在同一子网。
eth0 是网卡;macnet 是创建的网络名,可自取。
4. 启动 Docker 容器
先拉取镜像,不同型号 tag 不一样,4B 是 rpi4
1
2
3
4
# 拉取
$ docker pull registry.cn-shanghai.aliyuncs.com/suling/openwrt:rpi4
# 查看
$ docker images
启动容器:
1
2
3
4
# 启动
$ docker run --restart always --name openwrt -d --network macnet --privileged -v /home/panda/Shares:/mnt/Shares registry.cn-shanghai.aliyuncs.com/suling/openwrt:rpi4 /sbin/init
# 查看
$ docker ps -a
--restart always
表示容器退出时始终重启,使服务尽量保持始终可用;
--name openwrt
容器的名称;
-d
运行在 Daemon 模式;
--network macnet
容器加入 macnet
网络;
--privileged
运行在特权模式下;
-v /home/panda/Shares:/mnt/Shares
挂载 Manjaro 的目录到容器(可选);
registry.cn-shanghai.aliyuncs.com/suling/openwrt:rpi4
为 Docker 镜像名,因容器托管在阿里云 Docker 镜像仓库内,所以在镜像名中含有阿里云仓库信息;
/sbin/init
定义容器启动后执行的命令。
5. 配置 Docker 容器
进入容器:
1
2
# openwrt 是启动时定义的名称
$ docker exec -it openwrt bash
更改配置:
1
$ vim /etc/config/network
1
2
3
4
5
6
7
8
9
10
config interface 'lan'
option type 'bridge' // 删掉,不然国内网站打不开
option ifname 'eth0'
option proto 'static'
option netmask '255.255.255.0'
option ip6assign '60'
option ipaddr '192.168.0.100' // 修改为树莓派子网
option gateway '192.168.0.1' // 修改为树莓派子网
option broadcast '192.168.0.255' // 修改为树莓派子网
option dns '192.168.0.1' // 修改为树莓派子网
重启网络:
1
$ /etc/init.d/network restart
6. 登录
浏览器输入 http://192.168.0.100 进入控制面板。
用户名/密码:root/password。
Samba 共享如果需要加密,模板中注释掉 invalid users = root
,同时命令行中运行 smbpasswd -a root
为 root 用户添加访问密码。