web-dev-qa-db-ja.com

LinuxでのIPv6tun / tap:NDPが機能しない

私は、さまざまな種類のネットワーク(802.15.4に非常によく似たpowe line netwrok、PLC)を介してさまざまなIPv6デバイスを接続するために使用されていた古いコードに取り組んでいます。そのために、Cコードを使用して各デバイス(実際にはTunではなくTun)にLinux tun/tapインターフェイスを作成しました。これにより、tunから出力パケットを受信して​​PLCに配信し、反対方向に入力パケットを読み取ることができます。 PLCとtunインターフェースに注入します。

システムは基本的に正常に動作しますが、NDP機能が正しく動作していないように見えるのは私だけです。最初に、そのような2つのデバイスでは、IPv6リンクローカルアドレス(fe80 :: .../10)で相互にpingできないことに気付きました。次に、tcpdumpを使用してtunトラフィックを監視しましたが、近隣要請/アドバタイズメントメッセージがまったくないことがわかりました。私が見つけたもう1つの奇妙なことは、ネットワークの1つのデバイス(いわゆるコーディネーターノードであるマスターPLCデバイス)から送信されるルートアドバタイズメントがありますが、ネットワーク内の他のデバイスからは送信されないことです。

IPv6 NDPに従って、このような種類のネットワークに期待すべき正しい動作と、それを実現する方法を理解したいと思います。

誰かが私にいくつかのアイデアをくれたらありがたいです。

-ウッディ

2
Woody Wu

予想される動作は、NDPがTAPインターフェイスで使用されますが、TUNインターフェイスでは使用されないことです。

TAPはイーサネットをエミュレートするため、カーネルはイーサネットフレームをコードに配信し、コードからイーサネットフレームを期待します。そのため、最初にNDPを実行して、コードに渡すIPパケットに使用する宛先MACアドレスを知る必要があります。

一方、TUNはイーサネット層なしでIPを実行します。コードは追加のヘッダーなしでIPパケットを受信し、コードからIPパケットを受信することを期待します。オプションで、IPv4パケットとIPv6パケットを区別するためにIPパケットの前に小さなヘッダーを付けるように構成できますが、IPバージョンフィールドを使用して区別することもできます(非常に古いカーネルバージョンを使用している場合を除く)。

リンクローカルアドレスは両方の種類のインターフェースで機能すると思います。他のアドレスと同様に、NDPはTAPで使用されますが、TUNインターフェイスでは使用されません。

2
kasperd