Logo address

IPv6 Address

— 実験からのアプローチ —

2016/02/04 追加

ここでは IPv4 に関してはよく知っているが、IPv6 は始めてと言う読者を想定している。

実験環境

ルーター

ここでは Aterm WH382A を使っている。このルーターを使った理由はコミュファ光の契約とセットになっているからである。このルーターは IPv6 に対応している。WH382A に限らず、最近のルーターはどれも IPv6 対応になっていると思われる。

コミュファ

コミュファ(commufa)は中部電力の子会社としてスタート
2008年に KDDI の傘下に入った。
IPv6 に対応したのは 2012年で、

コミュファは現在2種の契約メニューを提供している。

筆者はプロバイダ一体型を選択している。

IIJmio

筆者の場合、家庭内に設置しているサーバーが、インターネットからどのように見えるかを確認するために IPv6 対応の SIM が新たに必要になった注1。スマートフォンによるテザリングに使う。
愛知大学のネットワークは IPv6 には対応していない。また現在契約中の FREETEL の SIM も IPv6 には対応していない。つまりインターネット側からの IPv6 の見え方を確認する手段が無かった訳である。
スマートフォンによるテザリングを利用すれば注2、家に居ながら、家庭内サーバーの動作を確認できる。これは非常に大きなメリットである。


注1: IIJmio prepaid SIM (2GB) が IPv6 に対応している。
注2: SIM の差し替えは面倒なので、結局 WiFi ルーター(Aterm MR03LN) を買ってしまった。
これで、IPv6 に対応していない接続と対応している接続を簡単に切り替えられる。

クライアント

MacBook
OSX Yosemite

サーバー

OS: Plan 9
Web サーバー: Pegasus

IPv6 Test

IPv6 での接続性をテストするサイトは多数あるが、テスト項目の豊富さから、ここでは
http://ipv6-test.com/
を使う。
ここにアクセスすると、次のような結果が表示される。(実験環境に依存する)
図1: クライアント(MacBook)の IPv6 アドレス

IPv4 connectivity の欄の

180.196.232.139
は、ipv6-test.com が捉えた、クライアントの IPv4 アドレスである。
これはまた、筆者が契約しているコミュファによって我が家に割り当てられた IPv4 のアドレスであり、ブロードバンドルーターの現在の WAN 側アドレスでもある。

他方 IPv6 connectivity の欄の

2402:6b00:22cd:bf80:e543:1394:9d6c:fe12
は、ipv6-test.com が捉えた、クライアントの IPv6 アドレスである。
この長いアドレスのうち、 2402:6b00:22cd:bf80 の部分がコミュファによって我が家に割り当てられている。


注: IPv4 のテキスト表示は 0 から 255 の数字をビリオドで結んで表す。内部では 4B のデータである。他方、IPv6 のテキスト表示は16進数を使い、2B 毎にコロン(":")で結ぶ。内部では 16B のデータである。同じ IPv6 アドレスを表すテキスト表現の多様性を防ぐために、正規化された表現が望まれる。この問題に関しては次のページが詳しい

また、このテストサイト

http://ipv6-test.com/
では、Web サーバーの URL を指定して、IPv6 に対応しているか否かを調べることもできる。
次の図は、筆者のサーバー http://ar.nyx.link をテストした結果である。
図2: サーバー http://ar.nyx.link の IPv6 アドレス

表示されている IPv6 アドレス

2402:6b00:22cd:bf80::6
については、以下に解説を加える。

ネットワーク・インターフェイスに割り当てられたアドレス

筆者が電子文房具として使っているのは MacBook である。ここでもそれを使っている。この場合、図1に表示されたアドレスは ifconfig コマンドで正体を見ることができる注1

- bash$ ifconfig
...
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether 20:c9:d0:8b:02:b5
	inet6 fe80::22c9:d0ff:fe8b:2b5%en0 prefixlen 64 scopeid 0x4
	inet6 2402:6b00:22cd:bf80:22c9:d0ff:fe8b:2b5 prefixlen 64 autoconf
	inet6 2402:6b00:22cd:bf80:e543:1394:9d6c:fe12 prefixlen 64 autoconf temporary
	inet 192.168.0.249 netmask 0xffffff00 broadcast 192.168.0.255
	nd6 options=1<PERFORMNUD>
	media: autoselect
	status: active
en1: ...
...


注1: Windows では ipconfig コマンドで見ることができる。

グローバルアドレス

筆者が今使っているクライアント(MacBook)の正式の IPv6 アドレスは autoconf で示された

2402:6b00:22cd:bf80:22c9:d0ff:fe8b:2b5
である。正確には global unicast address と言う。

先頭 8B

2402:6b00:22cd:bf80
はコミュファから割り当てられたもので、契約期間中はこの部分は変化しない注1。また残りの 8B
22c9:d0ff:fe8b:2b5
の部分は ethernet の MAC アドレスを基に自動的に決定される部分で、ハードウェアを変更しない限り変化しない。つまり、正式の IPv6 アドレスは、半固定 IP アドレスと言える。

サーバーの場合には IPv6 アドレスの後半 8B は自由に設定できる。図2でも、後半は簡単な "::6" となっている。記憶しやすいと言うことだけではなく、サーバーが交換された場合にも IPv6 アドレスの変更が不要なように配慮されているのである。

