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から表示)に到達します。ただし、返信がコンテナ内に到達することはありません。
誰かが私がここで欠けているものを指摘してください?
これは、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インターフェースは、エンドポイントの場合にのみ使用する必要があります。
ここでは、このタイプのインターフェースに関する詳細情報を入手できます。