如何让多个KVM网桥的虚拟机访问Docker容器?
如何让多个KVM网桥的虚拟机访问Docker容器?
我完全懂你的困扰!你在Ubuntu 22.04上运行Docker CE 25(而且这个问题在CE 26上也能复现),主机IP是192.168.1.205,同时有两个KVM网桥br25(192.168.25.0/24)和br50(192.168.50.0/24),虚拟机都通过这两个网桥走流量。之前你靠在/etc/docker/daemon.json里指定"bridge": "br25"解决了br25网段VM访问容器的问题,但现在br50的VM也需要访问,却发现daemon.json只能设置一个默认网桥,而且手头的两个临时方案都不太靠谱——比如禁用Docker的iptables规则虽然能让两边都通,但这明显是拆东墙补西墙,安全隐患太大。
下面给你两个更合理的解决方案,都是生产环境也能用的:
方法一:给Docker的iptables规则加白名单,允许两个网段访问
Docker默认会用DOCKER-USER这个iptables链来控制外部流量访问容器,这个链是专门留给用户添加自定义规则的,不会被Docker重启覆盖,非常安全:
- 先查看当前
DOCKER-USER链的规则(可选,确认默认状态):sudo iptables -L DOCKER-USER -n - 添加规则允许
br25和br50的网段流量:sudo iptables -A DOCKER-USER -s 192.168.25.0/24 -j ACCEPT sudo iptables -A DOCKER-USER -s 192.168.50.0/24 -j ACCEPT - 为了让规则重启后不丢失,需要把它持久化。先安装iptables持久化工具(如果没装的话):
然后保存规则:sudo apt update && sudo apt install iptables-persistent
这样每次开机规则都会自动加载。sudo iptables-save > /etc/iptables/rules.v4
方法二:创建多个自定义Docker网络,分别关联两个网桥
如果需要更精细的网络隔离(比如某些容器只让br25的VM访问,另一些只让br50访问),可以给每个KVM网桥创建对应的Docker自定义网络:
- 创建关联
br25的Docker网络:docker network create --driver bridge --opt "com.docker.network.bridge.name=br25" br25-net - 再创建关联
br50的Docker网络:docker network create --driver bridge --opt "com.docker.network.bridge.name=br50" br50-net - 启动容器的时候,按需连接到对应的网络就行,甚至可以让容器同时连两个网络:
这种方式下,Docker会自动帮你配置好对应的iptables规则,不用手动修改,非常省心。# 只让br25的VM能访问这个容器 docker run -d --network br25-net nginx # 让两个网桥的VM都能访问 docker run -d --network br25-net --network br50-net nginx
为什么不推荐你之前的临时方案?
- 禁用Docker的iptables规则(在
daemon.json里加"iptables": false)会直接废掉Docker的网络隔离能力,所有外部设备都能访问你的容器,这在生产环境绝对是大忌。 - 至于你没说完的第二个临时方案,估计是手动修改了iptables但没持久化,重启就失效,太麻烦了。
备注:内容来源于stack exchange,提问作者me2017
相关产品推荐
相关产品推荐

