macvlan
eth0を親インターフェイスとして使用してインターフェイスを作成しました。 eth0 の NS および eth0 の NA メッセージは表示できますが、macvlan
インターフェイスの NA メッセージは表示できません。ただし、ゲートウェイでpingすると、macvlan
NSメッセージは表示されますが、macvlan
NAmacvlan
応答は表示されません。この問題を解決するのに役立つ構成は何ですか?macvlan
現在eth0を見て、一般的なNSメッセージとNAメッセージを見たいです。名前空間は作成されません。私はグローバルネームスペース自体内で作業しています。
また、ゲートウェイをpingするには、macvlan
/etc/network/interfacesファイルに「iface lo inet6 Loopback」を配置する必要がありました。それ以外の場合は、ping6で-Iを明示的に使用しようとするたびにmacvlan
ping6がソースを 。 eth0からping6に移動してもmacvlan
機能しません。 Ping6は常にmsgを使用してソースアドレスを変更します。例: - >「警告:ソースアドレスはmacvlan1以外のデバイスから選択できます。」
問題を再現するには、次のコードを確認してください。
ubuntu@vm0:~$ uname -r
3.13.0-36-generic
ubuntu@vm0:~$ ip -6 link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 02:ec:39:e5:22:50 brd ff:ff:ff:ff:ff:ff
3: macvlan1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default
link/ether ce:99:a8:33:1e:5d brd ff:ff:ff:ff:ff:ff
ubuntu@vm0:~$ ip -6 address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 2001:db8::3/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::ec:39ff:fee5:2250/64 scope link
valid_lft forever preferred_lft forever
3: macvlan1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
inet6 2001:db8::8/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::cc99:a8ff:fe33:1e5d/64 scope link
valid_lft forever preferred_lft forever
ubuntu@vm0:~$ ip -6 route
2001:db8::/64 dev macvlan1 proto kernel metric 256
2001:db8::/64 dev eth0 proto kernel metric 256
2001:db8::/48 dev eth0 proto kernel metric 256
2001:db8::/48 dev macvlan1 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
fe80::/64 dev macvlan1 proto kernel metric 256
default via 2001:db8::1 dev eth0 metric 1
default via fe80::ec:39ff:fee5:22 dev eth0 metric 1024
ubuntu@vm0:~$ ip -6 neighbor
2001:db8::1 dev macvlan1 lladdr 00:00:5e:00:01:00 router REACHABLE
2001:db8::1 dev eth0 lladdr 00:00:5e:00:01:00 router STALE
2001:db8::2 dev macvlan1 router FAILED
fe80::5e00:100 dev macvlan1 lladdr 00:00:5e:00:01:00 router STALE
fe80::5e00:100 dev eth0 lladdr 00:00:5e:00:01:00 router STALE
2001:db8::2 dev eth0 lladdr 00:00:5e:00:01:00 router DELAY
2001:db8::9 dev macvlan1 lladdr 6a:25:a8:4e:23:5d STALE
macvlanでeth0にpingを試みると、ping6はソースを変更し、次の警告を表示します。
ubuntu@vm0:~$ ping6 2001:db8::3 -I macvlan1
ping6: Warning: source address might be selected on device other than macvlan1.
PING 2001:db8::3(2001:db8::3) from 2001:db8::3 macvlan1: 56 data bytes
64 bytes from 2001:db8::3: icmp_seq=1 ttl=64 time=4.41 ms
64 bytes from 2001:db8::3: icmp_seq=2 ttl=64 time=0.548 ms
64 bytes from 2001:db8::3: icmp_seq=3 ttl=64 time=0.628 ms
64 bytes from 2001:db8::3: icmp_seq=4 ttl=64 time=0.546 ms
^C
--- 2001:db8::3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3053ms
rtt min/avg/max/mdev = 0.546/1.534/4.417/1.665 ms
macvlanでゲートウェイをpingできます。
ubuntu@vm0:~$ ping6 2001:db8::1 -I macvlan1
PING 2001:db8::1(2001:db8::1) from 2001:db8::8 macvlan1: 56 data bytes
64 bytes from 2001:db8::1: icmp_seq=2 ttl=255 time=3.50 ms
64 bytes from 2001:db8::1: icmp_seq=3 ttl=255 time=1.63 ms
64 bytes from 2001:db8::1: icmp_seq=4 ttl=255 time=2.54 ms
64 bytes from 2001:db8::1: icmp_seq=5 ttl=255 time=1.26 ms
^C
--- 2001:db8::1 ping statistics ---
5 packets transmitted, 4 received, 20% packet loss, time 4041ms
rtt min/avg/max/mdev = 1.261/2.237/3.501/0.867 ms
eth0のtcpdumpは次のようになります
ubuntu@vm0:~$ sudo tcpdump -eni eth0 ip6
11:45:39.281934 00:00:5e:00:01:00 > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 110: fe80::5e00:100 > ff02::1: ICMP6, router advertisement, length 56
11:45:40.105204 00:00:5e:00:01:00 > 33:33:ff:00:00:03, ethertype IPv6 (0x86dd), length 86: 2001:db8::2 > ff02::1:ff00:3: ICMP6, neighbor solicitation, who has 2001:db8::3, length 32
11:45:40.105975 02:ec:39:e5:22:50 > 00:00:5e:00:01:00, ethertype IPv6 (0x86dd), length 86: 2001:db8::3 > 2001:db8::2: ICMP6, neighbor advertisement, tgt is 2001:db8::3, length 32
しかし、macvlanにはNSはありません。
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on macvlan1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:48:09.316865 00:00:5e:00:01:00 > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 110: fe80::5e00:100 > ff02::1: ICMP6, router advertisement, length 56
11:48:10.197974 00:00:5e:00:01:00 > 33:33:ff:00:00:03, ethertype IPv6 (0x86dd), length 86: 2001:db8::2 > ff02::1:ff00:3: ICMP6, neighbor solicitation, who has 2001:db8::3, length 32
11:48:20.220753 00:00:5e:00:01:00 > 33:33:ff:00:00:03, ethertype IPv6 (0x86dd), length 86: 2001:db8::2 > ff02::1:ff00:3: ICMP6, neighbor solicitation, who has 2001:db8::3, length 32
答え1
これはうまくいきません
問題は、次に関連する誤ったルーティングの前提です。MACVLANの仕組み。 MACVLANの主なユースケースは、ネットワークネームスペースとコンテナです。コンテナの場合でも、コンテナがMACVLANインタフェースを使用している場合、ホストとコンテナ間の通信に問題があることが知られています。
MACVLANインターフェイスが作成されると、親NICインターフェイスはMACVLANインターフェイスに割り当てられている追加のMACアドレスからパケットを受信し、MACVLANインターフェイス(主にIPv6の場合はマルチキャスト)に必要なすべての追加MACアドレスからパケットを受信します。新しい民主党マルチキャスト宛先の初期クエリ)。ネットワークカードのMACアドレスフィルタリングテーブルを一覧表示する方法はわかりませんが、割り当てられたマルチキャストMACアドレスの一覧表示には機能しますip maddress
。だからip maddress show dev eth0
育てる前と後を比較してみるとmacvlan1次の追加項目が表示されます。
link 33:33:ff:33:1e:5d
これは、ce:99:a8:33:1e:5d / fe80::cc99:a8ff:fe33:1e5d/64 (IPv4 ARP よりも改善) に対する IPv6 NDP 要求に使用されるイーサネットマルチキャストアドレスであるためです。放送)。追加のIPv6アドレス2001:db8::8/64を追加しますか? NICが次を受信するには、一致する新しいイーサネットマルチキャストアドレスが必要です。
link 33:33:ff:00:00:08
これは、インターフェイス間に関係があることを示すためです。フレームが放出されるときmacvlan1MACアドレスeth0経由このパケットを見ないイーサネット0IPv6スタック。最後のステップでは、MACVLANドライバによって直接注入されます。同様に回答を受けたときeth0からMACVLANの予約済みアドレス(少なくともこれまではデフォルトのユニce:99:a8:33:1e:5d
キャストであり、IPv633:33:ff:33:1e:5d
用の33:33:ff:00:00:08
イーサネットマルチキャスト)の場合、イーサネットフレームはMACVLANドライバによって盗まれて次の場所に配置されます。macvlan1代わりにインターフェイス。したがって、背後にあるIPv6スタックはイーサネット0このパケットは受信されません。
クエリを受信しようとしたときに何が起こるかをまとめるにはイーサネット0その背後にあるネットワークスタックは、接続されたMACVLANインターフェイスによって放出されます。イーサネット0:
- フレームは表しますmacvlan1放出することですイーサネット0LANで
- フレームが受信されていません。イーサネット0
- 答えなかった
これらのクエリが実際に何とか受け取られ、実際に何とか応答することを想像してください(ここにはルーティングの問題がありますが)。
- 今回は本当に棚が立ち上がったイーサネット0放出することですイーサネット0LANで
- フレームが受信されていません。イーサネット0
- したがって、MACVLANドライバがフレームを盗むことも、MACVLANがフレームを受信することもできません。macvlan1
- 応答を受信できませんでした。
これはmacvlan1ネットワークネームスペースにあります。注:
ip netns add experiment
ip link set macvlan1 netns experiment
名前空間を変更するとインターフェイスがリセットされるため、設定をやり直してください。
ip -n experiment link set macvlan1 up
ip -n experiment address add 2001:db8::8/64 dev macvlan1
次のようにpingを実行します(上記のようにまだ失敗します)。
ip netns exec experiment ping 2001:db8::3/64
ネットワークネームスペースがないと、2つのインターフェイスが同じホスト上にある場合(インターフェイスに関係なく重要ではありません)、それ自体に属するグローバルIPv6アドレスが別のIPv6グローバルアドレスに到達するため、これは当然発生しません。すべて:いつも通り過ぎますルオ(ループバック)インターフェース:
# ip route get 2001:db8::3 from 2001:db8::8
local 2001:db8::3 from 2001:db8::8 dev lo table local proto kernel src 2001:db8::3 metric 0 pref medium
インターフェイスのみで強制実行平らなコマンドは追加のルーティング問題を引き起こします。
だから私はクエリに応答しない良い理由とインターフェイスをどのように使用するのか、なぜそれがうまくいかないのかを説明しました。
この問題はどのように対処すべきですか?
これを機能させるには(少なくともネットワークネームスペースの場合、ローカルアドレスのルーティングの問題に関係なく)、外部スイッチはフレームを元の場所から再送信する必要があります。ここのスイッチは、構成に応じて仮想マシンを実行するホストシステムでも、実際の外部スイッチでもかまいません。
これらのスイッチ設定(VEPA、ヘアピン...)を設定するのが実用的でない場合、1つの方法はブリッジモードでMACVLANインターフェイスを作成し、特定のアドレスとルーティング設定を使用してホストのブリッジモードで別のMACVLANインターフェイスを追加することです。です。これは、MACVLANドライバが通過する必要がないためです。イーサネット0ただし、内部で処理されるすべてのケースは、ある仮想インターフェイスから別の仮想インターフェイスに正確に検出されます。最初から始めましょう:
ip link add link eth0 name macvlan1 address ce:99:a8:33:1e:5d type macvlan mode bridge
ip netns add experiment
ip link set macvlan1 netns experiment
ip -n experiment link set macvlan1 up
ip -n experiment address add 2001:db8::8/64 dev macvlan1
ip link add link eth0 name macvlanhost up type macvlan mode bridge
ip address add 2001:db8::3/64 dev macvlanhost noprefixroute
ip route add 2001:db8::8/128 dev macvlanhost
以下のコマンドは、プライバシー拡張が使用されている場合でもアドレスを強制的に使用します(2001:db8 :: 8へのパスのみが追加されます)。macvlanhost):
ip netns exec experiment ping -I 2001:db8::8 2001:db8::3
これで機能する準備が整いました。さらにNS/NAを確認する必要がある場合は、まずNDPエントリを更新してください。
ip -6 neighbour flush dev macvlanhost
ip -n experiment -6 neighbour flush dev macvlan1
ホストからキャプチャ:
tcpdump -e -n -s0 -p -i macvlanhost icmp6
または名前空間で:
ip netns exec experiment tcpdump -e -n -s0 -p icmp6
もちろん、ネットワークネームスペース実験以前と同様に、ゲートウェイを含むLAN内のすべてと通信を続けることはできますが、localhostのサービス(つまり、::1
独自のインスタンスとして使用)とは通信できません。ルオインターフェイスはホストとは異なります。ルオインターフェイス)、ホストと通信するときは少し異なる動作します。