Почему физический интерфейс не является частью 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 (из любого заданного контейнера), в конечном итоге покидают хост на физическом интерфейсе, когда никакой физический интерфейс не участвует в мосте?

1
задан 8 January 2018 в 15:53
1 ответ

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 all - 172.20.0.0/16 где угодно (в таблице nat)
  • ACCEPT all - docker_gwbridge! Docker_gwbridge где угодно (в прямой цепочке)

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

3
ответ дан 3 December 2019 в 18:28

Теги

Похожие вопросы