为什么物理接口不是 docker_gwbridge 的一部分?

为什么物理接口不是 docker_gwbridge 的一部分?

当我查看时docker_gwbridge,我发现该主机上的所有容器都是桥的成员。

bridge name         bridge id           STP enabled  interfaces
docker_gwbridge     8000.0242e581b3f5   no           veth0987748
                                                     veth21aa5ea
                                                     veth358d367
                                                     veth473e3a5
                                                     vetha199713
                                                     vethf482f5f
                                                     vethf4ceab6

但是,主机上的物理接口怎么会不是该网桥的成员呢?文档将此网络描述为离开 Docker 群集的流量的出口桥。也就是说,流量最有可能离开主机。docker_gwbridge当没有物理接口参与桥接时,什么机制可以确保进入(来自任何给定容器)的数据包最终通过物理接口离开主机?

答案1

Docker 使用的机制是 iptables。Docker 添加 iptables 规则,以便转发来自 docker_gwbridge 的数据包,然后在将流量发送到外界时进行 natted(伪装)。

以下是docker network inspect docker_gwbridge

[
    {
        "Name": "docker_gwbridge",
       ...
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.20.0.0/16",
                    "Gateway": "172.20.0.1"
                }
            ]
        },
        ...
        "Options": {
            "com.docker.network.bridge.enable_icc": "false",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.name": "docker_gwbridge"
        },
        "Labels": {}
    }
]

您可以看到docker使用172.20.0.0/16网络,并且com.docker.network.bridge.enable_ip_masquerade设置为true。

Docker 创建以下规则:

  • MASQUERADE all -- 172.20.0.0/16 任何地方(在表 nat 中)
  • 接受所有 -- docker_gwbridge !docker_gwbridge 任何地方任何地方(在前向链中)

因此,尽管没有物理接口连接到网桥,但该网桥中的流量被允许路由/转发,并且由于它被设置为 nat(伪装),因此流量将被放置在与 nat 地址关联的物理接口上。

相关内容