IPv4 アドレスの場合には、アドレス枯渇問題と相まって、プロードバンドルーターは NAT 技術を採用している。NAT によって窮屈な運営を迫られるが、他方では、家庭の中のネットワークを外界から守ってくれる。

IPv6 ではアドレス枯渇問題が存在しない。正式の IPv6 アドレスと述べたのはグローバルなアドレスであり、世界中からアクセス可能である。NAT から解放されて便利な面もあるのだが、ルーターの設定(フィルタリング)をいい加減にすると、たちまち悪いやつらの餌食になる。


注1: この部分は誤りである。コミュアァへの電話確認ではこのように説明されたのであるが、実際には動的IPv6アドレスである。動的IPv6をサーバー用途に使うと動的IPv4以上に厄介である。

リンクローカルアドレス

ネットワークセグメントの中だけでしか使えないアドレス(link local address と言う)が存在する。今の例では

fe80::22c9:d0ff:fe8b:2b5
である注1。このアドレスは
fe80::
で始まり、残りの
22c9:d0ff:fe8b:2b5
は正式の IPv6 アドレスの後半と同じである。


注1: このアドレスの中に含まれる "::" のは連続した零データを表す。ここでは全体が 16B になるように零データを補う。すなわち、この場合には、
fe80:0:0:0:22c9:d0ff:fe8b:2b5
と同じである。

IPv4 のローカルアドレスは LAN の外に出ていけないが、ネットワークセグメントを超えることができる。しかし IPv6 のリンクローカルアドレスはネットワークセグメントを超えることができない。(当然 LAN の外に出ていけない)

グローバルな一時アドレス

"autoconf temporary" と書かれているのがそれである。自動的に構成された一時アドレスの意味で、IPv6 の

2402:6b00:22cd:bf80
に、乱数によって生成された注2
e543:1394:9d6c:fe12
が付加されたアドレスである。このアドレスは Web ブラウザがサーバーと通信する際に使っている。「一時的」と言われるのは、このアドレスの寿命は数時間あるいは数日しかないからである。(システムに依存する)


注1: Windows では ipconfig コマンドでみることができ、「一時 IPv6 アドレス」と表示されている。
注2: ただし、左から7番目のビットは0になっている必要がある(rfc4941)。この例では e516 = 1110010120になっている。MAC アドレスから生成された IPv6 アドレスの場合には、このビットは 1 である。

なぜ、このような奇妙なアドレスが存在し、使われるのか?

世の中には無数の Web サーバーが存在するが、中には悪意を持ったサーバーも少なからず混じっている。彼らからの不正アクセスを防ぐためには、正式の IPv6 アドレスを知られないようにする方が無難なのである。一時アドレスはそのために存在する。


一時アドレスは Microsoft などによって提唱された(rfc4941)。彼らは "privacy extension" と言っているが、この呼称は誤解を招くかもしれない。IPv6 アドレスの左半分はそのままなので、プライバシーは保てない。また一時アドレスが有効な間は、悪意のサーバーからクライアントへの直接攻撃が発生するものと覚悟しなくてはならない。結局、安全な運用のためには、ルーターの適切なフィルタリングが欠かせない。

リンク

ネットワークセグメント

「ネットワークセグメント(network segment)」とは物理的なネットワーク構成を表す概念である注1。その最小の単位がネットワークセグメントである。これはまたイーサーネットのブロードキャストが届く範囲である。
ネットワークセグメントはルーターによって仕切られている。


注1: VLAN では物理的ネットワーク構成が仮想化される。従って「物理的」と言った表現は修正される。

リンク

IPv6 では「リンク(link)」の概念が技術的な基礎となっている。
IPv6 のリンクとはネットワークセグメントでる。
リンク内はルーターによって仕切られていないので、そこに接続されているネットワークデバイスにとって、見通しの良い範囲でもある。

ISP によって家庭に割り当てられる IPv6 アドレスは1つのリンクのアドレスである。従って、家庭内 LAN が複数のネットワークセグメントに分かれていれば、IPv6 アドレスは HGW (Home Gate Way) に一番近いセグメントにしか有効ではないことになる。

サブネット

IPv4 ではセグメントとサブネットの区別が末端の管理者にとって分かりづらいようである。
セグメントは物理的なネットワーク構成を表す概念である。他方、サブネットはルーティングに必要な情報である。ネットワークの運用上、サブネットはセグメントに合わせることが想定されているが注1、IPv4 ではサブネットを自動構成する方法が準備されていなかった。そのためにホストごとにサブネットなどのルーティング情報を設定する必要があった。


注1: IPv4 のサブネットは、論理的には1つのセグメントに複数設定できるが、その場合には DHCP サーバーの運用に問題が発生するであろう。

IPv6 ではルーティング情報の自動構成が目標の一つになっている。その結果、リンクの範囲とサブネットの範囲は一致している。

グローバル・ユニキャスト・アドレス

構造

name number of bits
global routing prefix n
subnet ID 64 - n
interface ID 64
ただし先頭3ビットが 0 のアドレスを除く。

2402:6b00:22cd:bf80:22c9:d0ff:fe8b:2b5
global routing prefix
2402:6b00/32 (n=32)

subnet ID
22cd:bf80/32

interface ID
22c9:d0ff:fe8b:2b5/64

検索キーワードに
2402:6b00:22cd:bf80:22c9:d0ff:fe8b:2b5
を入れて検索すると次が表示される。
[IPネットワークアドレス]        2402:6b00::/32
[ネットワーク名]                COMMUFA
[組織名]                        中部テレコミュニケーション株式会社
[Organization]                  Chubu Telecommunications Co.,Inc.
[管理者連絡窓口]                JP00012001
[技術連絡担当者]                JP00012001
[ネームサーバ]                  dns1.commufa.jp
[ネームサーバ]                  dns2.commufa.jp
[割当年月日]                    2012/06/21
[返却年月日]
[最終更新]                      2012/06/21 21:53:03(JST)
「IPネットワークアドレス」が global routing prefix に相当する。
ここから n=32
2402:6b00:22cd:bf80 から 2402:6b00 を除去した 22cd:bf80 が筆者の家庭に割り当てられたサブネット。
従って、コミミュファは 2**32 (42億) の家庭をサポートできるアドレス空間を手にいれた!

しかし驚くのは早い。NTT 西日本は...

NTT 西日本
V6オプションなし (NGN用)

Network Information: [ネットワーク情報]
[IPネットワークアドレス]        2001:a000::/21
[ネットワーク名]                NTTWEST-IPv6-JPNIC-JP-20041201
[組織名]                        西日本電信電話株式会社
[Organization]                  NIPPON TELEGRAPH AND TELEPHONE WEST CORPORATION
この場合のサブネットは
64-21 = 43
42億の 2048 倍

他に NTT 西日本は

2001:d70::/30
を保有している。(42億の 4 倍)

LIR (local Internet registry)
RIR (regional Internet registry)

An LIR can assign a /64 to /48 to an end site customer network based on their requirements.

家庭では /64 が割り当てられるだろう。大学などのように既に複数の IPv4 アドレスブロックを持っているところは(IPv4 と IPv6 の共存関係を構築しやすいように)必要に応じて /48 (65000 ブロック分) までが割り当てられるだろう。
各家庭では残りの 64 ビットを自由に使える。なぜこれだけ大きなアドレス空間を家庭に与えたか?
重複しない interface ID を構成するために、ここに MAC アドレスを利用したかったから。

コラム: Google のパブリック DNS サーバー

Google のパブリック DNS サーバーの IPv4 アドレスは幾つかあるが、その1つが 8.8.8.8 である。nslookup で調べると、このサーバー名は google-public-dns-a.google.com である。
これの IPv6 アドレスを調べると

2001:4860:4860::8888
であることが分かる。覚えやすいように工夫されている。
このアドレスは複数のサーバーで共有されているのではないかと思える。その場合 IPv4 の場合にはロードバランサを使うが、IPv6 では IPv6 自身の仕組みで実現できる。
IPv6 ではアドレスが重複した場合には(unicast ではなく) anycast アドレスとなる。anycast ではレスポンスの早いものが選ばれる。IPv6 の anycast は DNS サーバーの運営に好都合な仕組みである。

事業者に割り当てた global routing prefix の一覧

この一覧では、誰に割り当てられたかが直接は見えない。
見るためには、このアドレスを基に Whois database にアクセスしなくてはならない。
例えば 2001:240::/32 を調べるには
whois -h whois.nic.ad.jp 2001:240::/32/e
とする。最後の "/e" は whois.nic.ad.jp の独自仕様で、英語モードを表す。
(default は JIS らしい)

割り当てブロックと事業者との関係が直接わかるように情報を公開してくれるとありがたい。
この関係は、次のアドレスで見ることができる。しかし情報が古い...

仕方がないから、こちらでやりました注1。→ http:addrlist/ipv6tbl.txt
ただし、これは JPNIC から割当の受けているブロックである。(2015/09/14 現在)
フィールドの区切りは " | " で、各フィールドの意味は
  1. Network Number
  2. Last Update
  3. Organization
である。

APNIC によって日本の組織に割り当てられた最新のブロック情報が欲しいのだが、どこにあるかがわからない。例えば、先に挙げた tomocha.net には 2001:200::/32 (WIDE Project) が載っているのだが、ここに行き着くルートが分からない。

APNIC による割り当てブロックは次の URL から手に入る。

また、APNIC による WHOIS サービスは

学術情報ネットワーク(Scinet)に関しては

ここから大学の様子がわかる。


注1: IPv4 についても同様な表を作ることが可能である。
必要な情報は
と whois database から手に入る。

IPv6 用語

以上、平易さを考慮して IPv4 で馴染みのある言葉で説明してきたが、IPv6 のアドレス構成の考え方は IPv4 とは全く異なるので、正しくは IPv6 の言葉を使うべきであろう。

IPv6 アドレスはネットワーク・インターフェースに付けられる
IPv4 アドレスはホストに付けられると説明されていた注1

IPv6 Addresses of all types are assigned to interfaces, not nodes.
Since each interface belongs to a single node, any of that node's interfaces' unicast addresses may be used as an identifier for the node.

rfc1884


注1: 実際には、もちろんネットワーク・インターフェースを通じてアドレスが付けられる。
そのため、unix の場合には ifconfig (interface configure) コマンドが使われる。
しかし、古い rfc を読むと、ホストに付けられると考えられていたようだ。

例えば rfc760 (1980), rfc791 (1981) では

sources and destinations are hosts identified by fixed length addresses.
と説明されている。これらの rfc では、概念がまだ整理されていない(抽象化されていない)。語 "node" も使われていない時代であった。

なぜホストではダメか?
IP アドレスがホストに付けられていれば、ルーティングの説明が苦しくなる。

適切な名称が欲しい
前半 64bit
後半 64bit

基本用語
link
node
network prefix
interface ID
EUI-64 format
modified EUI-64 format
CIDR (Classless Inter-Domain Routing)表記

cast

scope


注意: site-local は廃止すべしとの意見がある(rfc3879)。代わりに Unique Local IPv6 Unicast Addresses (rfc4193) が提唱されている。

特殊な Prefix

prefix name rfc status
fe80::/10 link local unicast address rfc4291
fec0::/10 site local address rfc1884 depricated by rfc3879
fc00::/7 uniq local address rfc4193
ff00::/8 multicast address rfc4291
::1/128 loopback address rfc4291
::/128 unspecified address rfc4291
::/96 IPv4-compatible IPv6 address rfc3513 depricated by rfc4291
::ffff:0:0/96 IPv4-mapped IPv6 address rfc3513

link local unicast address

name number of bits value
prefix 10 1111111010
注1 54 all zero
interface ID 64
注1: rfc42を見ても、この部分は名無しである。

リンク内(ネットワークセグメント内)で有効なアドレス。
家庭程度のネットワーク(シングルセグメント)であれば、これが IPv4 のプライベートアドレスに相当すると考えてよいであろう。

uniq local address

name number of bits value
prefix 7 1111110
L flag 1 1
global ID 40
subnet ID 16
interface ID 64

IPv4 のプライベートアドレスに(ほぼ)同じ。
global ID は乱数で決める注1
LAN 内に複数のネットワークセグメントがあれば、link local unicast ではなく、uniq local address を使うことになる。
site local が廃止されて、代わりに uniq local が定められた(2005年)。
NTT の NGN は何故これを使わなかったのだろうか?

site local の問題点については rfc3879 に詳しい。


注1: 2つの組織が合体した時に、両組織が同じ global ID で LAN が組まれていると面倒である。そのために、事前に global ID の衝突を防ぐ意味であろう。

multicast address

rfc3306 と rfc4291 に詳しく解説されている。
なお rfc4291 と rfc3306 では group ID の定義が異なる。
(rfc4291 では reserved, plen, network prefix を含めて group ID と書いている)
ここでは rfc3306 に沿って次のように整理する。(この方が分かりやすい)

name number of bits value
prefix 8 11111111
flags 4 0RPT
scope 4
reserved 8 00000000
plen 8 global routing prefix length
network prefix 64
group ID 32

flags

flag rfc meaning
O rfc3306 undefined
R rfc3956 Rendezvous Point
P rfc3306 based on network prefix or not
T rfc4291 permanent/transient

scope

scope は rfc3306 で出てくる。定義は rfc4291 で説明され、さらに rfc7346 で修正されている。

scope name reference
0 reserved [rfc4291], rfc7346
1 interface-local scope [rfc4291], rfc7346
2 link-local scope [rfc4291], rfc7346
3 realm-local scope [rfc4291], rfc7346
4 admin-local scope [rfc4291], rfc7346
5 site-local scope [rfc4291], rfc7346
6 unassigned
7 unassigned
8 organization-local scope [rfc4291], rfc7346
9 unassigned
a unassigned
b unassigned
c unassigned
d unassigned
e global scope [rfc4291], rfc7346
f reserved [rfc4291], rfc7346
将来変更があるだろう。IANA が最新情報を提供している。

plen

global routing prefix length
P=1 で有効
subnet size を決めている:
"network prefix" = "global routing prefix" + "subnet"
64 より小さいので、2ビットが余る。将来、何かに使われるのだろう。

Interface ID

Interface ID は重複が許される。重複した場合には anycast address と見なされる注1
重複を許すのは特殊な用途であり(例えば複数の DNS server を運用する場合)、通常は重複が発生しないように注意しなくてはならない。


注1: 動作の仕組みから言えば、unicast は anycast の特殊ケースであるとも言える。

MAC アドレス

IEEE 802 address

現在のところ 6B で構成される。
MAC アドレスの枯渇対策として新しい形式が 2014/01/01 から開始された。→ EUI-48
ここでは EUI-48 以前の形式を取り上げる。

MAC アドレスの構成

前半 3B IEEE で管理
後半 3B 企業が管理
出荷されているものについて、重複を許さない

前半部分

CID (Company ID)	出荷できない(会社内部の独自のものを意味する)
OUI (Organizationally Unique Identifier)	公式のもの
最初の octet を見る。左から
7番目 X-bit	1:CID; 0:OUI
8番目 M-bit	0; (1:reserved)
名称は文献によって異なる。この名称は IEEE のもの[1]。
従って出荷されている MAC アドレスの先頭 7ビットと8ビットは共に0のはず。

IEEE 802 standards 以前の古い MAC アドレスでは、このルールが破られているものあり[1]。(ただし極く少数)

後半 3B は Extension と呼ばれる。

from Wikipedia "MAC address"

実際に出荷される MAC アドレスは、先頭から 7 bit 目(図の b2)は 0 である。

ネットで見かけた面白い記事:

文献
[1] IEEE: Guidelines for Use Organizationally Unique Identifier (OUI) and Company ID (CID)
https://standards.ieee.org/develop/regauth/tut/eui.pdf

EUI-48

EUI-48 (48-bit Extended Uniq Identifier)

構造

EUI-48 = OUI + Extension

IEEE から割り当てられる OUI block には 3 種ある (2014/01/01 以降)

name size name OUI bits Extension bits
MA-L large 24 24
MA-M medium 28 20
MA-S small 36 12

文献
[2] IEEE: Guidelines for 48-Bit Global Identifier (EUI-48)
https://standards.ieee.org/develop/regauth/tut/eui48.pdf

MAC-48

用語 "MAC-48" は obsolete。"EUI-48" を使うべし

The term MAC-48 identifier, which is now obsolete, was used in the past. The MAC-48 was similar to the EUI-48, i.e., it was a concatenation of a 24-bit OUI assigned by the IEEE RA and a 24-bit extension identifier assigned by the organization with that OUI assignment.
However, it was used to address hardware interfaces within existing 802-based
networking applications. The term EUI-48 was historically used to identify a design instance, as opposed to a hardware interface; examples include software interface standards (such as VGA), the model number for a product, and the form/function of vendor-specific content. The subtle difference between MAC-48 and EUI-48 was not well understood, so the term EUI-48 is now used for both uses, and the term MAC-48 identifier is now obsolete.

文献[1]

歴史的には MAC-48 は hardware interfaces (いわゆる MAC アドレス)に使われ、
EUI-48 は software interface に使われていた。
この利用場面以外に
MAC-48 と EUI-48 との間に、それと言った違いはないらしい。→ EUI-48 に統一

EUI-64

EUI-64 (64-bit Extended Uniq Identifier)

文献[1]によると、歴史的には

MAC-48  →  EUI-64	(FFFF padding)
EUI-48  →  EUI-64	(FFFE padding)
としてマップされてきた。しかし現在では MAC-48 は廃止され(EUI-48 に統一され)、その結果
FFFF を挿入する方式も廃止された。

When the historical EUI-48 and MAC-48 were mapped to an EUI-64, they concatenated
different values between the OUI (first three octets) and the extension of that OUI. The mapping specified the hexadecimal value FF-FE be inserted for EUI-48, and the value FFFF be used for MAC-48.

文献[3]

[3] IEEE: Guidelines for 64-bit Global Identifier (EUI-64)
http://standards.ieee.org/develop/regauth/tut/eui64.pdf

Modified EUI-64

EUI-64 は IPv6 の interface ID に適用されるにあたって修正を受けた。→ Modified EUI-64
修正内容: "u" bit を 1 にする。

Modified EUI-64 format interface identifiers are formed by inverting the "u" bit (universal/local bit in IEEE EUI-64 terminology) when forming the interface identifier from IEEE EUI-64 identifiers. In the resulting Modified EUI-64 format, the "u" bit is set to one (1) to indicate universal scope, and it is set to zero (0) to indicate local scope.

rfc4291 文献[4]

ここで言う "u" bit とは文献[1]での "X" bit のこと。
Modified EUI-64 format では、(反転の結果)ここ(u-bit)を 1 にする。

48bits MAC アドレスから fffe を挿入して EUI-64 を構成する

EUI-64 から u bit を反転して Modified EUI-64 を構成する

なぜ u-bit を反転したのか?

The motivation for inverting the "u" bit when forming an interface identifier is to make it easy for system administrators to hand configure non-global identifiers when hardware tokens are not available. This is expected to be the case for serial links and tunnel end-points, for example. The alternative would have been for these to be of the form 0200:0:0:1, 0200:0:0:2, etc., instead of the much simpler 0:0:0:1, 0:0:0:2, etc.

rfc4291

反転の結果、u-bit は MAC アドレスから生成されたことの指標となっている。
他方、管理者が手作業で構成した IPv6 アドレスは(習慣的に) u-bit は 0 である。(その方が簡単だから)

[4] RFC4291: IP Version 6 Addressing Architecture
https://tools.ietf.org/html/rfc4291

Modified EUI-64 format interface identifiers

interface ID の自動構成の方法として Modified EUI-64 を利用する(rfc4291)。

rfc7136 には "u" bit 及び "g" bit を巡る rfc の混乱ぶりが指摘されている。実際問題として "u" bit や "g" bit はどれほど重要なのか?

Windows Way: Randomly Generated Interface Identifier

Computers running Windows Vista® or Windows Server® 2008 by default generate random interface IDs for non-temporary autoconfigured IPv6 addresses, including public and link-local addresses, rather than EUI-64-based interface IDs. A public IPv6 address is a global address that is registered in DNS and is typically used by server applications for incoming connections, such as a Web server.

universal bit をどう処理したか?
重複チェックは(多分) OS が行っている。

