EN JA
INET6(4)
INET6(4) FreeBSD Kernel Interfaces Manual INET6(4)

名称

inet6インターネットプロトコルバージョン 6 ファミリ

書式

#include < sys/types.h>
#include < netinet/in.h>

解説

inet6 ファミリは、 inet(4) ファミリのアップデートされたバージョンです。 inet(4) は、インターネットプロトコルバージョン 4 を実装していますが、 inet6 は、インターネットプロトコルバージョン 6 を実装しています。

inet6 は、 インターネットプロトコルバージョン 6 (IPv6) トランスポートレイヤ (層) と、IPv6 アドレス形式を利用するプロトコルを集めたものです。 inet6 ファミリは、 SOCK_STREAM, SOCK_DGRAMSOCK_RAW ソケットタイプのためのプロトコルのサポートを行ないます。 SOCK_RAW インタフェースは、 IPv6 プロトコルへのアクセスを提供します。

アドレッシング

IPv6 アドレスは、ネットワーク標準のバイト順で格納された 16 バイトの大きさです。インクルードファイル < netinet/in.h> は、このアドレスを区別された共用体 (ユニオン) として定義しています。

inet6 ファミリにバインド (結合) されたソケットは、次のアドレス構造体を利用します:

struct sockaddr_in6 { 
 uint8_t  sin6_len; 
 sa_family_t sin6_family; 
 in_port_t sin6_port; 
 uint32_t sin6_flowinfo; 
 struct in6_addr sin6_addr; 
 uint32_t sin6_scope_id; 
};

ソケットは、着信メッセージで“ワイルドカード”マッチングに影響するようにローカルアドレス (IPv6 アドレス 0:0:0:0:0:0:0:0 と等しい) “ ::”で作成されます。

IPv6 仕様は、リンクローカルまたはサイトローカルのアドレスのような、スコープアドレスを定義します。スコープアドレスは、それがスコープ識別子なしで指定されるなら、カーネルには、あいまいです。ユーザランドからスコープアドレスを適切に操作するためには、プログラムは、RFC2292 で定義された高度な API を使用しなければなりません。高度な API のコンパクトな記述は、 ip6(4) で利用可能です。スコープアドレスが明白なスコープなしで指定されるなら、カーネルは、エラーを引き起こします。仕様と実装観点の両方からスコープアドレスがこの時点で日常使用されないことに注意してください。

KAME 実装は、“ fe80::1%de0”が“ fe80::1 on de0 interface”を指定するように、リンクローカルのアドレスのための拡張数値 IPv6 アドレス記法をサポートします。この記法は、 getaddrinfo(3)getnameinfo(3) でサポートされます。 telnet(1)ftp(1) のようないくつかの普通のユーザランドプログラムがこの記法を使用することができます。 ping6(8) のような特別なプログラムでは、利用者は、スコープアドレスのあいまいさを取り除くために特別なコマンドラインオプションで、発信インタフェースを指定することができます。

スコープアドレスは、特にカーネルで取り扱われます。ルーティングテーブルまたはインタフェース構造体のようなカーネル構造体では、スコープアドレスのインタフェース指標 (インデックス) をアドレスに埋め込みます。したがって、いくつかのカーネル構造体のアドレスは、固定のものとは、同じではありません。組み込まれた指標は、 PF_ROUTE ソケットを介して、 kvm(3) を通したカーネルメモリアクセスを介して、およびある別の方法で目に見えるようになります。しかしながら、ユーザは、組み込まれたフォーム (形式) を決して使用すべきではありません。詳細に関しては、KAME キットで供給されている IMPLEMENTATION (実装) を調べてください。

プロトコル

inet6 ファミリは、 IPv6 ネットワークプロトコル、インターネットコントロールメッセージプロトコルバージョン 6 (ICMPv6)、トランスミッション (送信) コントロールプロトコル (TCP)、とユーザデータグラムプロトコル (UDP) から成っています。 TCP は、 UDP が SOCK_DGRAM アブストラクションをサポートするために使用されている間に、 SOCK_STREAM アブストラクションをサポートするのに使用されます。 TCP と UDP が inet(4)inet6 で共通であることに注意してください。 IPv6 のための生の (raw) インタフェースは、タイプ SOCK_RAW のインターネットソケットを作成することによって利用可能です。 ICMPv6 メッセージプロトコルは、生の (raw) ソケットからアクセス可能です。

MIB 変数

