EUI-64によるIPv6アドレス生成2020/7/21-1ユニキャストおよびエニーキャストのIPv6アドレスの下位ビットには「インターフェース識別子」という名称がついています。インターフェースを識別するという名前です。問題は、どの範囲で、どう識別するのか、です。これ、実はインターネット全体です。インターフェース識別子は、本来はサブネット内で一意であれば良いはずのものですが、IPv6の仕様として、インターフェース識別子をインターネット全体で一意にするといった要素も含まれていました。このことから、インターフェース識別子という名前は、インターネット全体を範囲としてインターフェースを識別することも視野に入っていた名称であることが推測されます。IPv6の基本的な仕様では、IPv6アドレス自動生成で、MACアドレスなどをもとにインターフェース識別子を生成する方法が必須とされていました。MACアドレスは、原則として一意性があるので、それから自動生成すればインターフェース識別子も一意性があるものになるという設計でした。MACアドレスなどを元にしたIPv6アドレスの自動生成は、セキュリティとプライバシの問題があるため、いまでは非推奨となっています。IPv6アドレスを単なるインターネットプロトコルでの通信のための識別子としてだけではなく、下位ビットを使ってインターフェースまでグローバルに識別できるような仕組みにしたら、識別できることそのものが問題でした、みたいな、そんな感じなのかも知れません。EUI-64形式と、それが非推奨になった理由を紹介します。いまでは非推奨ですが、IPv6に関して知るという視点では、その仕組みと、何がどう問題だったのかは、非常に大事なポイントです。非推奨は禁止ではなく、いまでも使われることがあるという意味でも知っておいて損はない内容だと思います。この記事は、次の流れで解説します。8064)こんな感じで、多少マニアックな内容になっているかも知れません。IID)まず最初に、インターフェース識別子そのものに関して紹介します。IPv6アドレスは、ネットワークを示す部分とインターフェースを示す部分とに分けられます。この区分は、IPv4とIPv6とで異なります。IPv4では、IPアドレスはネットワーク部とホスト部によって構成されます。Identifier)によって構成されます。この違いは、名称の問題だけのようにも思えますが、IPv4とIPv6の大きな違いを示しています。1122では、IPv4アドレスの構成要素を「Network-number」と「Host-number」としています。IPv4アドレスは、機器である「ホスト」そのものを示しているのです。ルータ以外の末端ノードは基本的に1つのネットワークインターフェースだけを持ち、そこで必要なIPv4アドレスも1つだけ、という前提が垣間見えます。IPv6では、IPv6アドレスのインターフェース識別子は、ホストではなくインターフェースを識別するという名前になっています。一部例外があるものの、一般的に、ユニキャストおよびエニーキャストのIPv6アドレスの上位64ビットがサブネットプレフィックスで、下位64ビットがインターフェース識別子です。インターフェース識別子は、略してIIDと表現されることもあります。このインターフェース識別子ですが、かつて、IPv6アドレスの自動生成を行うとき、ネットワークインターフェースのMACアドレスを利用して生成するという仕様が必須とされていました。初期のIPv6の仕様では、IPv6アドレスの自動生成を行うときに、上位64ビットはルータからのRAを利用して取得し、下位64ビットは原則として一意性があるMACアドレスを使えば自動生成できるよね、というものです。ここでもう一度、IPv6アドレスの下位64ビット部分の名前を思い出してみましょう。インターフェース識別子です。ここで大きなポイントとなるのが、識別子が、どのレベルで何を識別するものなのか、という点です。IPv6アドレスという観点で見たとき、サブネットプレフィックスが同じサブネット内で、インターフェース識別子が被らなければOKという識別、なのか、それとも、インターネット全体で見て識別できる一意性が想定されているのかという話です。昔のRFCを追っていくと、インターフェース識別子をインターネット全体で一意にすることが想定されていることがわかります。インターフェースをインターネット全体で一意に識別してしまうような仕様だったわけです。EUI-64フォーマットの前に、まずは、IEEEによるEUI-48とEUI-64について少し紹介します。Identifierという名前です。拡張された一意性のある識別子、と直訳することもできる名前です。IEEEが公開しているガイドラインでは、EUIは、原則として一意性がある識別子であると書かれています。identification.(訳)EUIは世界で一意となることが意図されており、一意な識別が要求されるハードウェアデバイスインスタンスもしくはその他オブジェクトと結び付けられている。このように、EUIは、世界で一意となる、すなわち、グローバルにユニークとなる識別子であることが意図されています。IEEEのガイドラインでは、EUIがMACアドレスとして使われることもある、と書かれています。この記事でも、ネットワークインターフェースに設定されているEUIをMACアドレスと表現しています。イーサネットで使われているMACアドレスは48ビットで、IPv6アドレスの自動生成で使われることが多いのも、この48ビットのEUI-48です。Identifier)と呼ばれる製造者識別子を表します。OUIは、製造者がIEEEにお金を支払って登録するものであり、一意性が確保されています。EUI-48アドレスの下位24ビットは、各製造者が独自に割り当てられる機器識別子です。この記事では、OUIに含まれるuビットと、gビットが重要なポイントになります。EUI-48では先頭オクテットのうち0x02のビットをuniversal/localビットと定義されています。このuniversal/localビットは、uビットとも呼ばれていますが、このビットが0の場合はIEEEによって管理されたユニバーサルなアドレスであることを意味します。逆に、そのビットが1である場合はローカルな管理者によって独自に付けられたアドレスであることを意味します。EUI-48では先頭オクテットのうち0x01のビットをindividual/groupと定義されています。このビットが1であれば、それはリンク層におけるマルチキャストアドレスになります。EUIでは、48ビットのEUI-48をもとに、64ビットのEUI-64を生成する方法も定義されています。EUI-48の先頭24ビットであるOUI部分と、後半24ビットの機器識別子部分の間に0xfffeという16ビットを挿入することで、EUI-48からEUI-64が生成できます。いうEUI-64になります。この方法は、IPv6アドレスの自動生成でも利用されています。以上が、EUIの大まかな紹介です。EUIは原則として一意性がある識別子という定義ですが、実態としては一意であるとは限らないという話があります。この前、作った動画で解説している、MACアドレスが一意であるとは限らないという話は、ここら辺と関係してきます。MACアドレスが一意となるとは限らないという話は、IPv6アドレス自動生成でMACアドレスを利用する仕組みに関する議論と関係してきます。EUI-64は、原則として一意性があることが意図された識別子であり、IPv6の仕様が作られた当初も、一意性がある識別子であることを前提に仕様が作られていると思われるという点がポイントになります。EUI-64フォーマットについて説明します。EUI-64フォーマットは、IPv6アドレスのインターフェース識別子で使うために作られたフォーマットです。EUI-64というフォーマットは、IEEEによるEUI-64のuniversal/local部分のビットを反転させたものです。4291では、次のように書かれています。EUI-64フォーマットによって構成される必要がある。EUI-64フォーマットであることが必須とされていたわけです。EUI-64フォーマットによるインターフェース識別子は、48ビットのMACアドレスから自動生成します。EUI-64フォーマットのインターフェース識別子を生成するには、この図のようにOUI部分のuniversal/localビットを反転させたうえで、OUI部分と機器識別子部分の間に0xfffeという16ビットを挿入します。OUI部分と機器識別子部分の間に0xfffeという16ビットを挿入する部分は、EUI-48からEUI-64を生成する方法と同じです。違うのは、OUIのuniversal/localビットを反転させているという部分です。IEEEによるOUIのuniversal/localビットは、0がセットされた場合にグローバルに一意な値であることを示し、1がセットされた場合にはローカルな値であることを示しています。EUI-64では、グローバルに一意な値である場合にはuniversal/localビットが0なので、64ビットのうち、最下位ビットのみが1となるような値は、グローバルに一意という意味があることになってしまいます。EUI-64ではなく、通常のEUI-64を採用していた場合、インターフェース識別子に含まれるuビットが0となるので、64ビットのうち最下位ビットのみが1というインターフェース識別子がグローバルに一意であるものを示すことになってしまうわけです。手動設定での2001:db8::1というユニキャストIPv6アドレスの下位64ビットは世界で一意となるようなユニークな値ではありません。EUI-64では、uビットが0の場合はlocalで、1の場合がuniversalという風に、意味を反転させたのです。ビットの示す値の内容を反転させることで、2001:db8::1というIPv6アドレスでのインターフェース識別子におけるuビットの整合性を実現したわけです。EUI-64フォーマットに準じているという体裁が保たれるわけです。7136によって、現在は割とどうでも良い話になっています。そもそも、もともと、あまり意味がある仕様ではなかったという考え方もあるわけです。EUI-64という仕組みそのものは、昔はIPv6アドレスの要素として、必須とされる仕様だったわけです。EUI-64、それを利用したインターフェース識別子の生成が非推奨になったことなどを紹介しました。ここで、もう一度、インターフェース識別子という名称について、いくつかのRFCに書かれている内容をもとに考察してみましょう。4291を見てみましょう。ユニキャストIPv6アドレスにおけるインターフェース識別子は、リンクにおけるインターフェースを識別するために利用される。それに続けて、さらに次のように書かれています。それらは、もっと広いスコープで一意となる場合もある。これ、直接は表現していませんが、インターフェース識別子がグローバルにユニークとなる場合もあると解釈することもできる文章です。インターフェース識別子が、インターネット全体においてインターフェースを識別することを意識していると推測できる文章は、他のRFCにもあります。5453では、non-uniqueなインターフェース識別子について言及しています。EUI-64によるインターフェース識別子は、インターネット全体でuniqueであることが期待されている場合もあると読めるわけです。Address、などがあげられる。Non-uniqueなインターフェース識別子は、DHCPv6のような管理されたアドレス割り当て機構によって、割り振られることもある。tokenを伴わないインターフェース識別子という表現もあります。tokenによって生成されたインターフェース識別子が、インーターネット全体というスコープで一意となることが意識されていると解釈できます。4941には、次のようにあります。IPv6アドレス体系は、それが容易に実現できる場合には、インターフェース識別子がグローバルに一意となることを保証しようとする「インターフェース識別子がグローバルに一意となることを保証」と書いてあるわけです。要は、ユニキャストIPv6アドレス全体である128ビットがインターネット全体で一意となるだけではなく、下位64ビットのインターフェース識別子の部分もインターネット全体で一意となることを意図した仕様であったことがわかります。その文章に続いて、次のような文章が書かれています。temporaryアドレスの利用が広く普及することにより、インターネットトラフィックのかなりの割合が、アドレスのインターフェース識別子部分が、グローバルに一意ではないものになる可能性がある。その結果として、このドキュメントが示すアルゴリズムを利用することが、将来インターフェース識別子部分のグローバルな一意性が求められるときに、問題になる可能性がある。このように、「インターフェース識別子が、おそらくグローバルに一意となるように保証する」という表現があります。その用途としては、グローバルな一意性を必要とする将来の仕組みを想定して、そのようになっていることもわかります。IID」という表現があり、やはり、インターネット全体をスコープとしてインターフェース識別子が一意となることが想定されていてことがわかります。以上のことから、インターフェース識別子がインターネット全体のなかで一意性があるように識別できることを意図した設計であったことがわかります。IPv6アドレスの下位ビットから、インターフェースを識別できることが意識された設計だったわけです。「インターフェース識別子」という名称は、インターネット全体のなかで一意性があるように識別できるようにすることを想定した名称だったのではないかと、私は推測しています。インターフェース識別子をグローバルに一意とする設計であったことと、一意性を意識して「インターフェース識別子」という名称にしのかということは別の話です。いった意図で「インターフェース識別子」という名称になったということが明確に記述された文書を、いまのところは発見できていないので、現段階では、あくまで私の個人的な推測です。いうことで、名前の由来が謎なので、この動画では「インターフェース識別子という名称の謎」と表現しています。EUI-64によるインターフェース識別子が必須ではなくなったという話です。7136では、新しいインターフェース識別子のフォーマットが議論されるたびに、uビットとgビットに意味があるのかという疑問が浮かんでくると書いてあります。7136を、ざっくりと要約すると、インターフェース識別子のuビットとgビットに意味があるのだろうか?いやない。EUI-64形式になっている必要がありました。EUI-64フォーマットによって構成される必要がある。7136では、この部分が次のように修正されています。IPv6アドレスの先頭3ビットが000ではないすべてのユニキャストIPv6アドレスのインターフェース識別子は64ビット長である必要がある。EUI-64フォーマットによって構成されなければならない。EUI-64フォーマットを利用するという仕様に変更されました。MAC層のアドレスから生成される場合のみに変わったわけです。7136では、インターフェース識別子に含まれるビット列には包括的なセマンティクスはない、としています。インターフェース識別子に含まれるビット列には包括的なセマンティクスはない。言い換えると、インターフェース識別子の値は不明瞭である。EUI-64でのuビットとgビットを気にしなくても良いということです。4291に含まれる次の文言を廃止しています。EUI-64フォーマット識別子におけるuniversal/localビットの利用は、ユニバーサルスコープを持つインターフェース識別子を有効利用できる未来のテクノロジーを開発可能にすることを目的としている。4291の文章を廃止したわけです。現時点では、この変化によって影響を受ける実装は存在していない。7136では、何でそんな設計が行われたのかに関する言及もあります。IPv6設計段階およびインターフェース識別子フォーマットが最初に策定された段階では、ユニバーサルにユニークなインターフェース識別子は、たとえば、マルチホーム問題を解決することに貢献するなど、非常に有用となるのではないかという仮定がありました。このように、もしかしたら将来、役に立つかも知れないという発想で、IPv6アドレスからインターフェースを識別できるような仕様にしたようです。7136では、この文章の後に、そもそもMACアドレスが再利用されることがあり、MACアドレスが示すuビットが1であることがuniversalなuniquenessに関する信頼できる指標ではない、と書いています。EUI-64が必須ではなくなる話と繋がってくるのです。NOT(非推奨)とされました。EUI-64フォーマットを利用することが非推奨とされているわけではありません。7721で解説されている次の4点をあげています。それぞれ、概要を紹介します。活動の関連付けまず、活動の関連づけですが、MACアドレスなどのIEEE識別子を利用したインターフェース識別子を利用している場合、そのネットワークインターフェースが利用され続ける限り、インターフェース識別子はずっと同一のままです。インターフェース識別子が、ネットワークインターフェースをグローバルに識別してしまうわけです。そのため、IPv6アドレスを利用して、ホストの活動を長期間にわたって関連づけることができます。した活動の関連づけでは、IPアドレスだけでなく、DNSにおける名前、HTTPクッキー、ブラウザのフィンガープリントなどの情報もあわせて利用されることがあります。NATとDHCPv4が同じホストに対して異なるIPv4アドレスを割り当てるIPv4に比べて、IPv6では、この攻撃の効果が大きくなる可能性が指摘されています。位置トラッキング次は、位置トラッキングです。固定的なインターフェース識別子が利用されている場合、そのホストがネットワークを移動したことをインターフェース識別子から判別できます。それにより、そのホストがどのように物理的に移動したかを、ネットワークプレフィックスの位置を追跡することで検知できるようになります。7721では、この特性を利用した能動的な攻撃手法も紹介されています。同じIPv6リンクに接続したサーバ、もしくは途中経路上にある機器がインターフェース識別子を学習することで、遠隔地にあるネットワークからその機器の存在を確認できるようになります。IPv4では、新しいネットワークに接続したときにまったく新しいIPv4アドレスが割り当てられるので、このような攻撃は可能ではないとされています。デバイスの持つ脆弱性への攻撃では、次は、デバイスの持つ脆弱性への攻撃です。IEEE識別子は製造者を示す情報を含むので、IEEE識別子が、IPv6アドレスのインターフェース識別子として利用される場合には、そのネットワークインターフェースに関するデバイス情報が漏洩しています。IPv6アドレスを見るだけで、どのようなハードウェアを利用しているのかが、わかってしまう場合があるわけです。機器固有の脆弱性が存在する場合など、デバイス情報が漏れることで攻撃者に有利な状況になる可能性が考えられます。7707で論じられています。7707で解説されているアドレススキャン攻撃に関しては、以前作った動画をご覧ください。8064は、MACアドレスなどを使って、IPv6アドレスのインターフェース識別子を生成することを非推奨としました。8064は、それよりもさらに一歩踏み込んで非推奨としています。最後にインターフェース識別子は、本来はサブネット内で一意であれば良いはずのものですが、IPv6の仕様として、インターフェース識別子をインターネット全体で一意にするといった要素も含まれていました。このことから、インターフェース識別子という名前は、インターネット全体を範囲としてインターフェースを識別することも視野に入っていた名前であることが推測されます。IPv6アドレスを単なるインターネットプロトコルでの通信のための識別子としてだけではなく、下位ビットを使ってインターフェースまで識別できるような仕組みにしたら、識別できることそのものが問題でした、みたいな、そんな感じなのかも知れません。EUI-64ですが、その仕組みがインターフェース識別子という名前の由来になっているのかも知れないと思うわけです。実際に、そういった思想で、インターフェース識別子という名前にしたのかどうか、いまのこところ確実な文言をRFCなどから発見できているわけではなく、多分そうじゃないかという私の推測だけです。インターフェース識別子という名称が、私の推測している通りの理由でインターフェース識別子となったのであれば、MACアドレスなどからインターフェース識別子を自動生成することが非推奨となった現在は、インターフェース識別子は、インターフェースを識別するものではなくなっている可能性があります。インターフェース識別子という名前だけが残り、その名前の由来となった設計は、既に推奨されないものとなっているとも考えられるわけです。考えると、インターフェース識別子は、いまや、魂が抜けてしまった名前なのかも知れません。実際はどうなんでしょうか。ないかという話で、いまのところ、よくわからないというのが正直なところです。EUI-64の解説でした。多少マニアックな内容になってしまいましたが、楽しんでいただければ幸いです。無断転載など、私的利用の範囲を逸脱した利用は禁止します.。