A interface macvtap criada no topo da interface macvlan de um contêiner Docker não pode se comunicar

3

Eu tenho um caso de uso em que criei uma rede macvlan do Docker (modo de ponte padrão) & conecte esta rede a um contêiner Docker em execução (por exemplo, C1). Assim, o contêiner terá uma nova interface macvlan (por exemplo, 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

Dentro do container C1, eu criei uma interface macvtap usando a interface macvlan (eth1) & IP atribuído.

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

Agora, quando faço ping para algum IP da sub-rede 172.17.17.2/24 de dentro do contêiner, a solicitação ARP é transmitida usando o endereço MAC de origem da interface macvtap do contêiner. O IP alvo envia de volta a resposta ARP. A resposta do ARP chega à interface física ens224 (vista do tcpdump). Mas a resposta nunca chega dentro do contêiner.

Alguém, por favor, indique o que estou perdendo aqui?

    
por XemX 02.05.2017 / 19:10

1 resposta

2

este é o esquema principal de como o driver macvlan funciona:

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

Como você pode ver, esse tipo de interface funciona de acordo com o seguinte princípio: é ouvir em placa de rede física e apenas pegar o endereço de auto-mac.

Se você adicionar qualquer outra interface na parte inferior do macvlan. Por exemplo, bridge ou outra interface macvlan / macvtap, ele transferirá qualquer tráfego para a rede externa, mas não para o lado reverso. Porque está pegando tráfego somente para o endereço MAC.

Para resolver seu problema, você deve usar o linux bridge e conectar seu contêiner a uma ponte via par de veth-interfaces.

Você deve usar as interfaces do macvlan / macvtap apenas se o endpoint.

Aqui você pode obter mais informações sobre esse tipo de interface:

por 23.08.2017 / 14:21