リンクローカルアドレスとは
Ethernet 等のマルチアクセス環境において、L2 範囲内でのみ有効な IP アドレスのことをリンクローカルアドレスと呼びます。
例えば Ethernet のブロードキャストドメイン内のホスト同士であれば、リンクローカルアドレスで IP 通信が可能です。
下図の例では、PC1~PC3 は通信可能ですが、PC4 は誰とも通信できません。
つまり、リンクローカルアドレスは、ルーティングしない範囲で通信が可能となり、その通信範囲のみで一意になることが求められます。
リンクローカルアドレスで通信することは、本質的には『Ethernet で通信することと同じ』です。
異なるのはアプリケーションから見たときに『IP でアプリ通信を行うのか』『Ethernet でアプリ通信を行うのか』という点です。(Ethernet で通信するアプリを作ることは可能ですが、そのようなアプリを作ろうと思う人はいないでしょう。IP 前提のアプリが多いからこそリンクローカルアドレスに意味があるわけです。)
IPv4 と IPv6 のリンクローカルアドレスはそれぞれ以下のように割り当てられています。
- IPv4 = 169.254.0.0/16
- IPv6 = fe80::0/64
ただし、IPv4 と IPv6 では使われ方が異なります。
IPv4のリンクローカルアドレス
IPv4 のリンクローカルアドレスは RFC3927 で定義されていますが、『DHCP で IP を取得できなかった場合でも同一ブロードキャストドメイン内同士の通信は出来るようにする』ことを目的としています。
[ RFC3927 Abstract からの引用を和訳 ]
広範囲の IP ネットワークに参加するためには、ホストは自身の NW インタフェースに IP アドレスを設定する必要があります。それはユーザが手動で設定しても DHCP のような資源から自動設定されても構いません。ですが残念ながら、このようなアドレス設定は必ずしも取得できるとは限りません。
そのためアドレス取得が出来ない場合であっても IP ネットワークが利用可能なサブネットに所属できることがホストにとっては有用です。
このドキュメントでは同一 L2 リンク内のデバイスが互いにコミュニケーションが可能となる 169.254/16 プレフィックスのアドレスを、ホストがどのように自動設定されるかを記述します。
IPv6 では IPv4 からの改良のため、ルーティングのネクストホップとして使われますが、その説明の前段として IPv4 での問題点を説明しておきます。
例として以下の構成を考えます。
IPv4 の場合、PC1 と PC2 が通信するためには、NW 機器同士を繋ぐいわゆる中間セグメントとして IP アドレスを割り当てる必要があります。特に OSPF 等の動的ルーティング利用時には中間セグメントもルーティングテーブルに含まれてしまいます。
ですが実は PC1 と PC2 の間で通信をしたいだけであれば、中間セグメントのルート情報は不要です。
以下に静的ルーティング利用時の最小限設定を見てみます。
例えば R4 では 10.1.12.0/24 や 10.1.13.0/24 のルート情報が不要であることが分かります。
IPv6 のリンクローカルアドレス
IPv6 の場合はリンクローカルアドレスが自動生成されますので、中間セグメントにリンクローカルアドレス以外の IP アドレスは必須ではありません。
中間セグメントは全てのリンクで重複させますのでアドレス消費を減らすことができますし、動的ルーティング利用時にはルーティングテーブルの行数を抑えることもできます。
もし中間セグメントのインタフェース宛に『ルーティングして (つまり異なるブロードキャストドメインのホストから)』IP 通信をしたい場合は、リンクローカルとは別に、通常の IPv6 アドレスを割り当てます。ただし、中間セグメントに通常の IP アドレスを割り当てるよりも、ループバックアドレスを割り当てる方が本質的です。
ユニークローカルアドレスとの違い
IPv6 ではプライベートアドレスのことを『ユニークローカルアドレス』と呼び、fec0::/7 のアドレス帯が定義されています。(2005年 RFC4193 )
昔はサイトローカルアドレスと呼ばれていました。
前述の通り、リンクローカルアドレスの特徴は『ルーティングしない範囲で使われる、その範囲内でのみ一意なアドレス』です。
ユニークローカルアドレスは拠点のネットワーク管理者が IP アドレス設計できる範囲でルーティングが可能な IP アドレスです。もう少し平たくいうと、インターネットでルーティングされない範囲の IP アドレスを指します。
リンクローカルアドレスと異なり、自分のセグメント外との通信 (ルーティング) が可能ですが、通信する範囲 (複数セグメントに渡って) でユニークである必要があります。
一方リンクローカルアドレスはセグメント外の通信はできませんが、セグメント内のみでユニークであれば良いです。
Ping や traceroute 時の Output Interface (出力インタフェース) の指定
IPv4 においては、各機器インタフェースに設定する IPv4 アドレスは同機器の他のインタフェースのセグメントと重複してはなりません。
それゆえ、ある宛先アドレスのネクストホップを指定すれば、出力インタフェースは一意に定まります。
ところがリンクローカルアドレスはセグメントが重複 (というか全て同じセグメント) していますので、出力インタフェースを指定しないとどちらから Ping パケットを出せばよいか分かりません。
そのため、リンクローカルアドレスへの Ping や traceroute 利用時には必ず output interface を指定する必要があります。
コメント