raspberry_pi:ipv6:ユニークローカルipv6ユニキャストアドレス_ula

(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アドレス予備知識

まずは基礎知識として下記を一読。

参考 https://www.nic.ad.jp/ja/newsletter/No30/022.html

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

もしくは、今回は手動で割り当てただけなので、リブートすれば勝手に消えてなくなると思います。

宿題

以上、お疲れ様でした。

  • raspberry_pi/ipv6/ユニークローカルipv6ユニキャストアドレス_ula.txt
  • 最終更新: 2023/03/25 11:18
  • by dkroot