Solaris の IPv6 の実装は、主にカーネルレベルとユーザーレベルの両方の TCP/IP スタックへの変更から構成されます。新しい IPv6 モジュールにより、トンネル、ルーター検索、ステートレスアドレス自動設定を使用できます。この章では、IPv6 の Solaris 実装に伴う概念について説明します。
この章では、以下の内容について説明します。
IPv4 から IPv6 への移行の一部として、IPv6 では IPv6 パケットを IPv4 パケット内にカプセル化する方式が指定されます。また、IPv6 では、IPv6 パケット内にカプセル化された IPv6 パケットも指定します。
IPv6 には、パケットの実際のカプセル化を行うモジュール tun(7M) が含まれます。このモジュールは、トンネルモジュールと呼ばれ、結合されます。このモジュールは、物理インタフェースと同様に ifconfig ユーティリティを使用して設定されます。このモジュールによってトンネルモジュールが IP デバイスと IP モジュール間に配置されます。トンネルデバイスにもシステムインタフェースリストにエントリがあります。
自動トンネリングの場合、IPv6 は 6to4tun.c モジュールを含みます。6to4 も、6to4 トンネルの作成時に一般的な tun.c モジュールを使用します。
IPv6 では、ifconfig(1M) ユーティリティも変更されます。IPv6 スタックは、ifconfig を使用して作成します。ifconfig は、この章で説明されている新しいパラメータもサポートするようになりました。
ルーター検索とステートレスアドレス自動設定を行うため、in.ndpd(1M) デーモンが追加されました。
IPv4 では起動時に /etc/hostname.interface を使用しましたが、IPv6 でも起動時にファイル /etc/hostname6.interface を使用してネットワークインタフェースを自動的に定義します。このとき、少なくとも /etc/hostname.* ファイルまたは、/etc/hostname6.* ファイルがローカルマシンに存在している必要があります。これらのファイルは、Solaris インストールプログラムで生成されます。IPv6 インタフェースは、Solaris インストールのあとで手動で追加することもできます。
ファイル名については、「interface」を主ネットワークインタフェースのデバイス名で置き換えます。
ファイル名の構文は、次のとおりです。
hostname.interface hostname6.interface |
interface の構文は、次のとおりです。
dev[.Module[.Module ...]]PPA |
Dev |
ネットワークインタフェースデバイス。デバイスは le、qe など物理ネットワークインタフェースか、トンネルなどの論理インタフェース。詳細については、IPv6 の Solaris トンネルインタフェースを参照してください。 |
Module |
結合される際にデバイスにプッシュされるストリームモジュールのリスト |
PPA |
物理的な接続ポイント |
構文 [.[.]] も可能です。
有効なファイル名は、次のとおりです。
hostname6.le0 hostname.ip.tun0 hostname.ip6.tun0 hostname6.ip6to4tun0 hostname6.ip.tun0 hostname6.ip6.tun0 |
IPv6 インタフェースの自動設定では、ノード側でそのリンクローカルアドレスを計算できます。このアドレスは、ノードのリンク層アドレス (つまりその Ethernet (MAC) アドレス) にもとづいたものです。そのため、IPv6 インタフェース構成ファイルにはエントリがないことがあります。その場合、起動スクリプトによってインタフェースが設定されます。ノードは近傍検索デーモン in.ndpd で他のアドレスやプレフィックスの情報を取り出します。
インタフェースに静的アドレスが必要な場合、 ifconfig ユーティリティを使用します。その結果、アドレスまたはホスト名が /etc/hostname6.interface (または /etc/hostname.interface) に保存されます。インタフェースが設定されるときに、その内容が ifconfig に渡されます。
この場合、ファイルに含まれるエントリは 1 つだけです。このエントリは、ネットワークインタフェースに関連付けられたホスト名または IP アドレスです。たとえば、ahaggar というマシンの一次ネットワークインタフェースが smc0 であるとします。その /etc/hostname6.* ファイル名は /etc/hostname6.smc0 となります。そのエントリは ahaggar です。
ネットワーキングの起動スクリプトでは、ルーティングデーモンとパケット転送を開始するために、インタフェース数と、/etc/inet/ndpd.conf ファイルの有無を調べます。Solaris IPv6 ルーターの設定方法を参照してください。
IPv6 実装向けに以下のユーティリティの追加または変更が行われました。
ifconfig – このコマンドは、IPv6 をサポートするためにいくつかの変更が加えられました。
6to4relay – このコマンドは、6to4 ルーターとリレールーター間にトンネルを設定します。
ifconfig ユーティリティにより、IPv6 インタフェースとトンネルモジュールを結合できるようになりました。ifconfig(1M) ユーティリティでは、ioctl の拡張セットで IPv4 ネットワークインタフェースと IPv6 ネットワークインタフェースの両方を設定します。次に、ifconfig に追加されたオプションを示します。このユーティリティによる診断手順については、インタフェースアドレス割り当ての表示方法を参照してください。
表 3–1 新しい ifconfig ユーティリティオプション
オプション |
説明 |
---|---|
index |
インタフェースインデックスを設定する |
tsrc/ tdst |
トンネルソース / 宛先を設定する |
addif |
論理インタフェースの次の候補を作成する |
removeif |
指定された IP アドレスの論理インタフェースを削除する |
destination |
インタフェースにポイントツーポイント宛先アドレスを設定する |
set |
インタフェースにアドレスとネットマスクのどちらか、または両方を設定する |
subnet |
インタフェースのサブネットアドレスを設定する |
xmit/ -xmit |
インタフェースにおけるパケット伝送を使用可能または使用不能する |
IPv6 設定手順については、IPv6 ノードを有効にするを参照してください。
次に示す ifconfig コマンドは、まず hme0:3 論理インタフェースを 1234::5678/64 IPv6 アドレスに作成します。次に up オプションでインタフェースを使用可能にし、状態を報告し、インタフェースを使用不可にします。最後に、インタフェースを削除します。
# ifconfig hme0 inet6 addif 1234::5678/64 up Created new logical interface hme0:3 # ifconfig hme0:3 inet6 hme0:3: flags=2000841<UP,RUNNING,MULTICAST,IPv6> mtu 1500 index 2 inet6 1234::5678/64 # ifconfig hme0:3 inet6 down # ifconfig hme0 inet6 removeif 1234::5678 |
次に示す ifconfig コマンドは、まず物理インタフェース名に関連付けられたデバイスを開きます。次に TCP/IP がデバイスを使用するために必要なストリームを構成し、デバイスの状態を報告し、トンネルのソースアドレスと宛先アドレスを構成します。最後に、構成後のデバイスの最新状態を報告します。
# ifconfig ip.tun0 inet6 plumb index 13 # ifconfig ip.tun0 inet6 ip.tun0: flags=2200850<POINTOPOINT,RUNNING,MULTICAST,NONUD, #IPv6> mtu 1480 index 13 inet tunnel src 0.0.0.0 inet6 fe80::/10 --> :: # ifconfig ip.tun0 inet6 tsrc 120.46.86.158 tdst 120.46.86.122 # ifconfig ip.tun0 inet6 ip.tun0: flags=2200850<POINTOPOINT,RUNNING,MULTICAST,NONUD, IPv6> mtu 1480 index 13 inet tunnel src 120.46.86.158 tunnel dst 120.46.86.122 inet6 fe80::8192:569e/10 --> fe80::8192:567a |
# ifconfig ip.6to4tun0 inet6 plumb # ifconfig ip.6to4tun0 inet tsrc 129.146.86.187 \ 2002:8192:56bb:1::8192:56bb/64 up |
# ifconfig ip.6to4tun0 inet6 ip.6to4tun0: flags=2200041<UP,RUNNING,NONUD,IPv6>mtu 1480 index 11 inet tunnel src 129.146.86.187 tunnel hop limit 60 inet6 2002:8192:56bb:1::8192:56bb/64 |
この 6to4 擬似インタフェース設定例は、サブネット ID として 1 を使用し、ホスト ID を 16 進形式で指定しています。
# ifconfig ip.6to4tun0 inet6 plumb # ifconfig ip.6to4tun0 inet tsrc 129.146.86.187 up |
# ifconfig ip.6to4tun0 inet6 ip.6to4tun0: flags=2200041<UP,RUNNING,NONUD,IPv6>mtu 1480 index 11 inet tunnel src 129.146.86.187 tunnel hop limit 60 inet6 2002:8192:56bb::1/64 |
6to4 トンネリングを使用すると、独立した 6to4 サイト間の通信が行えます。しかし、6to4 以外のネイティブ IPv6 サイトにパケットを転送する場合は、6to4 ルーターは 6to4 リレールーターとのトンネルを確立する必要があります。このトンネルが確立されると、6to4 リレールーターによって 6to4 パケットが IPv6 ネットワークに転送され、最終的にネイティブ IPv6 サイトに送信されます。6to4 サイトがネイティブ IPv6 サイトとデータを交換しなければならない場合は、6to4relay コマンドを使用して適切なトンネルを設定します。
リレールーターの使用は安全とは言えないため、Solaris オペレーティングシステムのデフォルト設定ではリレールーターとの間のトンネリングは無効になっています。このシナリオを実践に移す場合は、6to4 リレールーターとの間のトンネル構築に伴って発生する問題点をあらかじめ慎重に検討してください。6to4 リレールーターの詳細は、6to4 リレールーターとの間のトンネルについての考慮事項を参照してください。6to4 リレールーターのサポートを有効にする場合の関連作業については、6to4 リレールーターとの間の 6to4 トンネルの設定方法に示されています。
6to4relay -e [-a IPv4-address] -d -h |
6to4 ルーターとエニーキャスト 6to4 リレールーター間のトンネルサポートを有効にします。このオプションを指定すると、トンネルのエンドポイントアドレスが 192.88.99.1 (6to4 リレールーターのエニーキャストグループのデフォルトアドレス) に設定されます。
6to4 ルーターと指定された IPv4–address の 6to4 リレールーター間にトンネルを確立します。
6to4 リレールーターとの間のトンネリングのサポートを無効にします。これは、Solaris オペレーティングシステムのデフォルトの設定です。
6to4relay の使用方法に関するヘルプ情報を表示します。
詳細は、6to4relay(1M) のマニュアルページを参照してください。
引数を指定せずに 6to4relay を実行すると、6to4 リレールーターサポートの現在の状態が表示されます。最初の例はデフォルトの状態を示しています。
# /usr/sbin/6to4relay 6to4relay:6to4 Relay Router communication support is disabled |
リレールーターサポートが有効に設定されている場合には、6to4relay を実行すると次のように表示されます。
# /usr/sbin/6to4relay 6to4relay:6to4 Relay Router communication support is enabled IPv4 destination address of Relay Router=192.88.99.1 |
6to4relay に -a オプションと IPv4 アドレスを指定すると、192.88.99.1 ではなく、-a で指定した IPv4 アドレスが表示されます。
–d、–e、および -a IPv4 address オプションの実行が正常に完了した場合、6to4relay はそのことを報告しません。しかし、これらのオプションの実行時に発生した可能性のあるエラーは表示します。
ノードに複数のネットワークインタフェースがある場合、追加インタフェース用に /etc/hostname.interface ファイルを作成する必要があります。
たとえば、マシン timbuktu について考えてみます。このシステムは、『Solaris のシステム管理 (IP サービス)』の「相互接続された 3 つのネットワーク」に示されています。このシステムには、2 つのネットワークインタフェースがあり、ルーターとして機能します。プライマリネットワークインタフェース le0 は、ネットワーク 192.9.200 に接続されています。システムの IP アドレスは 192.9.200.70、ホスト名は timbuktu です。Solaris インストールプログラムによって、一次ネットワークインタフェースにファイル /etc/hostname.le0 が作成され、ホスト名 timbuktu がファイルに入力されます。
2 番めのネットワークインタフェースは le1 で、192.9.201 に接続されています。このインタフェースは timbuktu に物理的にインストールされていますが、独自の IP アドレスが必要です。そのため、このインタフェースに対して /etc/hostname.le1 ファイルを手動で作成する必要があります。このファイルのエントリはルーター名 timbuktu-201 です。
IPv6 を設定する場合、/etc/hostname6.le0 と /etc/hostname6.le1 のインタフェースだけが必要です。各インタフェースアドレスは、システムの起動時に自動的に設定されます。
ここでは、次の IPv6 デーモンについて説明します。
in.ndpd – IPv6 自動設定用のデーモン
in.ripngd – IPv6 のネットワークルーティングデーモン
inetd – インターネットサービスデーモン
このデーモンはルータ発見を実装します。 デーモンは、IPv6 の自動アドレス設定も実装します。 表 3–4 は、サポートされているオプションを示します。
表 3–2 in.ndpd デーモンのオプション
オプション |
説明 |
---|---|
-d |
すべてのイベントのデバッグをオンにする |
-D |
特定のイベントのデバッグをオンにする |
-f |
設定を読み出す元のファイル (デフォルトファイルのかわり) |
-I |
インタフェースごとに関連情報を印刷する |
-n |
ルーター通知をループバックしない |
-r |
受信パケットを無視する |
-v |
冗長モード (さまざまな種類の診断メッセージを報告する) |
-t |
パケット追跡をオンにする |
パラメータは、in.ndpd の動作を制御します。これらのパラメータは /etc/inet/ndpd.conf 設定ファイルと /var/inet/ndpd_state.interface 設定ファイル (存在する場合) に設定されます。
/etc/inet/ndpd.conf が存在すると構文解析され、ノードをルーターとして使用するための設定が行われます。表 3–3 に、このファイルに出現する可能性がある各種キーワードをまとめます。ホストを起動しても、ルータがすぐには使用できない場合があります。ルータによって通知されたパケットがドロップしたり、また、通知されたパケットがホストに届かない場合もあります。/var/inet/ndpd_state.interface ファイルは状態ファイルです。このファイルはノードごとに定期的に更新されます。ノードに障害が発生し再起動した場合、ルーターがなくてもノードはインタフェースを設定できます。このファイルにはインタフェースアドレス、更新時間、有効期間などの情報が保存されています。また、先のルーター通知で得られた情報も保存されています。
状態ファイルの内容を変更する必要はありません。このファイルは、in.ndpd デーモンが自動的に管理します。
キーワード |
説明 |
---|---|
ifdefault |
すべてのインタフェースのルーターの動作を指定する。次の構文を使用してルーターパラメータと対応する値を設定する ifdefault [variable value] |
prefixdefault |
プレフィックス通知のデフォルトの動作を指定する。次の構文を使用してルーターパラメータと対応する値を設定する prefixdefault [variable value] |
if |
インタフェース別パラメータを設定する。構文は次のとおり if interface [variable value] |
prefix |
インタフェース別プレフィックス情報を通知する。構文は次のとおり prefix prefix /length interface [variable value] |
ifdefault と prefixdefault エントリは、設定ファイルの if エントリと prefix エントリの前に置く必要があります。
設定変数と設定できる値については、in.ndpd(1M) と ndpd.conf(4) のマニュアルページを参照してください。
次の例は、コメント行のテンプレートと、キーワードと設定変数の使用方法を示します。
# ifdefault [variable value]* # prefixdefault [variable value]* # if ifname [variable value]* # prefix prefix/length ifname # # Per interface configuration variables # #DupAddrDetectTransmits #AdvSendAdvertisements #MaxRtrAdvInterval #MinRtrAdvInterval #AdvManagedFlag #AdvOtherConfigFlag #AdvLinkMTU #AdvReachableTime #AdvRetransTimer #AdvCurHopLimit #AdvDefaultLifetime # # Per Prefix: AdvPrefixList configuration variables # # #AdvValidLifetime #AdvOnLinkFlag #AdvPreferredLifetime #AdvAutonomousFlag #AdvValidExpiration #AdvPreferredExpiration ifdefault AdvReachableTime 30000 AdvRetransTimer 2000 prefixdefault AdvValidLifetime 240m AdvPreferredLifetime 120m if qe0 AdvSendAdvertisements 1 prefix 2:0:0:56::/64 qe0 prefix fec0:0:0:56::/64 qe0 if qe1 AdvSendAdvertisements 1 prefix 2:0:0:55::/64 qe1 prefix fec0:0:0:56::/64 qe1 if hme1 AdvSendAdvertisements 1 prefix 2002:8192:56bb:1::/64 qfe0 if hme1 AdvSendAdvertisements 1 prefix 2002:8192:56bb:2::/64 hme1 |
in.ripngd デーモンは、IPv6 ルーターの RIP 次世代ルーティングプロトコルを実装します。このプロトコルは、IPv6 用の RIP に相当する内容を定義します。RIP は、広く使用されている IPv4 ルーティングプロトコルで、Bellman-Ford 距離ベクトルアルゴリズムに基づいています。表 3–4 は、サポートされているオプションを示します。
表 3–4 in.ripngd デーモンのオプション
オプション |
説明 |
-p n |
n は RIPNG パケットの送受信に使用する代替ポート番号を指定する |
-q |
ルーティング情報を打ち切る |
-s |
デーモンがルーターとして動作している場合でもルーティング情報の提供を強制する |
-P |
ポイズンリバースを打ち切る |
-S |
in.ripngd がルーターとして機能しない場合、各ルーターにはデフォルトのルートだけが指定される |
IPv6 有効化サーバーは、IPv4 アドレスか IPv6 アドレスを処理できるサーバーです。IPv6 有効化サーバーは、対応するクライアントで使用しているプロトコルと同じプロトコルを使用します。/etc/inet/inetd.conf ファイルには、inetd(1M) がソケット経由でインターネット要求を受信したときに呼び出すサーバーリストが保存されています。ソケットベースのインターネットサーバーエントリはそれぞれ、次の構文を使用する 1 行です。
service_name socket_type proto flags user server_pathname args |
各フィールドに指定できる値については、inetd.conf(4) のマニュアルページを参照してください。Solaris オペレーティング環境の場合、IPv6 有効化としてサービスを /etc/inet/inetd.conf ファイルに指定するには、proto フィールドに tcp6 または udp6 を指定します。サービスが IPv4 専用の場合、proto フィールドは tcp または udp として指定します。サービスの proto 値に tcp6 または udp6 を指定すると、inetd は所定のデーモンに AF_INET6 ソケットを渡します。
inetd.conf ファイルの次のエントリは、IPv4 クライアントアプリケーションと IPv6 クライアントアプリケーションの両方と通信できる udp サーバー (myserver) を表します。
myserver dgram udp6 wait root /usr/sbin/myserver myserver |
IPv6 有効化サーバーは、AF_INET (IPv4 専用) ソケットまたは AF_INET6 (IPv6 と IPv4) ソケットを inetd から継承できます。サービスに対して proto 値は、tcp6、 udp6、tcp または udp として指定されています。この種のサーバーでは、2 つの inetd.conf エントリを指定できます。1 つは proto を tcp として、もう1 つは proto を tcp6 として指定できます。
AF_INET6 ソケットは、IPv4 プロトコルと IPv6 プロトコルのどちらでも使用できるため、proto 値 tcp6 (udp6) を指定すれば充分です。
各種 IPv6 有効化サーバーの記述方法については、『プログラミングインタフェース』を参照してください。
Solaris ソフトウェアとともに提供されるサーバーはすべて、proto 値を tcp6 または udp6 と指定する inetd エントリが1 つあれば十分です。ただし、リモートシェルサーバー (shell) とリモート実行サーバー (exec) のエントリには、tcp と tcp6 の両方の proto 値を指定する必要があります。例 3–6 は、rlogin、telnet、shell、exec 用の inetd エントリです。
login stream tcp6 nowait root /usr/sbin/in.rlogind in.rlogind telnet stream tcp6 nowait root /usr/sbin/in.telnetd in.telnetd shell stream tcp nowait root /usr/sbin/in.rshd in.rshd shell stream tcp6 nowait root /usr/sbin/in.rshd in.rshd exec stream tcp nowait root /usr/sbin/in.rexecd in.rexecd exec stream tcp6 nowait root /usr/sbin/in.rexecd in.rexecd |
TCP ラッパーは、telnet などさまざまなネットワークサービスで入力要求を監視、フィルタ処理するためのパブリックドメインユーティリティです。以上のユーティリティの server_pathname として TCP ラッパーを指定する場合、TCP ラッパーが IPv6 対応である必要があります。対応していない場合、TCP ラッパーで使用するサービスの proto を tcp か udp に指定する必要があります。
また、Solaris ユーティリティを別の実装と入れ替える場合、そのサービスの実装が IPv6 をサポートしていることを確認する必要があります。サポートしていない場合、その実装の proto を tcp か udp に指定する必要があります。
proto 値を tcp か udp のどちらか一方に指定すると、サービスでは IPv4 だけが使用されます。IPv4 接続と IPv6 接続の両方を有効にするには、proto 値を tcp6 か udp6 に指定する必要があります。サービスで IPv6 をサポートしていない場合、tcp6 や udp6 は指定しないでください。
ソケットを使用する IPv6 有効化サーバーについては、『プログラミングインタフェース』のソケット API への IPv6 拡張機能についての説明を参照してください。
ユーザーレベルインタフェースでは、次のユーティリティの組み込み拡張機能も変更されました。
netstat(1M)
snoop(1M)
route(1M)
ping(1M)
traceroute(1M)
ifconfig(1M) ユーティリティも変更されました。詳細については、ifconfig ユーティリティに対する IPv6 拡張機能を参照してください。
IPv4 ネットワーク状態の表示の他、netstat では IPv6 ネットワーク状態も表示できます。/etc/default/inet_type ファイルと -f コマンド行オプションで DEFAULT_IP 値を設定して、表示するプロトコル情報を選択できます。DEFAULT_IP のパラメータ設定では、netstat に IPv4 情報だけが表示されていることを確認できます。この設定は、-f オプションで無効にできます。inet_type ファイルの詳細については、inet_type(4) のマニュアルページを参照してください。
新しい -p オプションでは、net-to-media テーブルが表示されます。これは、IPv4 用の ARP テーブルであり、IPv6 用の近傍キャッシュです。詳細については、netstat(1M) のマニュアルページを参照してください。このコマンドの使用方法については、ネットワーク状態の表示方法を参照してください。
snoop コマンドは、IPv4 パケットと IPv6 パケットの両方を取り込んで、IPv6 ヘッダー、IPv6 拡張ヘッダー、ICMPv6 ヘッダー、近傍検索プロトコルデータを表示できます。 デフォルトで、snoop コマンドは、IPv4 パケットと IPv6 パケットの両方を表示します。ip プロトコルキーワードか ip6 プロトコルキーワードを指定すると、snoop コマンドは IPv4 パケットか IPv6 パケットのどちらかだけを表示します。IPv6 フィルタオプションでは、すべてのパケットをフィルタの対象にでき (IPv4 と IPv6 の両方)、IPv6 パケットだけが表示されます。詳細については、snoop(1M) のマニュアルページを参照してください。このコマンドの使用方法については、IPv6 ネットワークトラフィックの監視方法を参照してください。
このユーティリティは、IPv4 ルーターと IPv6 ルーターの両方で実行できます。デフォルトで、route は IPv4 ルートで実行します。コマンド行で route コマンドの直後にオプション -inet6 を指定すると、操作が IPv6 ルートで実行されます。詳細については、route(1M) のマニュアルページを参照してください。
ping コマンドは、IPv4 プロトコルと IPv6 プロトコルの両方で、宛先ホストを調べることができます。プロトコル選択は、指定の宛先ホストのネームサーバーが戻すアドレスに依存します。デフォルトでネームサーバーが、宛先ホストの IPv6 アドレスを戻すと、ping コマンドは IPv6 プロトコルを使用します。サーバーが IPv4 アドレスだけを戻すと、IPv4 プロトコルを使用します。-A コマンド行オプションで使用するプロトコルを指定すれば、この動作を無効にできます。
そのほか、-a コマンド行オプションを指定すれば、マルチホーム宛先ホストのアドレスをすべて ping できます。詳細については、ping(1M) のマニュアルページを参照してください。このコマンドの使用方法については、すべてのマルチホームホストアドレスの探査方法を参照してください。
traceroute コマンドを使用して、指定ホストまでの IPv4 ルートと IPv6 ルートの両方をトレースできます。使用するプロトコルの選択について、traceroute では、ping と同じアルゴリズムを使用します。選択を無効にするには、-A コマンド行オプションを使用します。マルチホームホストのすべてのアドレスまでの各ルートは -a コマンド行オプションでトレースできます。traceroute(1M) のマニュアルページを参照してください。
netstat コマンドと ifconfig コマンドによる出力表示の方法を制御できます。
DEFAULT_IP の値は、IP_VERSION4、IP_VERSION6、BOTH のどれかに設定できます。DEFAULT_IP を指定してこのファイルを作成しない場合、netstat と ifconfig では、両方のバージョンが表示されます。
inet キーワードオプションと inet6 キーワードオプションは、netstat コマンドと ifconfig コマンドの使用時に inet_type ファイルで設定した値を無効にします。
操作については、IPv6 関連コマンドの出力表示の制御方法を参照してください。
IPv4 ネットワーク経由で IPv6 パケットをカプセル化する方法としてもっとも望ましいのは、6to4 ルーティングを使用することです。6to4 は、tun を使用して自動的にトンネルを作成します。6to4 ルーティングの詳細は、移行機構としての 6to4を参照してください。6to4 トンネルの設定作業については、6to4 ルーターの設定方法を参照してください。
トンネルインタフェースのフォーマットは次のとおりです。
ip.tun ppa |
ppa は物理的な接続ポイントです。
システム起動時に、トンネルモジュール (tun) は、(ifconfig によって) IP の最上位にプッシュされ、仮想インタフェースが作成されます。このプッシュは、hostname6.* ファイルを作成することによって行われます。
たとえば、IPv4 ネットワーク経由で IPv6 パケットをカプセル化するためのトンネルを作成するには、次のファイルを作成します。
/etc/hostname6.ip.tun0 |
このファイルの内容は、インタフェースが結合された後に ifconfig(1M) に渡されます。ポイントツーポイントトンネルの設定に必要なパラメータになります。
次のリストは、hostname6.ip.tun0 ファイルのエントリの例です。
tsrc 120.68.100.23 tdst 120.68.7.19 up addif 1234:1234::1 5678:5678::2 up |
この例では、IPv4 ソースと宛先アドレスは、IPv6 リンクローカルアドレスを自動設定するためのトークンとして使用されます。これらのアドレスは、 ip.tun0 インタフェースのソースと宛先アドレスです。次の 2 つのインタフェース ip.tun0 インタフェースと、論理インタフェース ip.tun0:1 が設定されます。 論理インタフェースには、addif コマンドによって指定されたソースと宛先 IPv6 アドレスがあります。
すでに述べたとおり、システムをマルチユーザーとして起動すると、これらの設定ファイルの内容が変更されずに ifconfig に渡されます。上の例は次の内容と同じです。
# ifconfig ip.tun0 inet6 plumb # ifconfig ip.tun0 inet6 tsrc 120.68.100.23 tdst 120.68.7.19 up # ifconfig ip.tun0 inet6 addif 1234:1234::1 5678:5678::2 up |
このトンネルにおける ifconfig -a の出力は次のとおりです。
ip.tun0: flags=2200850<UP,POINTOPOINT,RUNNING,MULTICAST, NONUD,IPv6> mtu 1480 index 6 inet tunnel src 120.68.100.23 tunnel dst 120.68.7.19 inet6 fe80::c0a8:6417/10 --> fe80::c0a8:713 ip.tun0:1: flags=2200850<UP,POINTOPOINT,RUNNING,MULTICAST,NONUD,IPv6> mtu 1480 index 5 inet6 1234:1234::1/128 --> 5678:5678::2 |
次の構文で設定ファイルに行を追加すれば、さらに論理インタフェースを設定できます。
addif IPv6-source IPv6-destination up |
トンネルのどちらかの端がトンネル経由で 1 つ以上のプレフィックスを通知する IPv6 ルータである場合、トンネル設定ファイルには addif コマンドは必要ありません。 他のアドレスは自動設定されるため、必要とされる可能性があるのは tsrc と tdst だけです。
場合によっては、特定のトンネルについて、固有のソースリンクローカルアドレスと宛先リンクローカルアドレスを手動で設定する必要があることもあります。その場合、設定ファイルの最初の行を変更して、これらのリンクローカルアドレスを組み込みます。次に例を示します。
tsrc 120.68.100.23 tdst 120.68.7.19 fe80::1/10 fe80::2 up |
ソースリンクローカルアドレスには、長さが 10 のプレフィックスがあります。この例では、ip.tun0 インタフェースは次のようになります。
ip.tun0: flags=2200850<UP,POINTOPOINT,RUNNING,MULTICAST,NONUD,IPv6> mtu 1480 index 6 inet tunnel src 120.68.100.23 tunnel dst 120.68.7.19 inet6 fe80::1/10 --> fe80::2 |
IPv6 ネットワーク (IPv6 経由の IPv6) 経由で IPv6 パケットをカプセル化するためのトンネルを作成するには、次のファイルを作成します。
/etc/hostname6.ip6.tun0 |
次のリストは、hostname6.ip6.tun0 ファイルのエントリの例です。
tsrc 2000::114:a00:20ff:fe72:668c tdst 2000::103:a00:20ff:fe9b:a1c3 fe80::4 fe80::61 up |
IPv6 ネットワーク (IPv6 経由の IPv4) 経由で IPv4 パケットをカプセル化するためのトンネルを作成するには、次のファイルを作成します。
/etc/hostname.ip6.tun0 |
次のリストは、hostname.ip6.tun0 ファイルのエントリの例です。
tsrc 2000::114:a00:20ff:fe72:668c tdst 2000::103:a00:20ff:fe9b:a1c3 10.0.0.4 10.0.0.61 up |
IPv4 ネットワーク (IPv4 経由の IPv4) 経由で IPv4 パケットをカプセル化するためのトンネルを作成するには、次のファイルを作成します。
/etc/hostname.ip.tun0 |
次のリストは、hostname.ip.tun0 ファイルのエントリの例です。
tsrc 120.46.86.158 tdst 120.46.86.122 10.0.0.4 10.0.0.61 up |
tun の固有の情報については、tun(7M) のマニュアルページを参照してください。IPv6 への移行時のトンネルの概念の一般的な説明については、トンネル機構を参照してください。トンネルの設定方法については、IPv4 トンネルによる IPv6 の設定方法を参照してください。
ここでは、IPv6 の実装により導入されたネーミングの変更について説明します。IPv6 アドレスは Solaris ネームサービス (NIS、NIS+、DNS およびファイル) のどれでも保存できます。また、IPv6 RPC トランスポートで NIS と NIS+ を使用して NIS データまたは NIS+ データを検出することもできます。
/etc/inet/ipnodes ファイルには、IPv4 と IPv6 のアドレスが格納されています。このファイルはローカルデータベースとして、ホスト名を IPv4 アドレスや IPv6 アドレスに関連付けます。ホスト名やそのアドレスは、/etc/inet/ipnodes などの静的ファイルには保存しないでください。ただし、テスト目的の場合は IPv4 アドレスを /etc/inet/hosts に保存するのと同じ方法で IPv6 アドレスを保存します。ipnodes ファイルでは、hosts ファイルと同じフォーマット変換を使用します。hosts ファイルの説明は、『Solaris のシステム管理 (IP サービス)』の「ネットワーク構成手順」を参照してください。ipnodes ファイルについては、ipnodes(4) のマニュアルページを参照してください。
IPv6-aware (IPv6 が利用可能な) ユーティリティでは、新しい /etc/inet/ipnodes データベースを使用します。既存の /etc/hosts データベースには、IPv4 アドレスだけを保存していますが、既存のアプリケーションの便宜上、このデータベースは変更されません。ipnodes データベースがない場合、IPv6-aware ユーティリティでは既存の hosts データベースを使用します。
アドレスを追加する必要がある場合、IPv4 アドレスは hosts ファイルと ipnodes ファイルの両方に追加しなければなりません。IPv6 アドレスは ipnodes ファイルにだけ追加します。
# # Internet IPv6 host table # with both IPv4 and IPv6 addresses # ::1 localhost 2::9255:a00:20ff:fe78:f37c fripp.guitars.com fripp fripp-v6 fe80::a00:20ff:fe78:f37c fripp-11.guitars.com frippll 120.46.85.87 fripp.guitars.com fripp fripp-v4 2::9255:a00:20ff:fe87:9aba strat.guitars.com strat strat-v6 fe80::a00:20ff:fe87:9aba strat-11.guitars.com stratll 120.46.85.177 strat.guitars.com strat strat-v4 loghost |
上記の例のように、ホスト名アドレスは、ホスト名でグループにまとめる必要があります。
NIS 用に 2 つの新しいマップが追加されました。 ipnodes.byname と ipnodes.byaddr です。/etc/inet/ipnodes と同様に、これらのマップには、IPv4 情報と IPv6 情報の両方が保存されます。既存の hosts.byname と hosts.byaddr マップは、IPv4 情報だけを保存しています。既存のアプリケーションの便宜上変更されていません。
NIS+ 用に ipnodes.org_dir という新しいテーブルが追加されました。このテーブルには、ホスト用の IPv4 アドレスと IPv6 アドレスの両方が保存されています。既存の hosts.org_dir テーブルは IPv4 アドレス情報だけを保存しています。このテーブルは、既存のアプリケーションの便宜上変更されていません。
AAAA レコードとして定義された新しいリソースレコードが、RFC 1886 で定義されています。このAAAA レコードは、ホスト名を 128 ビット IPv6 アドレスにマップします。PTRレコードは IPv6 でも、IP アドレスをホスト名にマップするときに使用されています。128 ビットアドレスの 32 の 4 ビットニブルは、IPv6 アドレス用に反転されています。各ニブルは対応する 16 進 ASCII 値に変換されます。変換後、ip6.int が追加されます。
/etc/inet/ipnodes で IPv6 アドレスを調べる機能に加え、IPv6 サポートは、NIS ネームサービス、NIS+ ネームサービス、DNS ネームサービスに追加されています。その結果、nssiwtch.conf(4) ファイルは IPv6 検索をサポートするように変更されました。ipnodes 行が /etc/nsswitch.conf ファイルに追加されました。この追加により、Solaris ネームサービス (NIS、NIS+、DNS、ファイル) の新しいデータベースで検索が可能になりました。次の太字で示された行は、ipnodes エントリの例です。
hosts: files dns nisplus [NOTFOUND=return] ipnodes: files dns nisplus [NOTFOUND=return] |
IPv4 アドレスと IPv6 アドレスでこれらの ipnodes データベースを生成してから、複数のネームサービスで ipnodes を探すように /etc/nsswitch.conf ファイルを変更してください。ホストアドレスの解決時に不要な遅延が発生してしまうからです (起動タイミングの遅れが発生することもあります)。
図 3–1 は、gethostbyname() コマンドと getipnodebyname() コマンドを使用するアプリケーションにおける、nsswitch.conf ファイルと新しいネームサービスデータベースの新しい関係を示します。斜体の項目は新規です。gethostbyname() コマンドは、/etc/inet/hosts に保存されている IPv4 アドレスだけを調べます。getipnodebyname() コマンドは、nsswitch.conf ファイルの ipnodes エントリで指定したデータベースを調べます。検索に失敗すると、nsswitch.conf ファイルの hosts エントリで指定したデータベースを調べます。
ネームサービスの詳細については、『Solaris のシステム管理 (ネーミングとディレクトリサービス : DNS、NIS、LDAP 編)』を参照してください。
IPv6 をサポートできるように、既存のネームサービスコマンドで IPv6 アドレスを調べることができます。たとえば、ypmatch コマンドは、新しい NIS マップに使用できます。nismatch コマンドは、新しい NIS+ テーブルに使用できます。nslookup コマンドでは、DNS の新しい AAAA レコードを調べることができます。ネームサービスの変更については、IPv6 の NIS 拡張機能、IPv6 の NIS+ 拡張機能、および IPv6 の DNS 拡張機能を参照してください。
これらのコマンドの使用手順については、IPv6 ネームサービス情報の表示を参照してください。
NFS と RPC ソフトウェアは、シームレスに IPv6 をサポートします。NFS サービスに関連のある既存のコマンドは変更されていません。ほとんどの RPC アプリケーションが、変更なしで IPv6 で実行できます。トランスポート機能のある一部の高度 RPC アプリケーションに更新が必要な場合があります。
Solaris オペレーティング環境では、IPv6 経由の ATM、固定仮想回路 (PVC)、静的な交換仮想回路 (SVC) をサポートするようになりました。