temporary addresses

random bits
except universal bit (must be 0)

life time

A randomized interface identifier is created as follows:
...
3. Take the leftmost 64-bits of the MD5 digest and set bit 6 (the leftmost bit is numbered 0) to zero. This creates an interface identifier with the universal/local bit indicating local significance only.

ref4941

[5] RFC4941: Privacy Extensions for Stateless Address Autoconfiguration in IPv6
https://tools.ietf.org/html/rfc4941

これを読むと、
interface ID は
universal bit が
1 の場合: created from MAC (modified EUI-64)
0 の場合: others (他の bit は意味がない)
のように聞こえる

しかし、temporal address であることの印はどこにある?
interface ID の中にはもはや印は存在しない。(random を許すから)
OS は区別が付くだろう。自分が生成したのだから... しかしルーターなどには無理だろう。


RFC は通信に必要なプロトコルを語れば済むのに、この RFC は、乱数を生成するアイデアを述べている。
RFC として必要なのは IID 64 bits の意味である。

重複チェックは(多分) OS が行っている。

Microsoft は IPv6 interface ID に関して分かりやすく解説している。
その中には、Modified EUI-64 format 及び temporary addresses の解説が含まれる。

RFC7136

February 2014

"u" bit も "g" bit も実際には特別の意味を持っていない。

A common operational practice for well-known servers is to manually assign a small number as the IID, in which case "u" and "g" are both zero.
...
Thus, we can conclude that the value of the "u" bit in IIDs has no particular meaning. In the case of an IID created from a MAC address according to RFC 4291, its value is determined by the MAC address, but that is all.

An IPv6 IID should not be created from a MAC group address, so the "g" bit will normally be zero. But, this value also has no particular meaning. Additionally, the "u" and the "g" bits are both meaningless in the format of an IPv6 multicast group ID [RFC3306] [RFC3307].

rfc7136

注釈: IID (interface ID)

結論として

RFC4291の記述:

For all unicast addresses, except those that start with the binary value 000, Interface IDs are required to be 64 bits long and to be constructed in Modified EUI-64 format.
を次のように変更する。
For all unicast addresses, except those that start with the binary value 000, Interface IDs are required to be 64 bits long. If derived from an IEEE MAC-layer address, they must be constructed in Modified EUI-64 format.

またRFC4291の次の記述:

The use of the universal/local bit in the Modified EUI-64 format identifier is to allow development of future technology that can take advantage of interface identifiers with universal scope.
を廃止する。

[6] Significance of IPv6 Interface Identifiers
https://tools.ietf.org/html/rfc7136

考察

IPv6 アドレスはインターフェースに割り当てる。その意味で "interface ID" は適切な呼称である。

IID(interface ID) はリンクの中(=セグメントの中=イーサーネットのブロードキャストの範囲)で重複が無ければ良いはず注1。LAN の中では subnet に分けられ、IPv6 では subnet ID が異なるので、全体としての IPv6 アドレスの重複は防げている。

IPv6 では IID の自動構成が目標の一つになっている。異なる OS の混在環境の下で IID の重複を避ける良い方法は確かに MAC アドレスを利用することである。その構成法を RFC で定式化しておくことは悪くはない。その一つが modified EUI-64 である。(言っていることが細かすぎるきらいはあるが...)

乱数で決める Microsoft 流の方法は重複の危険性を伴うが、IPv6 は重複を自動的に判定する仕組みを持っているので、(しかも重複の可能性は極めて小さいので)実際上の問題はないはずである。


注1: IID の重複は同一リンクの中でも許される。その場合には anycast address として扱われる。anycast address はかなり特殊であり、管理者が手動で設定すべきアドレスである。その際、管理者は anycast であることが分かるような目印をアドレスの中に付けるのが良いのだろう。

Appendix

WHOIS dadabase

A WHOIS server listens on TCP port 43 for requests from WHOIS
clients. The WHOIS client makes a text request to the WHOIS server,
then the WHOIS server replies with text content. All requests are
terminated with ASCII CR and then ASCII LF.

TCP port 43 にリクエストを送るが、リクエストとして何が許されるかホスト次第のようだ。

ドメイン名で検索

-bash$ whois aichi-u.ac.jp
[ JPRS database provides information on network administration. Its use is    ]
[ restricted to network administration purposes. For further information,     ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e'     ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'.                 ]

Domain Information: [ドメイン情報]
a. [ドメイン名]                 AICHI-U.AC.JP
e. [そしきめい]                 あいちだいがく
f. [組織名]                     愛知大学
g. [Organization]               Aichi University
k. [組織種別]                   大学
l. [Organization Type]          University
m. [登録担当者]                 YM26826JP
n. [技術連絡担当者]             FM2826JP
n. [技術連絡担当者]             GS3718JP
p. [ネームサーバ]               dns-b.iij.ad.jp
p. [ネームサーバ]               dns-c.iij.ad.jp
s. [署名鍵]
[状態]                          Connected (2016/07/31)
[登録年月日]                    1993/07/23
[接続年月日]                    1994/01/13
[最終更新]                      2015/08/01 01:05:15 (JST)

-bash$

Mac の whois の default host は whois.jprs.jp
この場合文字コードは UTF8

