IPv6 Checklist

Contact

Markdownホスティング → 体験サービス受付け中

Home > IPv6 Checklist | English

IPv6対応サーバ設定 - チェックリスト

IPv6 Server Setup Checklist

はじめに

インターネットのサーバをIPv6対応にするための確認項目です。

横浜工文社でも遅ればせながらサーバ側とクライアント側の両方でIPv6が標準で利用可能なサービスに切り替えました。 これを機にWebサーバやメールサーバのIPv6対応を行いました。 行った手順の概略と留意点をまとめます。 ページ末の付録にはIPv6アドレスの表記や割り当ての早見表を付けました。 参考になればと思います。

弊社にサーバ設定を頼みたい、刷新したい、新しい技術にも対応したい、などご用命があれば遠慮なくご連絡ください。 リモート対応いたします。

内容

テスト環境

なお、以下の表示例では実物のホスト名やアドレスを仮のものに置き換えたり省略した部分があります。

ネットワークの設定

最初に接続回線、ルータやマシン、OSレベルでIPv6接続が可能かをチェックします。

クライアント

クライアント側のネットワークでIPv6が使えているかどうかを調べる方法です。

Windows PCで試してみます。

コマンドプロンプトを開いてIPCONFIGコマンドを実行します。

C:\> ipconfig
...
Wireless LAN adapter Wi-Fi:

   接続固有の DNS サフィックス . . . . .:
   IPv6 アドレス . . . . . . . . . . . .: 240f:7c:xxxx:xxxx:xxxx:xxxx:e3e5:ea94 ← 外部
   一時 IPv6 アドレス. . . . . . . . . .: 240f:7c:xxxx:xxxx:xxxx:xxxx:1d21:f577 ← 外部
   リンクローカル IPv6 アドレス . . . . .: fe80::xxxx:xxxx:e3e5:ea94%26 ← 内部
   IPv4 アドレス . . . . . . . . . . . .: 192.168.0.11
   サブネット マスク  . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ  . . . . . . .: fe80::xxxx:xxxx:fec7:dab4%26 ← 内部
                                         192.168.0.1

IPv4アドレス(LAN内のプライベートアドレス)がひとつ、IPv6アドレスが三つ割り当てられています。 「IPv6アドレス」と「一時IPv6アドレス」は外部のインターネットで通用するアドレスです。 「リンクローカルIPv6アドレス」はLAN内でしか通用しません。 「デフォルトゲートウェイ」つまり外部接続用ルータはIPv4とIPv6とふたついずれもLAN内のアドレスを提供しています。

以上からこのWindows PCではIPv4もIPv6もともに通信可能であることがわかります。

まずはLAN内のルータにつないでみます。

C:\> ping fe80::xxxx:xxxx:fec7:dab4%26
fe80::xxxx:xxxx:fec7:dab4%26 に ping を送信しています 32 バイトのデータ:
fe80::xxxx:xxxx:fec7:dab4%26 からの応答: 時間 =9ms
 ...

C:\> ping 192.168.0.1
192.168.0.1 に ping を送信しています 32 バイトのデータ:
192.168.0.1 からの応答: バイト数 =32 時間 =4ms TTL=255
 ...

IPv6もIPv4もつながりました。

続いて外部へ出てみます。

C:\> ping -6 www.google.com
www.google.com [2404:6800:4004:808::2004]に ping を送信しています 32 バイトのデータ:
2404:6800:4004:808::2004 からの応答: 時間 =12ms
2404:6800:4004:808::2004 からの応答: 時間 =12ms
 ...

C:\> ping -4 www.google.com
www.google.com [172.217.175.228]に ping を送信しています 32 バイトのデータ:
172.217.175.228 からの応答: バイト数 =32 時間 =13ms TTL=117
172.217.175.228 からの応答: バイト数 =32 時間 =11ms TTL=117
 ...

OKです。

続いてWebブラウザを使って接続元のIPアドレスを表示してくれるサイトにつないでみます。

test-ipv6.com

test-ipv6-ja

外部へ接続する場合は「IPv6アドレス」ではなく「一時IPv6アドレス」が使われることがわかります。

海外のサイトもあります。

ipv6-test.com

ipv6-test-en

