web-dev-qa-db-ja.com

Dockerコンテナのmacvlanインターフェースの上に作成されたmacvtapインターフェースは通信できません

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内で、macvlan(eth1)インターフェイスと割り当てられたIPを使用してmacvtapインターフェイスを作成しました。

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

ここで、コンテナー内からサブネット172.17.17.2/24のIPにpingを実行すると、コンテナーmacvtapインターフェイスの送信元MACアドレスを使用してARP要求がブロードキャストされます。ターゲットIPはARP応答を送り返します。 ARP応答は、物理インターフェイスens224(tcpdumpから表示)に到達します。ただし、返信がコンテナ内に到達することはありません。

誰かが私がここで欠けているものを指摘してください?

4
XemX

これは、macvlanドライバーがどのように機能するかを示す主要なスキームです。

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

ご覧のとおり、このタイプのインターフェイスは次の原則で機能します。物理ネットワークカードでリッスンし、自己のMACアドレスをキャッチするだけです。

Macvlanの下部に他のインターフェイスを追加する場合。たとえば、ブリッジまたは他のmacvlan/macvtapインターフェイスでは、トラフィックを外部ネットワークに転送しますが、逆方向には転送しません。セルフMACアドレスのトラフィックのみをキャッチしているためです。

問題を解決するには、Linuxブリッジを使用し、veth-interfacesペアを介してコンテナーをブリッジに接続する必要があります。

Macvlan/macvtapインターフェースは、エンドポイントの場合にのみ使用する必要があります。

ここでは、このタイプのインターフェースに関する詳細情報を入手できます。

5
kvaps