You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让多个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重启覆盖,非常安全:

  1. 先查看当前DOCKER-USER链的规则(可选,确认默认状态):
    sudo iptables -L DOCKER-USER -n
    
  2. 添加规则允许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
    
  3. 为了让规则重启后不丢失,需要把它持久化。先安装iptables持久化工具(如果没装的话):
    sudo apt update && sudo apt install iptables-persistent
    
    然后保存规则:
    sudo iptables-save > /etc/iptables/rules.v4
    
    这样每次开机规则都会自动加载。

方法二:创建多个自定义Docker网络,分别关联两个网桥

如果需要更精细的网络隔离(比如某些容器只让br25的VM访问,另一些只让br50访问),可以给每个KVM网桥创建对应的Docker自定义网络:

  1. 创建关联br25的Docker网络:
    docker network create --driver bridge --opt "com.docker.network.bridge.name=br25" br25-net
    
  2. 再创建关联br50的Docker网络:
    docker network create --driver bridge --opt "com.docker.network.bridge.name=br50" br50-net
    
  3. 启动容器的时候,按需连接到对应的网络就行,甚至可以让容器同时连两个网络:
    # 只让br25的VM能访问这个容器
    docker run -d --network br25-net nginx
    # 让两个网桥的VM都能访问
    docker run -d --network br25-net --network br50-net nginx
    
    这种方式下,Docker会自动帮你配置好对应的iptables规则,不用手动修改,非常省心。

为什么不推荐你之前的临时方案?

  • 禁用Docker的iptables规则(在daemon.json里加"iptables": false)会直接废掉Docker的网络隔离能力,所有外部设备都能访问你的容器,这在生产环境绝对是大忌。
  • 至于你没说完的第二个临时方案,估计是手动修改了iptables但没持久化,重启就失效,太麻烦了。

备注:内容来源于stack exchange,提问作者me2017

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:49:32