また、簡便な確認方法として、IPv6対応の通信会社の情報サイトにはページの上部にIPv4/IPv6のいずれで接続されているかがわかる表示を出すところがあります。

IIJ
 iijmio-label
KDDI
 kddi-label

PCのほかタブレットや携帯電話もよほど古いものでないかぎりIPv6対応です。 PCと同じように外部のしかるべきサイトにつないでみればIPv6で接続しているかどうかがわかります。

ところでWindows 10でLinuxが使えるWindows Subsystem for Linux 2はIPv6未対応です。 なのでこうなります。

$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
5: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 fe80::xxxx:xxxx:fe9b:c866/64 scope link ← 内部アドレスしか振られない
       valid_lft forever preferred_lft forever

$ ping -6 www.google.com
connect: Network is unreachable

$ ping -4 www.google.com
PING www.google.com (172.217.26.4) 56(84) bytes of data.
64 bytes from nrt20s02-in-f4.1e100.net (172.217.26.4): icmp_seq=1 ttl=116 time=10.7 ms
64 bytes from nrt20s02-in-f4.1e100.net (172.217.26.4): icmp_seq=2 ttl=116 time=11.10 ms
 ...

参考: Comparing WSL 1 and WSL 2 (IPv6 access) - WSL1ではできていたが...

サーバマシン/OS

クラウド、バーチャルサーバ、レンタルサーバなど呼び方は様々ですが、外部に借りているサーバマシンや仮想マシンがIPv6対応でかつIPv6で通信可能かを調べる方法です。

Webブラウザからサービス業者のコントロールパネルにアクセスして、IPv4のほか、IPv6のアドレスが振られていることを確認します。 サービス上はIPv6が利用可能であっても自分で設定しないと使えない場合があります。 また、初期化直後のサーバOSではIPv6がオフになっている場合があります。

サービス上IPv6は有効であることが確認できたら、今度はリモートサーバにログインしてIPv6の接続状態を確認します。 筆者が利用しているのはLinuxマシンなので以下Linuxを例にとります。

$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 state UNKNOWN qlen 1000
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 2401:2500:xxxx:xxxx:xxxx:xxxx:30:104/64 scope global noprefixroute ← 外部
       valid_lft forever preferred_lft forever
    inet6 fe80::xxxx:xxxx:fe06:b148/64 scope link noprefixroute ← 内部
       valid_lft forever preferred_lft foreve

「2401」のように「2」から始まるIPv6アドレスは外部接続可能なのでこれがあれば問題ありません。 「fe80」から始まるアドレスは内部LAN用(リンクローカル)なのでこれだけあってもダメです。

IPv6の外部用アドレスがない場合にはIPv6接続を有効にする必要があります。 サーバOSの種類やバージョンによって設定方法は異なります。 サービス業者のマニュアルやネットのHOWTOなど参考に設定を行います。

いずれにしてもLinuxであればおおむね行うべき手順は同様です(手動設定の場合)。

以上が済んだら外部との疎通を確認します。

$ ping -6 google.com
PING google.com(nrt20s19-in-x0e.1e100.net (2404:6800:4004:81d::200e)) 56 data bytes
64 bytes from nrt20s19-in-x0e.1e100.net (2404:6800:4004:81d::200e): icmp_seq=1 ttl=117 time=16.5 ms
 ...
$ ping -4 google.com
PING google.com (172.217.24.142) 56(84) bytes of data.
64 bytes from nrt20s01-in-f142.1e100.net (172.217.24.142): icmp_seq=1 ttl=117 time=16.3 ms
...

参考リンク:

各サーバソフトの設定

サーバマシンとサーバOSの基本設定が済んだので次は各種ネットワークサービスのIPv6対応を行います。 サーバソフトウェアごとに設定の確認と通信の確認が必要ですがやりかたの基本は同じです。

現在はIPv6非対応のサービスは少なく、また、デフォルトでIPv6が通信可能になっているものがほとんどです。 いってみれば「つながってることの確認」を行う作業です。

IPv4は開かずIPv6ポートでIPv4も受ける場合もある(後述)。

待ち受け確認(netstat)

サーバがクライアントからの接続を受け付ける待ち受けポート(listen port)を見るにはnetstatが便利です。

ない場合はnet-toolsパッケージをインストール。

