最近想给家里的网络部署上 OpenWrt ,看了一些可以刷机的路由器,感觉路由器刷机折腾起来 RAM 和 ROM 似乎都太小可玩性不太高,说来也巧,在闲鱼刷着刷着还真看到一个很邪门的东西
这是一块 4+64 的 RK3399 开发板,带一个千兆网口,据卖家说是自动售货机上拆下来的,原本运行的是 Android 系统,后来找了适配的镜像刷了 Armbian ,部署了 Docker 还用 Docker 起了一个 CasaOS
于是萌生了一个用 Docker 部署 OpenWrt 做旁路由的想法
环境说明
架构: ARMv8 / aarch64
系统: Armbian Linux
主路由 IP :192.168.1.1
准备分配给旁路由的 IP :192.168.1.233 (必须是一个不冲突的独立 IP )
步骤一:开启网卡混杂模式(极其重要)
在创建 macvlan 网络之前,必须开启物理网卡的混杂模式,否则容器网络无法正常通信
这里有个大坑,网上很多的老教程网卡名字都叫 eth0 ,但是这里的网卡一定要和你自己的匹配
先执行 ip a 查看你的实际网卡名称
root@orangepi-rk3399:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: end0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether d6:ed:62:cb:94:02 brd ff:ff:ff:ff:ff:ff
altname enxd6ed62cb9402
inet 192.168.1.5/24 metric 100 brd 192.168.1.255 scope global dynamic end0
valid_lft 84562sec preferred_lft 84562sec
inet6 2409:8a7c:be39:2390:90d8:8d94:b322:205b/64 scope global temporary dynamic
valid_lft 252465sec preferred_lft 83973sec
inet6 2409:8a7c:be39:2390:d4ed:62ff:fecb:9402/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 252465sec preferred_lft 166065sec
inet6 fe80::d4ed:62ff:fecb:9402/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
3: br-21ebba6826fd: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether da:2c:95:1d:90:4c brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-21ebba6826fd
valid_lft forever preferred_lft forever
4: br-e08849db2acb: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 62:dc:8c:04:91:3d brd ff:ff:ff:ff:ff:ff
inet 172.19.0.1/16 brd 172.19.255.255 scope global br-e08849db2acb
valid_lft forever preferred_lft forever
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether ce:a4:7e:57:66:aa brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::cca4:7eff:fe57:66aa/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
6: vethc3021fa@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether b6:ef:9d:d9:62:53 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::b4ef:9dff:fed9:6253/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
从输出可以清晰地看到,我的物理网卡名字是 end0
确认网卡名称后,开启混杂模式
ip link set end0 promisc on
步骤二:创建 Docker Macvlan 网络
创建一个与你主路由同网段的 macvlan 网络,注意 -o parent= 后面要跟刚刚查到的真实网卡名 end0
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=end0 \
macnet
步骤三:拉取并运行 OpenWrt 容器
针对这类 ARM 架构的开发板,推荐使用 ophub/openwrt-armv8 镜像,它的优势在于会自动同步最新的 OpenWrt 源码进行编译,网上其实有很多别人打包好的老镜像,虽然开箱自带一些不能说的科学插件,但内核版本早就停更了,后续维护和折腾的成本非常高,不如直接用最新版省心
一键运行
docker run -d --name=openwrt \
--network macnet \
--privileged \
--restart always \
ophub/openwrt-armv8:latest
步骤四:修改 OpenWrt 的默认 IP
容器跑起来后,它的默认后台 IP 可能会和你的主路由(192.168.1.1)冲突,我们需要进容器给旁路由单独分配一个 IP
进入容器终端
docker exec -it openwrt bash
编辑网络配置文件
vi /etc/config/network
按 i 键盘进入编辑模式,找到 config interface 'lan' 那一段,把 option ipaddr 改为你规划好的旁路由 IP ,比如我用的是 192.168.1.233 改好后按 Esc ,输入 :wq 保存退出
重启 OpenWrt 网络服务使之生效
/etc/init.d/network restart
步骤五:配置旁路由(Web 后台操作)
现在,打开浏览器,输入你刚刚设置的旁路由 IP :192.168.1.233 (默认账号:root ,密码:password)
进入后台后,只需要做三件事
关闭 DHCP 网络 -> 接口 -> LAN -> 修改 -> 底部”DHCP 服务器” -> 勾选”忽略此接口”
旁路由不需要分配 ,我们让主路由来管理DHCP
设置网关和 DNS 在 LAN 接口的”基本设置”中
- IPv4 网关:填你的主路由 IP (如 192.168.1.1)
- 使用自定义的 DNS 服务器:填主路由 IP 或公共 DNS (如 223.5.5.5)
设置防火墙(动态伪装)
很多过时的教程会让你去 SSH 里敲一段 iptables -t nat -I POSTROUTING... 的防火墙规则,实际上对于较新的 OpenWrt 来说,完全不需要去管防火墙终端命令
直接在 网络 -> 防火墙 -> 基本设置 里,找到你的局域网( LAN )所在的区域,把 “IP 动态伪装 ( MASQUERADE )” 勾选上,然后点击”保存并应用”即可
总结
至此,这块从自动售货机上拆下来的 RK3399 成功再就业,旁路由完美运行
以后手机或电脑想走这个旁路由的网络,只需要把设备的网络设置改成手动(有的也叫静态 IP ),然后把网关和 DNS 都指向旁路由的 IP 就大功告成了,如果想让家里所有设备自动走旁路由,去主路由的 DHCP 设置里把网关改成旁路由 IP 即可