IP アドレスで検索

-bash$ whois -h whois.nic.ad.jp 202.250.160.40/e
[ JPNIC database provides information regarding IP address and ASN. Its use   ]
[ is restricted to network administration purposes. For further information,  ]
[ use 'whois -h whois.nic.ad.jp help'. To only display English output,        ]
[ add '/e' at the end of command, e.g. 'whois -h whois.nic.ad.jp xxx/e'.      ]

Network Information:
a. [Network Number]             202.250.160.0/20
b. [Network Name]               ACE
g. [Organization]               Aichi University
m. [Administrative Contact]     JP00044810
n. [Technical Contact]          JP00044810
p. [Nameserver]                 aucc.aichi-u.ac.jp
p. [Nameserver]                 dns-x.sinet.ad.jp
[Assigned Date]                 1994/06/23
[Return Date]
[Last Update]                   2014/12/23 10:59:05(JST)

Less Specific Info.
----------
No match!!

More Specific Info.
----------
No match!!
-bash$

host として whois.nic.ad.jp を指定すると文字コードは JIS

telnet で代用

-bash$ telnet whois.nic.ad.jp 43
Trying 2001:dc2:1000:6000::43...
Connected to whois.nic.ad.jp.
Escape character is '^]'.
202.250.160.40/e
[ JPNIC database provides information regarding IP address and ASN. Its use   ]
[ is restricted to network administration purposes. For further information,  ]
[ use 'whois -h whois.nic.ad.jp help'. To only display English output,        ]
[ add '/e' at the end of command, e.g. 'whois -h whois.nic.ad.jp xxx/e'.      ]

Network Information:
a. [Network Number]             202.250.160.0/20
b. [Network Name]               ACE
g. [Organization]               Aichi University
m. [Administrative Contact]     JP00044810
n. [Technical Contact]          JP00044810
p. [Nameserver]                 aucc.aichi-u.ac.jp
p. [Nameserver]                 dns-x.sinet.ad.jp
[Assigned Date]                 1994/06/23
[Return Date]
[Last Update]                   2014/12/23 10:59:05(JST)

Less Specific Info.
----------
No match!!

More Specific Info.
----------
No match!!
Connection closed by foreign host.
-bash$

What is my Global IP?

2016/02/04

自宅に設置したサーバーを動的IPで運用している場合には、WAN側のIPアドレスの変化を知る必要に迫られる。そのためには現在のWAN側のIPアドレスを知る必要がある。コミュファに問い合わせたら、IPv6 も動的だという。というわけで、筆者は動的IPv6で運用せざるを得ない。それで自宅のLANからどうして現在のWAN側のIPv6アドレスがコマンドで分かるのか? ここで3つの方法を紹介する。

サービスサイトの助けを借りる

ブラウザを通じて教えてくれるサイトはいくつもある。例えば

などである。ipv6-test に関しては IPv6 アドレスと IPv4 アドレスを教えてくれる。

しかし、ブラウザから見えるページは綺麗に飾られ、初心者は喜ぶだろうが、決して便利ではない。手作業が要求されるからである。変化を知り自動的に次の処理に移るためには、手作業を介さない方法が必要になる。コマンドでWAN側のIPアドレスを知りたい場合には

などがあるが、いずれも IPv6 には対応していない。そもそも、ここに挙げたサーバは IPv6 アドレスを持っていないのである。非常に残念なことであるが、現時点ではIPv6アドレスを保有するメリットは皆無である。

IPv6アドレスでの接続を確認したい場合がある。ついでにIPアドレスが分かればもっと良い。次のは筆者のサーバーによるサービスである。

-bash$ telnet grid.nyx.link 8006
Trying 2402:6b00:4040:b600::9...
Connected to grid.nyx.link.
Escape character is '^]'.
2402:6b00:4040:b600::9!8006
2402:6b00:4040:b600:22c9:d0ff:fe8b:2b5!50022
Connection closed by foreign host.
-bash$
IPアドレスとポート番号が "!" で区切られている。
しかし筆者のは動的IPアドレスである。接続しなかった場合には、問題の所在が確定しない。クライアント側か、それともサーバー側か? 静的アドレスでサービスしてくれるとこがあれば有難いが、筆者は知らない。

ところで grid.nyx.link は筆者の自宅のLAN内にあるので、筆者自身は自宅からはこのサービスのメリットを享受できないのである。

筆者が契約しているコミュファは IPv6 アドレスに対応しているが、提供されているのは静的ではなく動的 IPv6 アドレスである注1。コミュファに問い合わせたところ、静的 IPv6 アドレスをサービスする予定は無いとのことである。ホームページを見る限り、コミュファはIPv6対応を自慢しているが、名ばかりの対応であって、何のメリットも無い。2種類のIPアドレス管理は、面倒なだけである。IPv6アドレスの場合にはもっと厄介である。何しろIPv6アドレスが変化するたびに、内部設定を変更しなくてはならない。「総務省が煩いから... どうせ総務省のHPだってIPv4ではないか... 静的にしろとは言われてないのだし...」ということか?


