(2023-03-25旧サイトより転記)
(2015-04-08)
IPv4のローカルアドレス(192.168.など)に相当するIPv6におけるローカルアドレスであるところの「ユニークローカルIPv6ユニキャストアドレス(ULA)」を、手持ちの2台の Raspberry Pi に割り当ててみます。 なお、今回は手動設定での実験です。自動割り当てはまた今度、ということで。
(注意:同様の用途であるIPv6サイトローカルアドレスというのが定義されていましたが、廃止になっています。代わりに使うのが今回のULAという訳です。)
OSのバージョンはこんな感じ。
Linux rasp01 3.18.11+ #776 PREEMPT Mon Apr 6 13:13:58 BST 2015 armv6l GNU/Linux
IPv6アドレス予備知識
まずは基礎知識として下記を一読。
ULA割り当て
IPv6アドレスの算出
アドレスの構成としてはMSBから順に下記の通り。
- 先頭8ビット fd00::/8 固定 (1バイト)
- グローバル識別子 40ビット (5バイト)
- サブネット識別子 16ビット (2バイト)
- インタフェース識別子 64ビット(8バイト)
- (合計16バイト=128ビット) このうちのグローバル識別子(グローバルID)は計算方法が指定されているランダム値、だそうです。
グローバル識別子の計算方法ですが、下記のサイトを参考にさせていただきました。ありがとうございます。
参考 http://c5d5e5.asablo.jp/blog/2013/08/21/6953027
また、この中で EUI-64 と呼ばれるフォーマットの値をMACアドレスを元に算出するのですが、下記サイトを参考にさせていただきました。ありがとうございます。
参考 http://www.infraexpert.com/study/ipv6z4.html
EUI-64の値ですが、実は IPv6 が稼働している環境であれば、ifconfig でIPv6のリンクローカルアドレス(もしくはグローバルアドレス)を見た時の下位8バイトだったりします。
グローバル識別子を計算してみての感想ですが・・・どうせ自宅のLANなんて大した規模でもないので、勝手なランダム値を使ってもいいんじゃないかと思ったり。といいつつ、一応まじめに計算した値を使うことにします。 (計算用のシェルスクリプトを作成してみましたが、検算が済んで、気が向いたら公開するかもしれません:-)
なお、グローバル識別子の計算式の中に、西暦1900年1月1日から現在までの秒数、という値が入っているため、計算するたびに変化しますのでご注意ください(なぜか西暦1970年からではないので少々厄介)。
というわけでとりあえずIPv6アドレスを2つ用意します。なお、先頭の0xfd~グローバル識別子~サブネット識別子まで(上位64ビット)はすべてで揃えるようにします(結局、MACアドレスはどれか1台のマシンのものを使う、ということになります)。
1号機用
fd90:6875:349e:1::20/64
2号機用
fd90:6875:349e:1::21/64
IPv6アドレスをインターフェースに割り当て
手動でサクッと割り当てます。
1号機:
$ su # ip addr add fd90:6875:349e:1::20/64 dev br0
2号機:
$ su # ip addr add fd90:6875:349e:1::21/64 dev wlan0
(補足:デバイス名は通常でしたら eth0 ですが、1号機はブリッジを構成、2号機は無線LAN、となっているため上記のような名称になっています。)
IPv6を有効にしてみるにも書きましたが、Raspberry Pi では IPv6を起動すると自動的にリンクローカルユニキャストアドレスとグローバルユニキャストアドレスが割り当てられます。
これらの邪魔にならない/邪魔されないアドレスとして、この手動割り当てのアドレスを使うことができると思います。
pingなんかもやってみます。IPv6なのでping6を使います。
1号機:
$ ping6 -c 3 fd90:6875:349e:1::21 PING fd90:6875:349e:1::21(fd90:6875:349e:1::21) 56 data bytes 64 bytes from fd90:6875:349e:1::21: icmp_seq=1 ttl=64 time=7.17 ms 64 bytes from fd90:6875:349e:1::21: icmp_seq=2 ttl=64 time=6.34 ms 64 bytes from fd90:6875:349e:1::21: icmp_seq=3 ttl=64 time=6.21 ms --- fd90:6875:349e:1::21 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 6.215/6.580/7.178/0.431 ms
2号機:
$ ping6 -c 3 fd90:6875:349e:1::20 PING fd90:6875:349e:1::20(fd90:6875:349e:1::20) 56 data bytes 64 bytes from fd90:6875:349e:1::20: icmp_seq=1 ttl=64 time=5.03 ms 64 bytes from fd90:6875:349e:1::20: icmp_seq=2 ttl=64 time=6.39 ms 64 bytes from fd90:6875:349e:1::20: icmp_seq=3 ttl=64 time=5.54 ms --- fd90:6875:349e:1::20 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 5.035/5.655/6.390/0.562 ms
ホスト名でもやってみます。
/etc/hosts に下記の行を追加します。IPv4のほうは比較用です。
fd90:6875:349e:1::20 rasp00v6 #1号機 fd90:6875:349e:1::21 rasp01v6 #2号機 192.168.1.20 rasp00 #1号機 192.168.1.21 rasp01 #2号機
そして実行。とりえあず1号機から2号機へ向けてpingを打ってみます。
$ ping6 -n rasp01v6 PING rasp01(fd90:6875:349e:1::21) 56 data bytes 64 bytes from fd90:6875:349e:1::21: icmp_seq=1 ttl=64 time=5.94 ms 64 bytes from fd90:6875:349e:1::21: icmp_seq=2 ttl=64 time=6.37 ms (以下省略) $ $ ping -n rasp01 PING rasp01 (192.168.1.21) 56(84) bytes of data. 64 bytes from 192.168.1.21: icmp_req=1 ttl=64 time=5.81 ms 64 bytes from 192.168.1.21: icmp_req=2 ttl=64 time=6.29 ms (以下省略)
ん~問題ないようです。 ちなみに、pingの応答がミリ秒オーダーなのは、2号機が無線LANとなっているためです。
メモ:
結局、LANのインタフェース1個につきIPv6アドレスが3個振られることになる、のかな。
- リンクローカルアドレス
- グローバルユニキャストアドレス
- ユニークローカルIPv6ユニキャストアドレス
Raspbianでは、単純にIPv6を有効にすると、1,2は自動設定されます。よって、必要に応じて3を手動で追加設定する、という風になるかと。
IPv6アドレスの割り当て解除
下記のコマンドで割り当て解除します。
1号機:
$ su # ip addr del fd90:6875:349e:1::20/64 dev br0
2号機:
$ su # ip addr del fd90:6875:349e:1::21/64 dev wlan0
もしくは、今回は手動で割り当てただけなので、リブートすれば勝手に消えてなくなると思います。
宿題
- ULAをOS起動時に割り当て → 任意の固定IPv6アドレスを割り当て
以上、お疲れ様でした。