多くの変数は、 sysctl(3) MIB の net.inet6 ブランチで実装されます。 (それぞれのマニュアルページで参照される) 転送プロトコルによってサポートされた変数に加えて、次の一般的な変数が定義されています:
IPV6CTL_FORWARDING
(ip6.forwarding) ブール値: IPv6 パケットの転送を有効/無効にする。また、ノードがルータとして機能しているかどうかを識別します。デフォルトは、オフです。
IPV6CTL_SENDREDIRECTS
(ip6.redirect) ブール値: 転送されない IPv6 パケットの応答において、 ICMPv6 リダイレクトの送信を有効/無効にする。このオプションは、ノードがルーティング IPv6 パケットでないなら無視され、通常、すべてのシステムで有効にされるはずです。デフォルトは、オンです。
IPV6CTL_DEFHLIM
(ip6.hlim) 整数: 発信 IPv6 パケットに使用するデフォルトの中継限界数 (hop limit) です。この値は、 IPv6 上ですべての転送プロトコルに適用されます。値を上書きするための API があります。
IPV6CTL_MAXFRAGPACKETS
(ip6.maxfragpackets) 整数: ノードが受け付ける断片化されたパケットのデフォルトの最大数です。 0 は、ノードがどんな断片化されたパケットも受け付けないことを意味します。 -1 は、ノードが受信するあるだけの断片化されたパケットを受け付けることを意味します。このフラグは、起こり得る DoS 攻撃を避けるために基本的に提供されています。
IPV6CTL_ACCEPT_RTADV
(ip6.accept_rtadv) ブール値: ICMPv6 ルータ通知パケットの受信とアドレスプレフィックス (接頭辞) とデフォルトルータの自動設定を有効/無効にするためのインタフェースフラグ毎のデフォルト値。ノードは、オプションが意味があるためには (ルータではなく) ホストでなければなりません。デフォルトは、オフです。
IPV6CTL_AUTO_LINKLOCAL
(ip6.auto_linklocal) ブール値: 自動的なリンクローカルアドレス設定を実行することを有効/無効にするためのインタフェースフラグ毎のデフォルト値。デフォルトでオン。
IPV6CTL_KEEPFAITH
(ip6.keepfaith) ブール値: カーネルにおいて“FAITH” TCP リレー (中継) IPv6-to-IPv4 変換コードを有効/無効にする。詳細については、 faith(4)faithd(8) を参照してください。デフォルトは、オフです。
IPV6CTL_LOG_INTERVAL
(ip6.log_interval) 整数: IPv6 パケット転送エンジンのログ出力のデフォルトの間隔 (秒単位) です。
IPV6CTL_HDRNESTLIMIT
(ip6.hdrnestlimit) 整数: 着信 IPv6 パケット上で許された最大の IPv6 拡張ヘッダのデフォルト数です。 0 に設定されると、ノードは、できるだけ多くの拡張ヘッダを受け付けます。
IPV6CTL_DAD_COUNT
(ip6.dad_count) 整数: IPv6 DAD (複製されたアドレス検出 (duplicated address detection)) プローブパケットのデフォルト数です。 IPv6 インタフェースアドレスが設定されるとき、パケットは、生成されます。
IPV6CTL_AUTO_FLOWLABEL
(ip6.auto_flowlabel) ブール値: 未解決の接続転送プロトコルパケットのために IPv6 フローラベルフィールドの自動充てんを有効/無効にする。このフィールドは、中間ルータによってパケットのフローを識別するために使用されます。デフォルトは、オンです。
IPV6CTL_DEFMCASTHLIM
(ip6.defmcasthlim) 整数: ノードを始点とする IPv6 マルチキャストパケットのためのデフォルトの中継限界数 (hop limit) 値です。この値は、 IPv6 上ですべての転送プロトコルに適用されます。 ip6(4) に文書化されるように値を上書きする API があります。
IPV6CTL_GIF_HLIM
(ip6.gifhlim) 整数: gif(4) トンネルインタフェースによって生成された IPv6 パケットのためのデフォルトの最大の中継限界数 (hop limit) 値です。
IPV6CTL_KAME_VERSION
(ip6.kame_version) 文字列: カーネルで実装された KAME IPv6 スタックのバージョンを識別します。
IPV6CTL_USE_DEPRECATED
(ip6.use_deprecated) ブール値: RFC2462 5.5.4 で明記された推奨されないアドレスの使用を有効/無効にする。デフォルトは、オンです。
IPV6CTL_RR_PRUNE
(ip6.rr_prune) 整数: IPv6 ルータのリナンバリングプレフィックス (接頭辞) ベビーシッタのデフォルトの間隔 (秒単位) です。
IPV6CTL_V6ONLY
(ip6.v6only) ブール値: AF_INET6 ソケットにおける IPv4 マップアドレスの禁止を有効/無効にする。デフォルトは、オンです。
IPV6CTL_RTEXPIRE
(ip6.rtexpire) 整数: 最後の参照が落されたの後、プロトコルのクローンされた IP ルートの秒単位の生存期間です (デフォルトは、1 時間)。
IPV6CTL_RTMINEXPIRE
(ip6.rtminexpire) 整数: ip.rtexpire の最小の値です (デフォルトは、10 秒)。
IPV6CTL_RTMAXCACHE
(ip6.rtmaxcache) 整数: キャッシュされ、参照されない、動的な適合を開始するプロトコルのクローンされたルートのトリガレベルです (デフォルトは、128)。