以下では筆者のレンタルサーバのひとつ(CentOS8の標準構成)を例に取ります。 これには、もとからsshが入っており、そこにDNSサーバ(bind)、Webサーバ(apache)、メール転送サーバ(postfix)、メール配布サーバ(dovecot)を追加インストール、IPv4接続で動かしてました。 サーバソフトの設定はそのままに、サーバOSのIPv6通信を可能にした直後の状態です。

$ netstat -6l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address            Foreign Address         State
tcp6       0      0 [::]:submission          [::]:*                  LISTEN
tcp6       0      0 [::]:pop3                [::]:*                  LISTEN
tcp6       0      0 [::]:imap                [::]:*                  LISTEN
tcp6       0      0 [::]:http                [::]:*                  LISTEN
tcp6       0      0 [::]:domain              [::]:*                  LISTEN
tcp6       0      0 localhost:rndc           [::]:*                  LISTEN
tcp6       0      0 [::]:smtp                [::]:*                  LISTEN
tcp6       0      0 [::]:https               [::]:*                  LISTEN
tcp6       0      0 [::]:imaps               [::]:*                  LISTEN
tcp6       0      0 [::]:pop3s               [::]:*                  LISTEN
udp6       0      0 [::]:domain              [::]:*
raw6       0      0 [::]:ipv6-icmp           [::]:*                  7
$ netstat -4l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address            Foreign Address         State
tcp        0      0 0.0.0.0:submission       0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:pop3             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:imap             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:ssh              0.0.0.0:*               LISTEN
tcp        0      0 host1.example.com:domain 0.0.0.0:*               LISTEN
tcp        0      0 localhost:domain         0.0.0.0:*               LISTEN
tcp        0      0 localhost:rndc           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:smtp             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:imaps            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:pop3s            0.0.0.0:*               LISTEN
udp        0      0 host1.example.com:domain 0.0.0.0:*
udp        0      0 localhost:domain         0.0.0.0:*
udp        0      0 localhost:323            0.0.0.0:*

netstat-lオプションを使うとリッスン中のポートのみ表示可能

はじめからIPv4とIPv6の両方のポートが開かれていることがわかります(http/httpsは例外、後述)。

IPv6アドレスの[::]はIPv4の0.0.0.0と同様すべてゼロを意味し、アドレスが「未指定」つまり「何でもよい」を意味します。

もし希望のサービスでIPv4またはIPv6のポートが開かれていない場合は該当のサーバソフトの設定ファイルを確認します。

以下、筆者が試したソフトの場合を紹介します。

DNS (bind/named)

DNSとIPv4/6にはふたつの関係があります。

このふたつは完全に独立しています。 検索対象のホストへIPv6で接続可能かどうか(IPv6アドレスを持つかどうか)は単にDNSサーバが持つデータです。 DNSサーバにIPv4で問い合わせようがIPv6で聞こうが返ってくる答えは同じです。

筆者が利用中のネームサーバ(bind 9.11.20)の場合、IPv4/IPv6の待ち受け設定は次の箇所にあります。

[/etc/named.conf]

