作者:丶Source
写在前面
前面一篇写了软路由的安装以及启用 docker 服务
本文主要介绍如何在 openwrt 上优化 docker 网络,文章大纲如下
openwrt 的容器与路由器下的普通设备互联互通
openwrt 的容器访问路由器下的普通设备,如 nas 设备时,不需要经过 NAT 导致性能损耗
为什么不用 docker0?
openwrt 的 docker 网络使用的是默认的 docker0 bridge,会存在以下的缺陷:
容器与其他设备不在同个子网,其他设备无法与 openwrt 容器进行直接通信
容器访问外网需要经过 docker0 虚拟网卡来进行 NAT,存在一定性能损耗
容器只能通过 DNAT 将需要暴露端口映射到宿主上,而宿主本身就是主路由,存在一定端口暴露风险
具体分析见上图:
台式机、笔记本等,是无法直接访问 172.16.0.10 容器 A 的 IP
容器 A 可以访问 NAS 10.0.0.2,但是数据包需要经过 docker0 网桥做一层 NAT 地址转换
虽说目前软路由性能也足够,但是有没更加优雅的方案?答案当然是有的
自定义网桥
macvlan 模式
之前在 unraid 上比较喜欢使用 br0 网络模式,本质上就是 macvlan,其有如下特性:
容器的分配的 ip 与 unraid 宿主处于同个层次,也就是作为主路由的一个子网
可以手动指定 ip 进行分配,也可自动递增分配
可以直接获取到 ipv6
详细这部分详细的介绍可以看之前的文档:
所以一开始考虑也是 openwrt 上配置 macvlan,网上找到的教程也有配置成功的
然而在实际配置中,macvlan 能够创建,但是与其他软路由下的设备就是无法互通
PS: 本文对应的方案我也回复到 issue 里面了,可以搜一下 “Openwrt 下 Docker 网络食用方法”
自定义网桥
在网上查资料折腾了许久仍无法解决,最后自己尝试通过自定义 bridge 模式来实现。
首先确定目前主路由 LAN 侧的网络情况:网络 - 接口
从上图可以看到 LAN 侧信息:
网卡名称:br-lan
子网分配:10.0.0.0/24
然后 ssh 进入主路由来创建一个自定义的 bridge 网络(注意替换为自己的 LAN 网络)
docker network create -d bridge --subnet=10.0.0.0/24 --gateway=10.0.0.1 -o "com.docker.network.bridge.name"="br-lan" lanet
参数解释如下:
执行之后,就可以在 openwrt 管理页面上看到
接下来就可以正常创建一个新的容器,并使用该桥接网络看看效果
这里我跑一个 nodered 容器:
指定使用的网络为 lanet|bridge|10.0.0.0/24
指定分配的 IP 地址为:10.0.0.50
其他的就按照正常创建 docker 的配置即可,之后启动容器
可以看到容器能够正常启动并分配了我们指定的 IP
进入控制台进行网络测试:
可以看到容器只分配了一个 ipv4,无法像 unraid 的 macvlan 方案获取到 ipv6 地址
同时还可以直接 ping 通我的 nas 地址,说明与接入主路由的其他设备是可以正常通信的
这样,我就可以直接在我的电脑上来访问这个 nodered 服务了
并且因为没有暴露端口在宿主,也相对而言更加安全了,其网络模型变成了
相当于从软路由 LAN 网络层面来看:
每一个容器都是一个独立的设备,在网络层级上等同于台式机、笔记本、NAS 等
因为容器与常规设备都处于同个子网,默认就可以互联互通
同时也容器访问 NAS 也不需要经过一层 NAT 地址转换了,效率也更高了
写在后面
重启丢失网桥问题
上述操作因为没有固化,在路由器重启后,创建的自定义网桥也会被删除,需要重新创建
这里可以通过将创建命令写入 /etc/rc.local 来实现开机自动创建自定义网桥
需要注意要将创建命令写在 exit 0 之前,否则不会被执行
IP 分配冲突问题
使用此方案,建议提前做好 IP 段分配的规划,以避免 IP 地址冲突。
以我的网络环境为例,目前存在 3 个需要分配 IP 的场景:
路由器的 DHCP 服务,常规有线、无线设别接入主路由会走此方式分配 IP
unraid NAS 上使用 custom:br0 网络模式的容器,对应就是 macvlan
openwrt 上使用自定义网桥 lanet 的容器
对应的,我做了如下区分
路由器 DHCP 部分,可在 网络 -> 接口 -> LAN -> DHCP服务器 上进行设置
对于 unraid,因为我分配的 IP 就是 10.0.0.2 所以
unraid 上 custom:br0 模式的容器会从 10.0.0.3开始递增
当然也可以手动在 unraid 上指定分配的 IP
此外,目前这种方式还存在一个缺陷,就是即使主路由有 ipv6 pd,openwrt 容器也是无法分配 ipv6
本文完,下一篇正式介绍旧路由的服务迁移,点赞关注不迷路
4000520066 欢迎批评指正
All Rights Reserved 新浪公司 版权所有