0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IPv6学習メモ

Last updated at Posted at 2024-12-09

IPv6について、すぐ忘れるのでまとめる

基本

128ビット(16バイト)。::は0が連続していることを表す。
2byte:2byte:2byte:2byte:2byte:2byte:2byte:2byte で表す。
ex: ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
(ffff:ffff:ffff:ffff:ffff:ffff:ffff:a)のように、2byte部分はデータ列というより数値と考えて良いみたい。つまり、勝手に先頭は0埋めしてくれる。自分で0埋めしてもよい。

リンクローカルアドレス

同じリンク上で使うアドレス。FE80::/10で始まるらしい。
FE 80 = 11111110 10000000 だと思うので、最初の10bitは、11111110 10 のこと。
例えば、FE80::1など。各インターフェイスでユニークになるように、通常はMACアドレスや他のインターフェイス識別子から自動生成される。
なお、1つのマシンが複数のリンクに参加している時、自身の利用するインターフェースを%で指定して、外部のマシンのリンクローカルアドレスを参照する。例えば、FE80::10%eth0は、FE80::10のアドレスであり、自身のeth0が属しているリンクアドレスを指す(IPv4においては、サブネットがあるので、宛先アドレスと自身の各インターフェースの与えられたサブネットとを突き合わせて、どのインターフェースかが定まる。リンクローカルアドレスは、サブネットの概念がない(/10はあるが、これ以上はさらに細かく区切らない)ので、これが必要らしい)
手元のマシンで見たら、fe80::a4c2:2cf2:61ae:5db/64と書かれていた。また、同じリンク間でping6してみたら、相手のリンクローカルアドレス%<インターフェース名>の%以降のところを省略したら通信できなかった。厳密みたい(嘘。ip routeで見て、fe80::/60のルーティング行が3つあり、そのうちで一番優先度の高いものはdocker0だったため、docker0インターフェースがデフォルトで選ばれていたためだった。実際、%docker0についてだけはインターフェースを省略できた)

同じリンクに含まれるリンクローカルアドレスの一覧を得るには、下記コマンドを打つ。FF02::1は、全てのリンクローカルアドレスへのマルチキャストアドレスのよう。

ping6 ff02::1%<インターフェース名>

<コラム>

ユニキャストアドレス

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

インターネット上で一意に割り当てられるアドレス。
範囲: 2000::/3(0x20=00100000なので、001で始まるものということ)
開始と終端: 2000::と3fff::ffff::ffff::ffff::ffff::ffff::ffff::ffff。
例: 2404:6800:4004:825::200e(google.com)

リンクローカルアドレス

同じリンク(セグメント)内で通信するためのアドレス。
範囲: FE80::/10
例: FE80::1%eth0
自動的に割り当てられ、必ず存在する。ルーターを超える通信には使用されない。

ユニークローカルアドレス (Unique Local Address, ULA)

プライベートネットワーク内で使用するアドレス(IPv4のプライベートアドレスに相当)。
範囲: FC00::/7(通常はFD00::/8が使われるらしい)
例: FD00:abcd::1
グローバルにはルーティングされない。

マルチキャストアドレス

FF00::/8 マルチキャストアドレス
次の8bitはスコープを表す。

スコープの例:
02(つまり、FF02::/16 ) リンクローカル
0E グローバル

ループバックアドレス

::1/128 つまり、000...001のみ。

デフォルトゲートウェイを知るには

ip -6 route

2400:2411:3ec4:bd01::/64 dev enx6c1ff71a06b4 proto ra metric 100 pref medium
fe80::/64 dev docker0 proto kernel metric 256 pref medium
fe80::/64 dev vetha7dbd4e proto kernel metric 256 pref medium
fe80::/64 dev enx6c1ff71a06b4 proto kernel metric 1024 pref medium
default via fe80::1e7c:98ff:fe13:5420 dev enx6c1ff71a06b4 proto ra metric 100 pref medium

ここで、1行目について、RAという仕組みがあるらしいので調べた。

Router Advertisementとは

  • 送信者: IPv6対応ルーター
  • 受信者: IPv6クライアントデバイス(ホスト)

内容: 以下のような情報を提供する。

  • ネットワークプレフィックス
    ホストが自身のIPv6アドレスを生成するためのプレフィックス情報(例: /64)。
  • デフォルトゲートウェイの情報
    ルーターのリンクローカルアドレス(例: fe80::1)。
    ルーターパラメータ
    ルーターの有効期限や優先度。
  • その他オプション
    MTU(最大転送単位)。
    DNSサーバーアドレス(RFC 6106)。

RAメッセージの仕組み

  • ルーターからの送信
    IPv6対応ルーターは、定期的にまたはホストからのリクエストに応じて、RAメッセージを送信する。送信先アドレスはリンクローカルマルチキャストアドレス FF02::1(リンク内の全ノード)である。

  • ホスト側での処理
    ホストはRAを受信すると、その内容に基づいて以下を設定する:

IPv6アドレスの自動生成(SLAAC: Stateless Address Autoconfiguration)
RAメッセージに含まれるプレフィックス情報を使用して、インターフェースIDを付加し、自身のIPv6アドレスを生成する。

  • デフォルトゲートウェイの設定
    RAに含まれるルーターのリンクローカルアドレスをデフォルトゲートウェイとして設定する。
  • ルートエントリの追加
    ネットワークプレフィックスを基に適切なルートエントリを作成する。
  • ホストからのリクエスト
    必要に応じて、ホストは Router Solicitation (RS) メッセージを送信し、RAを要求することができる。ルーターがこれに応答してRAを送信することで、ネットワーク情報がホストに提供される。

NDP(Neighbor Discovery Protocol)

IPv4のARPに代わって、Neighbor Discovery Protocolを利用する。
ARPはIPv4アドレスからMACアドレスへの変換を行なうプロトコルだったが、NDPは同様にIPv6からMACアドレスへの変換を行う。さらに他にも、近隣キャッシュ管理、自動アドレス設定(SLAAC)、デフォルトゲートウェイの検出、重複アドレス検出 (DAD)、ルータープレフィックス学習などを行うらしい。

ARP相当CLIコマンド: ip -6 neighbor

デフォルトゲートウェイを、MACアドレスから探す方法
ip -6 route | grep default

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?