options
{
    listen-on port 53     { any; };
    listen-on-v6 port 53  { any; };

これはデフォルトの状態です。 IPv4もIPv6も「any」なので両方を全インターフェースで待ち受ける指定です。 特定のLANインターフェースに限る、IPv4か6どちらかに限る、特定のアドレスに限定、でなければ変更不要です。

続いてWebサーバやメールサーバのホストのIPv6アドレスをDNSサーバに追加します。 該当ドメインのゾーンファイルに、IPv4の「A」レコードと併記するかたちで、ただしIPv6アドレスは「AAAA」レコードで指定します。

[zone file of domain example.com served by dns server host1.example.com]

host2  IN  A     133.xxx.xxx.68
host2  IN  AAAA  2403:3a00:xxxx:xxxx:xxxx:xxxx:72:68 ← 追加

「AAAA」のかわりに「A6」レコードでIPv6アドレスのネットワーク部分(prefix)とホスト部分(interface)を分けて指定する方法もありますが、まだ利用は少ないようです。

テストしてみます。

データを入れたばっかりなのでDNSサーバを指定して問い合わせします。 検索対象がhost2.example.com、DNSサーバがhost1.example.comです。

hostコマンドの最初の引数は検索対象のホスト、省略可能な二番目の引数は問い合わせ先のDNSサーバ。

[IPv4で問い合わせ]

$ host -4 host2.example.com host1.example.com
Using domain server:
Name: host1.example.com
Address: 153.xxx.xxx.104#53 ← DNSサーバのIPv4アドレス
 ...
host2.example.com has address 133.xxx.xxx.68                         ← 検索対象のIPv4アドレス
host2.example.com has IPv6 address 2403:3a00:xxxx:xxxx:xxxx:xxxx:72:68 ← 同じくIPv6アドレス

[IPv6で問い合わせ]

$ host -6 host2.example.com host1.example.com
Using domain server:
Name: host1.example.com
Address: 2401:2500:xxxx:xxxx:xxxx:xxxx:30:104#53 ← IPv6になっている
 ...
host2.example.com has address 133.xxx.xxx.68
host2.example.com has IPv6 address 2403:3a00:xxxx:xxxx:xxxx:xxxx:72:68

接続に使われたDNSサーバのアドレス(IPv4かIPv6か)が表示されています。 接続経路に関わらず同じ設定情報が返ってきます。

クライアントはこの情報をみて自分が通信可能なアドレスを選びます。 両方可能な場合はたいていIPv6を優先します。

クライアント側では、IPv6が使えないのにIPv6につなごうとしてタイムアウトする、という問題が起こります。これは回線がIPv6ではないのに、クライアントOSやルータの設定がIPv6利用可能状態になっている、という原因が多いと思います。この場合はクライアントOSやルータのIPv6設定を無効にする必要があります。

上記のふたつの問い合わせをログを見て確認します。 個々の正常な問い合わせはふつうログに出ないので、あらかじめ詳細ログを出すコマンドを出しておく必要があります。

$ sudo sudo rndc querylog ← 詳細ログ開始

[/var/log/messages]

Mar 12 16:47:21 host1 named[20450]: received control channel command 'querylog'
Mar 12 16:47:21 host1 named[20450]: query logging is now on

(一回目 IPv4)
Mar 12 16:47:39 host1 named[20450]: client ... 106.xxx.xxx.154#53811 (host2.example.com): view external: query: host2.example.com IN A + (153.xxx.xxx.104)
Mar 12 16:47:39 host1 named[20450]: client ... 106.xxx.xxx.154#53786 (host2.example.com): view external: query: host2.example.com IN AAAA + (153.xxx.xxx.104)
Mar 12 16:47:39 host1 named[20450]: client ... 106.xxx.xxx.154#53845 (host2.example.com): view external: query: host2.example.com IN MX + (153.xxx.xxx.104)

(二回目 IPv6)
Mar 12 16:48:00 host1 named[20450]: client ... 2403:3a00:xxxx:xxxx:xxxx:xxxx:72:68#54994 (host2.example.com): view external: query: host2.example.com IN A + (2401:2500:xxxx:xxxx:xxxx:xxxx:30:104)
Mar 12 16:48:00 host1 named[20450]: client ... 2403:3a00:xxxx:xxxx:xxxx:xxxx:72:68#48751 (host2.example.com): view external: query: host2.example.com IN AAAA + (2401:2500:xxxx:xxxx:xxxx:xxxx:30:104)
Mar 12 16:48:01 host1 named[20450]: client ... 2403:3a00:xxxx:xxxx:xxxx:xxxx:72:68#38942 (host2.example.com): view external: query: host2.example.com IN MX + (2401:2500:xxxx:xxxx:xxxx:xxxx:30:104)

Mar 12 16:48:07 host1 named[20450]: received control channel command 'querylog'
Mar 12 16:48:07 host1 named[20450]: query logging is now off

一回目と二回目の問い合わせがそれぞれIPv4およびIPv6経由で行われていることがわかります。

詳細ログを止めます。

$ sudo sudo rndc querylog ← 詳細ログ停止(開始と同じコマンド)

メールサーバ(postfix + dovecot)

筆者の環境では転送サーバ(SMTP)はPostfix 3.3.1、配送サーバ(IMAP/POP3)はDovecot 2.3.8を使っています。 これを例にとります。

まずPostfixの待ち受け設定をみます。

[/etc/postfix/main.cf]

# Enable IPv4, and IPv6 if supported
inet_protocols = all

デフォルト設定のままです。 IPv4およびIPv6を受ける設定になっています。 片方に限定する場合にのみ「ipv4」や「ipv6」を指定します。

また、mynetworksなどアドレスを直接指定する箇所にIPv4限定の指定がないことを確認します。

参考: Postfix IPv6 Support

続いてDovecotの接続設定を見ます。

[/etc/dovecot/dovecot.conf]

# A comma separated list of IPs or hosts where to listen in for connections.
# "*" listens in all IPv4 interfaces, "::" listens in all IPv6 interfaces.
# ...
#listen = *, ::

こちらもデフォルト設定でIPv4/IPv6ともに有効になっています。

参考: Dovecot Core Settings - listen

IPv6で接続されているPCから自分宛てにメールを出してすぐさま読んでみたあと、ログをみます。

[/var/log/maillog]

(SMTP)
Mar 13 09:49:33 host1 postfix/submission/smtpd[35232]: 806619B5D2: client=unknown[240f:7c:xxxx:xxxx:xxxx:xxxx:c8b9:1f1b], sasl_method=PLAIN, sasl_username=user@example.com
Mar 13 09:49:33 host1 postfix/cleanup[35229]: 806619B5D2: message-id=<4250358c-xxxx-xxxx-xxxx-3f97916377ea@example.com>
...
(POP3)
Mar 13 09:49:37 host1 dovecot[14970]: pop3-login: Login: user=<user@example.com>, method=PLAIN, rip=240f:7c:xxxx:xxxx:xxxx:xxxx:c8b9:1f1b, lip=2401:2500:xxxx:xxxx:xxxx:xxxx:30:104, mpid=35234, TLS, session=<39wcZGC9oOkkDwB89+kAATzNAoPIuR8b>

PostfixともDovecotともIPv6アドレスで接続されていることがわかります。

Webサーバ(apache2)

最後にWebサーバ(Apache)です。

新しいマシンにUbuntu 20.04の標準構成を設定し、Apache 2.4.41をインストール、SSLなど最低限の設定をした直後の状態で、待ち受けポートの状態を見てみます。

$ netstat -6ln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp6       0      0 :::80                   :::*                    LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 :::443                  :::*                    LISTEN
raw6       0      0 :::58                   :::*                    7
$ netstat -4ln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN ← IPv4で待つのはSSHのみ

待ち受けポートが22のSSHはIPv4とIPv6の両方が開かれています。 Apacheの80や443があるのはIPv6側だけでIPv4のポートがありません。

この状態でIPv4およびIPv6のクライアントからWebサイトへ接続し、ログをみてみます。

[/var/log/httpd/ssl_access_log]

106.xxx.xxx.154 - - [13/Mar/2021:10:00:59 +0900] "GET / HTTP/1.1" 200 5512 ← IPv4で接続
...
240f:7c:xxxx:xxxx:xxxx:xxxx:c8b9:1f1b - - [13/Mar/2021:10:05:26 +0900] "GET / HTTP/1.1" 200 5512 ← IPv6で接続

IPv4、IPv6ともに接続できています。 不思議です。

Apacheの設定をみてみます。

[/etc/apache2/ports.conf]

Listen 80
<IfModule ssl_module>
        Listen 443
</IfModule>
 ...

これはデフォルトのままで、IPv4もIPv6も許す、という意味です。

IPv4の待ち受けポートが開かれていなくてもIPv4で通信できてしまう理由がApacheのサイトに書かれています。

参考: Binding to Addresses and Ports (Special IPv6 Considerations)

アドレス未指定でIPv6とIPv4が有効な場合、通常はIPv6の受信用ソケットのみ開き、IPv4の接続は「IPv4-mapped IPv6 address」で受ける、つまりソケット数が減るので資源の節約になります。

ところが、次のようにしてしまうとソケットが二個ずつ開かれてしまうことになります。

Listen 192.0.2.1:80
Listen [2001:db8::a00:20ff:fea7:ccea]:80

以上ですが、おまけで、サーバ側でクライアントのアドレスを調べる方法です。 CGIスクリプトであればREMOTE_ADDR環境変数を参照すればわかります。

[index.cgi]

#!/bin/bash
echo 'Content-Type: text/plain'
echo ''
echo 'index.cgi of kobu.com'
echo 'REMOTE_ADDR: $REMOTE_ADDR"

kobucom-indexcgi

付録

IPv6のアドレスの表記や分類についてあんちょこ代わりにまとめたものです。 筆者の理解不足・誤解があるかもしれないのであくまで参考としてください。

表記法、分類、割り当てはWikipedia(2019/11時点)に書かれた内容の筆者なりの要約です。

Wikipedia:
IPv6 address (en)
IPアドレス (ja)

表記法

IPv4アドレスが32ビット、4バイトなのに対して、IPv6アドレスは128ビット、16バイト、16進数表記で32桁あります。

IPv4: 93.184.216.34
IPv6: 2001:0db8:85a3:08d3:1319:8a2e:0370:7348

IPv4では四つの10進数をドットで区切るのに対して、IPv6では全体を八つの16ビットのグループに分けて、それぞれ4桁の16進数で表し、コロンで区切ります。

表記例:

2001:0db8:85a3:08d3:1319:8a2e:0370:7348 (1)
fe80:0000:0000:0000:01ff:fe23:4567:890a (2)
0000:0000:0000:0000:0000:0000:0000:0001 (3) 

省略形:

2001:db8:85a3:8d3:1319:8a2e:370:7348 (1)
fe80::1ff:fe23:4567:890a (2)
0:0:0:0:0:0:0:1 (3)
::1 (3)

コロンで区切られた各部分の上位のゼロは省略可(:0db8: → :db8:)、すべてゼロの場合は一個だけ(:0:)、途中に連続したオールゼロの部分が複数ある場合はコロンごと省略可(::)。 表記例と省略形の(1)~(3)はそれぞれ同じ値です。

末尾にスラッシュを付けてネットワーク部分のビット数を表すのはIPv4と同じです(/64)。

fe80::1ff:fe23:4567:890a/64

ホスト内では末尾にパーセントを付けてそのアドレスが割り当てられたLANインターフェースを明示することもあります(%eth2)。

fe80::1ff:fe23:4567:890a%eth2

URLや各種設定ファイルに記載する場合、ポート番号と区別できるよう[...]で囲む場合もあります。

http://[2001:db8:85a3:8d3:1319:8a2e:370:7348]/
http://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:8080/

分類

IPv6アドレスの分類です。

IPv6対応のホストはループバックアドレスのほか、LAN内限定使用のリンクローカルアドレスをLANインターフェースあたり一個、必ず持ちます。 ルータで外部とつながったホストはLANインターフェースあたり一個以上のグローバルアドレスを持ちます。

IPv6アドレスはふつう、128ビットのIPv6アドレスの前半分(上位)の64ビットでネットワーク(prefixと呼ぶ)を表し、後ろ半分(下位)の64ビットでインターフェース(interface identifier)を表します。

Prefix Interafce
64 bits 64 bits

通常、ホストはルータからネットワーク番号(prefix)を知らせてもらい、下位のインターフェース番号(interface)は自分で決めます(SLAACと呼ばれる方式)。 決め方は様々でたいていはMACアドレスから計算した値を使います(たとえばEUI-64と呼ばれる方式)。 DHCPv6がある場合は与えられたアドレスを使います。

細かい話ですがほかに決め打ちの特殊なアドレスもあります。

(1) アプリが使用可能なサブネットルータへ至るAnycast address

Prefix Interface
64 bits 64 bits - all zero

(2) Anycast addressとして使ってよい範囲(特定プレフィックス内の最上位の128個のアドレス)

Prefix All ones Any cast ID
64 bits 57 bits 7 bits

割り当て

Wikipediaにあったアドレスブロックの割り当ての表を掲載します(若干修正)。 「IPv4」欄は「IPv4でいえばこれにあたる」というものです。

IPv6 IPv4 Description
::/0 0.0.0.0/0 Default route address
::/128 0.0.0.0/32 Unspecified address
::1/128 127.0.0.1/8 Loopback address (unicast localhost address)
::ffff:0:0/96 4/6 mapped - last 32bits = IPv4
::ffff:0:0:0/96 4/6 translated - ditto
64:ff9b::/96 "Well-Known" prefix for IPv4/IPv6 translation
100::/64 Discard prefix
2000::/3 global address Allocated for use on the Internet (1/8 of total space)
2001:678::/29 ditto Assigned directly to the end user by the RIRs
2001:7f8::/29 Internet Exchange Points (IXPs) are assigned special addresses from the range
2001::/32 Teredo tunneling
2001:db8::/32 93.184.216.34 (example.com), etc. Addresses used in documentation and example source code
2002::/16 92.88.99.0/24 6to4 addressing (deprecated)
fc00::/7 private address Unique local address
fe80::/10 169.254.0.0/16 Link-local address (only valid and unique on a single link)
ff0s::/8 Multicast address (s = scope)
ff02::1 255.255.255.255 All-nodes link-local multicast group
ff02::2 All-routers multicast

これまで見たものを列挙すると:

アドレスの振られ方

IPv4アドレスは枯渇状態のため、家庭やオフィスのLAN内ではプライベートアドレスを使い、インターネット側は、家庭やオフィスあるいは同一プロバイダを利用する加入者間で少数のグローバルアドレスを共有するのがふつうです。 サーバ側も少ない固定アドレスを複数のサーバで使いまわす(HTTPのバーチャルホストなど)がふつうです。

IPv6はアドレス空間が膨大なので、一個のLAN内で48ビット分のグローバルアドレスを自由に使う、などが可能とされています。 また、プライバシー保護のため、主にクライアント側ではちょくちょくグローバルアドレスを変更します。 将来はサーバ側であっても固定アドレスは使わないようになるかもしれません。

現在筆者が利用しているレンタルサービスでは一台で使えるIPv6アドレスは一個ですが(はっきりとはわからない)、いずれレンタルサーバ側でも一定範囲のIPv6アドレスが自由に使えるようになると期待しています。 ダイナミックDNSと組み合わせることでサーバのアドレスを可変にし、セキュリティを高めることも可能になると予想します。 また逆に、プロバイダやレンタルサービスを変えても同じIPv6アドレスを使い続けることが可能になる携帯電話のMNPのようなサービスも登場するかもしれません。

実際に世の中でIPv6アドレスがどのように割り振られている(いく)のかよくはわかりませんが、今後調べていきたいと思っています。

一例としてWindows 10 PCの場合をみてみます。

Windows 10

ある日のIPCONFIGの表示です。

Wireless LAN adapter Wi-Fi:

   接続固有の DNS サフィックス . . . . .:
   IPv6 アドレス . . . . . . . . . . . .: 240f:7c:xxxx:xxxx:xxxx:xxxx:e3e5:ea94
   一時 IPv6 アドレス. . . . . . . . . .: 240f:7c:xxxx:xxxx:xxxx:xxxx:1d21:f577
   リンクローカル IPv6 アドレス . . . . .: fe80::xxxx:xxxx:e3e5:ea94%26
   IPv4 アドレス . . . . . . . . . . . .: 192.168.0.11
   サブネット マスク  . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ  . . . . . . .: fe80::xxxx:xxxx:fec7:dab4%26
                                         192.168.0.1

翌日みてみると「IPv6アドレス」は変化なしですが「一時IPv6アドレス」が変わっています。

   一時 IPv6 アドレス. . . . . . . . . .: 240f:7c:xxxx:xxxx:xxxx:xxxx:c8b9:1f1b

先に見たとおり外部接続には一時IPv6アドレスが使われます。 「IPv6アドレス」や「一時IPv6アドレス」は、ルータから知らされたネットワーク番号(prefix)を持つ一定のアドレス範囲から、Windowsが一定の方法で決めて割り当てたものです。 「IPv6アドレス」は固定でおそらく外部からの接続用、外部へ出る場合はプライバシー保護のため固定ではない「一時IPv6アドレス」が使われます。

参考リンク

以上ですが、誤りや疑問点ご指摘などいただければさいわいです。 Twitterは告知用であまり見ないのでメールがありがたいです。


Presented by Kobu.Com

2021/03/14 Written
2021/03/17 Updated - 訂正 Ubuntu version 12.04 -> 20.04

Contact