LoginSignup
22
16

More than 5 years have passed since last update.

IPv6の近隣探索について:ついでにIPv6でarping的なことをするコマンドを紹介したい

Last updated at Posted at 2018-11-30

この記事はSFC-RG Advent Calendar 2018の1日目です。

概要

ipv6の近隣探索(Neighbor Discovery for IP version 6)を利用するためのUNIXコマンドって聞いたことないよな〜って思って調べてみたら普通にあったけどあんまり知名度高くなさそうだったから書いとく。
これだけだとアドベントカレンダーに載せるにはあまりに忍びないので近隣探索について知ってることを書いた。

この記事はこのような人を対象にしています。

  • ipv6アドレスからMACアドレスが知りたい人
  • ICMP Echo Requestに答えない不躾なホストを探したい人
  • 珍しいコマンドを知りたいオタク

検証環境

~/
$ cat /etc/issue
Ubuntu 18.04.1 LTS \n \l

本題

ipv4の場合

ipv4の世界では同一サブネットのIPアドレスからMACアドレスを探すために、arpと呼ばれるプロトコルを利用して同一リンク内にブロードキャストパケットを送信する手法を採用している。
Linuxではデバイスが所持しているIP/MACの対応表(ARPテーブル)は以下のようなコマンドで見ることができる。

~/
# 古くは
$ arp -n
# 最近は
$ ip neigh

主にネットワークのトラブルシューティングをする際にIPアドレスからMACアドレスを知りたいというニーズがある。少なくとも私にはちょくちょくある。また、ping(ICMP Echo Request)に答えないホスト(WindowsとかFWがきついホストとか)の生存確認を行いたい時もある。そんなときに、arpingというコマンドを利用することがある。

~/
$ sudo  arping 10.200.0.1
ARPING 10.200.0.1
60 bytes from MACアドレスですよ〜〜 (10.200.0.1): index=0 time=2.435 msec
60 bytes from MACアドレスですよ〜〜 (10.200.0.1): index=1 time=2.104 msec
^C
--- 10.200.0.1 statistics ---
2 packets transmitted, 2 packets received,   0% unanswered (0 extra)
rtt min/avg/max/std-dev = 2.104/2.269/2.435/0.166 ms

ipv6の場合

ipv6の世界にはarpは無い。その代わりに同一リンク上のipv6アドレスからMACアドレスを探すために、近隣探索(Neighbor Discovery for IP version 6)と呼ばれるプロトコルを用いる。これはIPv4のICMPをより広範に拡張したICMPv6上で動作する。MACアドレス解決の他に、デフォゲ探し(router solicitation / router advertisement)のような、IPv4で他のプロトコルに頼っていた事案も近隣探索によって解決する。
以下のコマンドからデバイスの近隣探索テーブルを確認することができる。

~/
$ ip -6 neigh
別ホストのIPv6アドレスですよ〜〜〜 dev wlp2s0  FAILED
ルーター1のIPv6アドレスですよ〜〜〜 dev wlp2s0 lladdr ルーター1のMACアドレス router REACHABLE
ルーター2のIPv6アドレスですよ〜〜〜 dev wlp2s0 lladdr ルーター2のMACアドレス router STALE

IPv4でのARPテーブルではキャッシュの保持時間(15秒~45秒)を設定し、古い物を破棄することでエントリーの正当性を保証していたが、IPv6の近隣探索では各ホストの状態(REACHABLE,STALEなど)を記録する要素を追加して管理する手法を採用している。これらの情報もip -6 neighで確認可能である。

もちろん、一度も通信を行っていないホストの情報はここには記載されない。
しかしながら、IPv6の世界でもIPアドレスからMacアドレスを知りたいニーズは存在している...と思う。
どうやらIPv6でもarpingのように簡単に近隣探索できるコマンドがあるらしい。

IPv6版arping: ndisc6

そんな素敵なコマンドがndisc6である。
残念なことにip-utilsにセットに入っていたりしないので知らない人も多いはず。
普通にaptでinstall可能。もちろん公式リポジトリからソースコードも落とせるのでこだわりのある人はビルドしてみてください。

~/
$ sudo apt install ndisc6

使い方

近隣探索:ndisc6

一番シンプルに近隣要請を行う方法。

~/
$ ndisc6 【IPv6アドレス】 【対象とするインターフェース名】

ルーター探索:rdisc6

また、姉妹コマンドrdisc6を使うことでルーター要請を行うことができる。同一リンク上に複数ルーターが居る場合は複数出てくる。
結構詳しく色々教えてくれて楽しい。

~/
$ rdisc6 wlp2s0
Soliciting ff02::2 (ff02::2) on wlp2s0...

Hop limit                 :           64 (      0x40)
Stateful address conf.    :           No
Stateful other conf.      :          Yes
Mobile home agent         :           No
Router preference         :       medium
Neighbor discovery proxy  :           No
Router lifetime           :         1800 (0x00000708) seconds
Reachable time            :       300000 (0x000493e0) milliseconds
Retransmit time           :        10000 (0x00002710) milliseconds
 Source link-layer address: 00:1D:70:7D:EF:C7
 MTU                      :         1500 bytes (valid)
 Prefix                   : プレフィックスだよ〜::/64
  On-link                 :          Yes
  Autonomous address conf.:          Yes
  Valid time              :      2592000 (0x00278d00) seconds
  Pref. time              :       604800 (0x00093a80) seconds
 from fe80::ルーターだよ〜

まとめ

これでIPv6でもarping的なことができる。

~/
$ ndisc6 【IPv6アドレス】 【対象とするインターフェース名】

References

22
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
16