Linux インターフェース モード MACVLAN のプライベート モードは宣伝どおりに動作しないようです (Ubuntu)

Linux インターフェース モード MACVLAN のプライベート モードは宣伝どおりに動作しないようです (Ubuntu)

私は仮想インターフェース(MACVLANタイプ)を作成し、インターフェース間のすべての通信がホストから外部のデフォルトゲートウェイに向けて送信されるようにしようとしています。「プライベート」モードについて説明した記事はたくさんあります。ここ

プライベート: インターフェイスにバインドされた MAC VLAN が相互に通信できないように、すべての着信パケットをフィルタリングします (インターフェイスを介して着信する、MAC VLAN インターフェイスの 1 つと一致する送信元 MAC アドレスを持つすべてのパケットをドロップします)。

いくつかのインターフェースを設定しましたが、「プライベート」モードが宣伝どおりに動作していないようです。何か間違っているのでしょうか? ホストは Ubuntu 18.04 Bionic リリースです。

パケットは、「mode private」コマンドを無視してホスト内でスイッチングされます。 たった 4 つのコマンドで簡単に再現できます。 ご協力いただければ幸いです。

root@ubnt-bkp:/home/super# uname -a
Linux ubnt-bkp 4.15.0-96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1A ens160.3 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.3 up
root@ubnt-bkp:/home/super# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:4f:a9:99:99:02 brd ff:ff:ff:ff:ff:ff
...
...
18: ens160.3@ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP **mode** **DEFAULT** group default qlen 1000
    link/ether 38:94:ed:99:99:1a brd ff:ff:ff:ff:ff:ff

問題を再現するためのコマンド

root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1B ens160.5 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.5 up
root@ubnt-bkp:/home/super# dhclient ens160.5
root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1C ens160.6 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.6 up
root@ubnt-bkp:/home/super# dhclient ens160.6

次にオプションpingを使用します-I:

root@ubnt-bkp:/home/super#ping -I <IP address of ens160.5> <IP address of ens160.6>

(ens160再現する場合は、イーサネット インターフェイス名 (例: eth0) に置き換えてください)

答え1

MACVLAN インターフェイスの作成に使用しているコマンドは正しいです。

ただし、 を使用してもping -Iこれを検証することはできません。送信元インターフェイスと宛先インターフェイスの両方が同じホスト上にある場合 (この場合のように、同じ名前空間内にある場合)、pingは常に成功します。

では、これをどのようにテストするのでしょうか? MACVLAN インターフェイスを、デフォルト以外の異なる名前空間に配置します。次に、ping名前空間から実行します。

物理インターフェース ( ens160) の IP アドレスが であると仮定します192.0.2.2/24。また、ルーターのゲートウェイ アドレスが であると仮定します192.0.2.1

今:

# Create namespace named "ns5"
ip netns add ns5

# Create the macvlan interface as usual
ip link add link ens160 address 38:94:ed:99:99:1B ens160.5 type macvlan mode private

# Move the just-created macvlan interface into the "ns5" namespace
ip link set ens160.5 netns ns5

# Set the link up. Observe the "ip netns exec ns5" prefix.
ip netns exec ns5 ip link set ens160.5 up

# Set the IP address for the macvaln interface.  Observe the "ip netns exec ns5" prefix.
ip netns exec ns5 ip address add dev ens160.5 192.0.2.205/24


# Repeat above for another macvlan interface, this one in another namespace
# called "ns6"

ip netns add ns6
ip link add link ens160 address 38:94:ed:99:99:1C ens160.6 type macvlan mode private
ip link set ens160.6 netns ns6
ip netns exec ns6 ip link set ens160.6 up
ip netns exec ns6 ip address add dev ens160.6 192.0.2.206/24

この時点から、両方の macvtap インターフェースがゲートウェイに正常に ping できるようになります。

ip netns exec ns5 ping 192.0.2.1
ip netns exec ns6 ping 192.0.2.1

ゲートウェイ デバイスにアクセスできる場合は、192.0.2.205 および 192.0.2.6 の ARP エントリに macvlan インターフェイスの MAC アドレスが表示されていることが確認できます。

ただし、macvlan インターフェイスはprivateモードになっているため、次のコマンドは両方とも失敗します。

# Try to reach ens160.6 from ens160.5
ip netns exec ns5 ping 192.0.2.206

# Try to reach ens160.5 from ens160.6
ip netns exec ns6 ping 192.0.2.205

bridgeの代わりにを使用して実験を繰り返しますprivate。最後の 2 つの ping コマンドが成功することが分かります。

関連情報