Назад | Перейти на главную страницу

Почему физический интерфейс не является частью docker_gwbridge?

Когда я смотрю на docker_gwbridge, Я вижу, что все контейнеры на этом хосте являются членами моста.

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

Однако как может случиться так, что физический интерфейс на хосте не является членом этого моста? Документация описывает эту сеть как выходной мост для трафика, покидающего кластер Docker Swarm. То есть трафик, который, скорее всего, уйдет с хоста. Какой механизм обеспечивает попадание пакетов в docker_gwbridge (из любого заданного контейнера) в конечном итоге покидает хост на физическом интерфейсе, когда в мосте не участвует физический интерфейс?

Docker использует механизм iptables. Правила Iptables добавляются Docker, поэтому пакеты из docker_gwbridge перенаправляются, а затем обрабатываются (маскируются), когда трафик отправляется во внешний мир.

Вот выдержка из вывода 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": {}
    }
]

Вы можете видеть, что докер использует сеть 172.20.0.0/16 и что com.docker.network.bridge.enable_ip_masquerade имеет значение true.

Docker создает следующие правила:

  • MASQUERADE все - 172.20.0.0/16 где угодно (в таблице нац)
  • ПРИНЯТЬ все - docker_gwbridge! Docker_gwbridge где угодно и где угодно (в прямой цепочке)

Таким образом, хотя к мосту не подключены физические интерфейсы, трафик в этом мосте может быть маршрутизирован / перенаправлен, и, поскольку он настроен на natted (маскарад), трафик будет передаваться на физический интерфейс, связанный с адресом nat.