4

У меня есть случай, когда я создал сеть Docker Macvlan (режим моста по умолчанию) и подключил эту сеть к работающему контейнеру Docker (например, C1). Таким образом, контейнер будет иметь новый интерфейс macvlan (например, eth1).

docker network create -d macvlan --subnet=172.16.16.0/24 --gateway=172.16.16.1 -o parent=ens224 macvlan-ens224
docker network connect macvlan-ens224 C1

Внутри контейнера C1 я создал интерфейс macvtap, используя интерфейс macvlan (eth1) и назначенный IP.

ip link add link eth1 name mymacvtap0 type macvtap mode private
ip addr add 172.17.17.2/24 dev mymacvtap0
ip link set up dev mymacvtap0

Теперь, когда я отправляю ping на некоторый IP-адрес подсети 172.17.17.2/24 изнутри, контейнер ARP-запроса транслируется с использованием исходного MAC-адреса интерфейса контейнера macvtap. Целевой IP отправляет ответ ARP. ARP-ответ достигает физического интерфейса ens224 (видно из tcpdump). Но Ответ никогда не достигает внутри контейнера.

Кто-то, пожалуйста, укажите, что мне здесь не хватает?

1 ответ1

3

это принципиальная схема работы драйвера macvlan:

                                    +---------------+
                                    | network stack |
                                    +---------------+
                                        |  |  |  |
                              +---------+  |  |  +------------------+
                              |            |  +------------------+  |
                              |            +------------------+  |  |
                              |                               |  |  |
                              |            aa  +----------+   |  |  |
                              | eth0     +-----| macvlan0 |---+  |  |
                              |         /      +----------+      |  |
 Wire   +------+       +---------------+   bb  +----------+      |  |
--------| eth0 |------/ if dst mac is /--------| macvlan1 |------+  |
        +------+     +---------------+ \       +----------+         |
                                        \  cc  +----------+         |
                                         +-----| macvlan2 |---------+
                                               +----------+

Как видите, этот тип интерфейсов работает по следующему принципу: он слушает физическую сетевую карту и просто перехватывает собственный mac-адрес.

Если вы добавите любой другой интерфейс в нижней части Macvlan. Например, мост или другой интерфейс macvlan/macvtap, он будет передавать любой трафик с него во внешнюю сеть, но не на обратную сторону. Потому что он ловит трафик только для самостоятельного mac-адреса.

Для решения вашей проблемы вы должны использовать linux bridge и подключить ваш контейнер к мосту через пару veth-interfaces.

Вы должны использовать интерфейсы macvlan/macvtap, только если это конечная точка.

Здесь вы можете получить больше информации об интерфейсах этого типа:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .