ネイバー広告メッセージが Linux サブインターフェイスから出ていません。

ネイバー広告メッセージが Linux サブインターフェイスから出ていません。

macvlaneth0を親インターフェイスとして使用してインターフェイスを作成しました。 eth0 の NS および eth0 の NA メッセージは表示できますが、macvlanインターフェイスの NA メッセージは表示できません。ただし、ゲートウェイでpingすると、macvlanNSメッセージは表示されますが、macvlanNAmacvlan応答は表示されません。この問題を解決するのに役立つ構成は何ですか?macvlan現在eth0を見て、一般的なNSメッセージとNAメッセージを見たいです。名前空間は作成されません。私はグローバルネームスペース自体内で作業しています。

また、ゲートウェイをpingするには、macvlan/etc/network/interfacesファイルに「iface lo inet6 Loopback」を配置する必要がありました。それ以外の場合は、ping6で-Iを明示的に使用しようとするたびにmacvlanping6がソースを 。 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独自のインスタンスとして使用)とは通信できません。ルオインターフェイスはホストとは異なります。ルオインターフェイス)、ホストと通信するときは少し異なる動作します。

おすすめ記事