IPv4/v6 ソケット間の相互関係

デフォルトで、 FreeBSD は、IPv4 トラフィックを AF_INET6 ソケットに経路制御しません。デフォルトの振る舞いは、セキュリティのために故意に RFC2553 に違反します。利用者が IPv4 と IPv6 トラフィックの両方を受け付けたいなら、2 つのソケットを listen (接続を受け付け) してください。 IPv4 トラフィックは、あるソケット毎/ノード毎 (per-socket/per-node) 設定で経路制御されるかもしれません、しかしながら、そうするのは、勧められません。詳細については、 ip6(4) を調べてください。

AF_INET6 TCP/UDP ソケットの振る舞いは、RFC2553 に文書化されています。基本的なものを次に示します:

  • AF_INET6 ソケット (アドレスが指定されている bind(2)) での特定のバインドは、そのアドレスのためだけに IPv6 トラフィックを受け付けるべきです。
  • 利用者が AF_INET6 ソケット (IPv6 アドレス :: にバインド bind(2) する) でワイルドカードバインドを実行して、その TCP/UDP ポートでワイルドカードバインド AF_INET ソケットがなければ、 IPv4 トラフィックと同様に IPv6 トラフィックは、その AF_INET6 ソケットにルートされるべきです。 IPv4 トラフィックは、 ::ffff:10.1.1.1 のような IPv6 アドレスから来るかのように見えるはずです。これは、IPv4 マップアドレスと呼ばれます。
  • 1 つの TCP/UDP ポート上にワイルドカードバインド AF_INET ソケットとワイルドカードバインド AF_INET6 ソケットの両方があれば、それらは、別々に振る舞うべきです。 IPv4 トラフィックは、 AF_INET ソケットにルートされるべきで、IPv6 は、 AF_INET6 ソケットにルートされるべきです。

しかしながら、RFC2553 は、 bind(2) の呼び出しの間の順序付けの制限も IPv4 TCP/UDP ポート番号と IPv6 TCP/UDP ポート番号がおたがいにどのように関連しているか (それらが統合されているか、または分離されているか) も定義していません。実装された振る舞いは、カーネルによってたいへん異なっています。したがって、 AF_INET6 ワイルドカードバインドソケットの振る舞いに頼り過ぎるのは、賢明ではありません。利用者が IPv4 と IPv6 トラフィックの両方を受け付けたいとき、 2 つのソケット、1 つは、 AF_INET と他は、 AF_INET6 を listen (接続を受け付ける) することをお勧めします。

また、ターゲットノードが IPv4 トラフィックを AF_INET6 ソケットにルートするなら、悪意がある者が上に提示された複雑さをうまく利用することができて、アクセス制御を迂回させることができることに注意するべきです。ユーザは、 IPv4 マップアドレスから AF_INET6 ソケットに接続する操作に注意したほうがよいでしょう。

規格

Tatsuya Jinmei and Atsushi Onoe, An Extension of Format for IPv6 Scoped Addresses, インターネットドラフト, draft-ietf-ipngwg-scopedaddr-format-02.txt, June 2000, 作業中の資料.

歴史

inet6 プロトコルインタフェースは、RFC2553 と RFC2292 で定義されています。ここで説明された実装は、WIDE/KAME プロジェクトで登場しました。

バグ

IPv6 のサポートは、インターネットプロトコルが発展するときの変更の影響を受けやすいです。ユーザは、現在の実装の詳細に依存するべきではありませんが、むしろエクスポートされたサービスに依存すべきです。

利用者が inet(4)inet6 の両方をサポートする必要があるとき、ユーザは、できる限り“バージョン独立”コードを実装ように勧められます。

September 2, 2009 FreeBSD