注1: 動的であろうと静的であろうと常時接続の現代において必要なIPアドレス数は変わらないからコミュファが動的IPでサービスを提供する理由はアドレス不足ではない。本当の理由は管理に要するコストではないかと思う。コミュファがWAN側で使っているDHCPサーバーがHWGのWAN側のMACアドレスを基にしてユニークなIPアドレスを自動的に割り振ってくれれば管理コストは発生しない。そのようなDHCPサーバーは工夫すれば設計可能だと思う。作ってくれないかな...

HGW に直接アクセスする

WAN 側のアドレスを最もよく知っているのは HGW(home gate way = 家庭用ルーター)である。ブラウザを通じて設定が見える。またブラウザからの利用を前提とした設計がされている。筆者の Aterm WH832A の場合には、
トップページ > 情報 > 現在の状態
へと進み「IPv6状態」を見ればよい。
しかしコマンドでも何とか WAN 側のアドレスを調べることができる。

クライアントが Mac で、HGW が Aterm WH382A の場合には次のやればよい。

wget http://admin:XXX@192.168.0.1/index.cgi/info_main
ここに XXX はパスワードである注1。これでWAN側IPアドレスが載っているページがダウンロードされる注2。ファイル名は info_main である。文字コードは ujis であって utf-8 ではない。(今時ねー)

index.cgi/info_main の部分は HGW の型番に依存する。前もってブラウザからWAN側IPアドレスが載っているページにアクセスして URL を調べておく。また 192.168.0.1 の部分は HGW の設定に依存している。

文字コードの変換には(Macの場合には)iconvが使える。つまり

iconv -f EUC-JISX0213 info_main > info.txt
で、utf-8 に変換したページ info.txt が生成される。この中から目的の IP アドレスを探し出せば問題解決だが、
grep 2402:6b00: info.txt
で次の結果が得られる。(2402:6b00: はコミュファに割り当てられた IPv6 アドレスセットである注3
<td class='small_item_td2' colspan='2'>2402:6b00:4040:b600:1266:82ff:fe0c:ed18/64</td>
<td class='small_item_td2' colspan='2'>2402:6b00:f25::105</td>
<td class='small_item_td2' colspan='2'>2402:6b00:f01::232</td>
ここからさらに 2402:6b00:4040:b600:1266:82ff:fe0c:ed18/64 だけを選ぶには、
grep -E 2402:6b00:[^:]+:[^:]+: info.txt| sed -E 's/<[^>]+>//g'
を実行すればよい。

IPv4 の場合には

grep -E 115.36. info.txt| sed -E 's/<[^>]+>//g'
とすればよい。ここに 115.36. はコミュファに割り当てられた IPv4 アドレスで、HGW から WAN側のIPv4アドレス(筆者の場合には 115.36.29.217 であった)を手に入れて
whois -h whois.nic.ad.jp 115.36.29.217/e
を実行すれば、コミュファの割り当て範囲が得られる。結果は 115.36.0.0/19 であるが、結果は 115.36.0.0/16 の中に含まれているので、あまり厳密なことを考えなくてもよいであろう。


注1: admin:XXX@ の部分は wget の独自仕様らしい。どこかのサイトで紹介されていたのであるが... 珍奇な仕様である。認証部分はオプションで与えるのがマトモな設計感覚である。https://hydrocul.github.io/wiki/commands/ には wget の解説があり、それによると Basic 認証はコマンドオプションを使って
wget --http-user=user --http-passwd=password http://www.example.com/
のように書く。なお curl の場合には
curl --user user:password http://www.example.com/
である。curl の方が設計センスが良い。(僕だったら --user ではなく、単に -a だが...)
注2: ダウンロードできる場合とできない場合がある。どうやら NEC はコマンドで中を見られることを嫌がっているようで、何がしかの保護がかかっている可能性がある。
注3: http:/ipv6/addrlist/ipv6tbl.txt

ifconfig を利用する

IPv6 の場合にはRA(router advertise)の仕組みによって、(DHCPに頼らずとも)インターフェースにIPv6アドレスが割り当てられる。その内容は(unixの場合)
ifconfig
を実行すればわかる。筆者のMacBookの場合には次のようになっている。(関係部分だけ)
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether 20:c9:d0:8b:02:b5
	inet6 fe80::22c9:d0ff:fe8b:2b5%en0 prefixlen 64 scopeid 0x4
	inet 192.168.0.249 netmask 0xffffff00 broadcast 192.168.0.255
	inet6 2402:6b00:4040:b600:22c9:d0ff:fe8b:2b5 prefixlen 64 autoconf
	inet6 2402:6b00:4040:b600:49dc:fc8e:253:8f34 prefixlen 64 autoconf temporary
	nd6 options=1<PERFORMNUD>
	media: autoselect
	status: active
ここからWAN側のグローバルプレフィックス 2402:6b00:4040:b600: が得られる。

Plan9 の場合には

2018/06/24

Plan9(詳しくは9Front) は筆者が信頼している唯一のOSである。現在のIP(IPv4/IPv6)の割当状況は

cat /net/ipselftab
あるいは
cat /net/iproute
で見ることができる。

なお、今回この記事を追加したのは、先日の停電の後、IPアドレス(IPv4/IPv6)が変化したのと、OSのバージョンアップでIPv6の設定方法の変更があって、再点検の必要に迫られたからである。