如何在OpenWrt上优雅地配置docker网络
前言
当docker在op宿主机上运行时,网络总是因为openwrt作为家庭网关的特殊性而配置坑点重重。在最新的openwrt上,在docker里通过docker compose自动创建或者用第三方管理面板默认创建的网络默认不能访问互联网,和op所在的局域网之间也没有直接路由,信息传输仅通过publish的端口进行。因此,在这种情况下部署诸如wireguard这种需要和局域网、互联网通讯的服务就会遇到不能上网的问题。本文主要记录这个问题的解决方案。
坑在哪里
造成这个问题的原因,主要是docker默认创建网络的机制。docker创建网络时会新建一个内核临时网桥对象,这个对象处于内核层级,每次开机时会重新创建,也不能被openwrt负责管理网络的处于应用层的netifd管理,因此无法在上面创建uci网络接口,这也就无法顺理成章地进行下一步的配置防火墙规则,导致处于该网络的容器无法上网。
解决方案
openwrt上正确新建网络接口的方法应该先在uci的网络-接口-设备页面里手动创建一个网桥设备,里面的所有设置全部为空并命名,这里的例子命名为br-wg。再来到接口页面使用新建的网桥设备创建一个接口,协议选择不配置,并保存,并为其分配一个防火墙区域。再到防火墙里给该区域赋予转发到你想要的区域的权限,然后使用命令行创建docker网络,并给这个网络指定已有网桥设备(这里是br-wg)。命令示例:
docker network create \
--driver bridge \
--subnet 10.42.42.0/24 \
--gateway 10.42.42.1 \
-o com.docker.network.bridge.name=br-wg \
wg
这样我们就得到了一个在openwrt上合法存在的bridge。接下来,进入防火墙为这个接口配置转发到WAN、LAN的规则,就能让网络里的容器拥有指定路由了。
许可协议:
CC BY 4.0