Linux で IPv4 から IPv6 への 6to4 トンネルを構成する

CompTIABeginner
オンラインで実践に進む

はじめに

この実験では、Linux 環境で IPv4 から IPv6 への 6to4 トンネルを構成する方法を学びます。この実践的な演習では、既存の IPv4 ネットワーク上で IPv6 接続を有効にするプロセスを段階的に説明します。これはネットワーク管理者にとって重要な移行メカニズムです。標準的な Linux コマンドラインツールを使用して、機能的なトンネルを一から構築し、検証します。

段階的なプロセスに従い、まず現実世界のシナリオをシミュレートするために概念的なパブリック IPv4 アドレスを準備します。次に、SIT (Simple Internet Transition) トンネルインターフェイスを作成し、6to4 フォーマットの IPv6 アドレスを割り当て、パブリック 6to4 リレーを介してデフォルトの IPv6 ルートを追加します。実験の最後に、ping6 コマンドを使用して、新しく構成されたトンネルを介したエンドツーエンドの IPv6 接続をテストします。

概念的なパブリック IPv4 アドレスでトンネリングの準備をする

このステップでは、6to4 トンネリングの基本的な要件であるパブリック IPv4 アドレスについて学びます。システムの IP アドレスを特定する方法と、この実験で特別なコンセプト上のアドレスを使用する理由を説明します。

6to4 トンネリングは、IPv6 パケットを IPv4 パケット内にカプセル化し、IPv4 インターネットを横断できるようにする移行メカニズムです。現実世界のシナリオでこれを機能させるには、システム(トンネルエンドポイント)がパブリック IPv4 アドレスを持っている必要があります。これにより、インターネット上の他のデバイスがトラフィックをシステムに戻すことができます。典型的な実験環境や家庭環境では、コンピューターは多くの場合、ネットワークアドレス変換(NAT)を使用するルーターの後ろにあり、プライベート IPv4 アドレスを持っています。これは、パブリックインターネットから到達できません。

まず、この実験環境でネットワークインターフェイスに割り当てられている実際の IPv4 アドレスを確認しましょう。これを行うには、ip a コマンドと grep を組み合わせて IPv4 アドレスをフィルタリングします。

ターミナルで次のコマンドを実行します。

ip a | grep inet

以下のような出力が表示され、システム上の IPv4 および IPv6 アドレスが一覧表示されます。IPv4 アドレスはプライベートであり、パブリックではないことに注意してください。

    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    inet 172.16.50.33/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
    inet6 fe80::216:3eff:fe01:236f/64 scope link
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

ご覧のとおり、リストされているアドレスはプライベート(172.16.50.33 など)またはループバック(127.0.0.1)です。これらは 6to4 トンネルのパブリックエンドポイントとして使用できません。現実世界のセットアップをシミュレートするために、コンセプト上のパブリック IPv4 アドレスを使用します。この実験では 192.0.2.1 を使用します。このアドレスは、実際のパブリック IP アドレスとの競合を回避するために、ドキュメントおよび例専用に予約されているブロック(RFC 5737)の一部です。以降のすべてのステップで、このプレースホルダーアドレスを使用してトンネル構成を構築します。

ip tunnel コマンドで SIT トンネルインターフェイスを作成する

このステップでは、6to4 トンネルの基盤となる仮想トンネルインターフェイスを作成します。ネットワーク構成のための Linux における強力なユーティリティである ip コマンドを使用します。

ip tunnel コマンドは、トンネルインターフェイスの作成、管理、および削除に使用されます。「Simple Internet Transition」の略である sit と呼ばれる特定のタイプのトンネルが 6to4 に必要です。このモードは、IPv6 パケットを直接 IPv4 パケット内にカプセル化し、これが 6to4 のコアメカニズムとなります。

それでは、tun6to4 という名前のトンネルインターフェイスを作成しましょう。前のステップで特定したコンセプト上のパブリック IPv4 アドレス 192.0.2.1 を使用して構成します。

ターミナルで次のコマンドを実行します。ネットワークインターフェイスの作成は特権操作であるため、sudo が必要です。

sudo ip tunnel add tun6to4 mode sit local 192.0.2.1 remote any

このコマンドを分解してみましょう。

  • sudo ip tunnel add tun6to4: この部分は、tun6to4 という名前の新しいトンネルインターフェイスを追加するようにシステムに指示します。
  • mode sit: これはカプセル化モードを指定します。sit は 6to4 トンネリングの正しいモードです。
  • local 192.0.2.1: これはトンネルパケットのソース IPv4 アドレスを設定します。これは、コンセプト上のパブリック IP でシミュレートしているトンネルの「ローカル」エンドポイントです。
  • remote any: これは 6to4 メカニズムの重要な部分です。これは、トンネルが任意のリモートエンドポイントに接続できることをシステムに伝えます。実際には、これは 6to4 リレー ルーターのよく知られた「anycast」アドレスにトラフィックを送信し、リレー ルーターがトラフィックを IPv6 インターネットに転送することを意味します。

コマンドを実行した後、トンネルインターフェイスが作成されたことを確認できます。ip tunnel show コマンドを使用します。

ip tunnel show

出力は、新しい tun6to4 インターフェイスの作成と構成を確認する必要があります。デフォルトの sit0 インターフェイスが表示される場合もありますが、この実験では無視できます。

sit0: ipv6/ip remote any local any ttl 64 nopmtudisc 6rd-prefix 2002::/16
tun6to4: ipv6/ip remote any local 192.0.2.1 ttl inherit 6rd-prefix 2002::/16

ip a を再度実行しても新しいインターフェイスを確認できますが、まだ IP アドレスは割り当てられていません。これは次のステップで処理します。

トンネルインターフェイスに 6to4 形式の IPv6 アドレスを割り当てる

このステップでは、作成したばかりの tun6to4 インターフェイスに、特別な 6to4 フォーマットの IPv6 アドレスを割り当てることで構成します。このアドレスは任意ではなく、トンネルエンドポイントのパブリック IPv4 アドレスから直接派生します。

6to4 アドレス指定スキームは自動化されるように設計されています。指定された IPv6 プレフィックス 2002::/16 を使用します。このプレフィックスに続く 32 ビットは、16 進数形式に変換されたパブリック IPv4 アドレスで埋められます。これにより、少なくとも 1 つのパブリック IPv4 アドレスを持つすべての組織に対して、一意の /48 IPv6 プレフィックスが作成されます。

コンセプト上の IPv4 アドレス 192.0.2.1 の 16 進数表現を計算しましょう。

  • 10 進数の 192 は 16 進数で c0 です。
  • 10 進数の 0 は 16 進数で 00 です。
  • 10 進数の 2 は 16 進数で 02 です。
  • 10 進数の 1 は 16 進数で 01 です。

これらを組み合わせると、192.0.2.1 の 16 進数表現は c000:0201 となります。したがって、一意の 6to4 プレフィックスは 2002:c000:0201::/48 です。

次に、このプレフィックスから特定の IPv6 アドレスを tun6to4 インターフェイスに割り当てます。最初のサブネットの最初のアドレス 2002:c000:0201::1/64 を使用します。アドレスを割り当てるには、次のコマンドを実行します。

sudo ip -6 addr add 2002:c000:0201::1/64 dev tun6to4

インターフェイスを作成し、アドレスを割り当てた後も、インターフェイスはデフォルトで「DOWN」状態のままです。操作可能にするには、「UP」状態にする必要があります。これには ip link set コマンドを使用します。

sudo ip link set tun6to4 up

最後に、インターフェイスがアップしており、正しい IPv6 アドレスを持っていることを確認しましょう。ip a コマンドを使用し、tun6to4 インターフェイスを探します。

ip a

出力には、現在アクティブで IPv6 アドレスで構成された tun6to4 インターフェイスが含まれているはずです。インターフェイス番号(例:5:)は異なる場合があり、docker0sit0 のような他のインターフェイスが表示される場合もあります。

5: tun6to4@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
    link/sit 192.0.2.1 brd 0.0.0.0
    inet6 ::192.0.2.1/96 scope global
       valid_lft forever preferred_lft forever
    inet6 2002:c000:201::1/64 scope global
       valid_lft forever preferred_lft forever

設定した 2002:... アドレスに加えて、システムが IPv4 互換の IPv6 アドレス(::192.0.2.1/96)を自動的に追加していることに注意してください。これは予期された動作です。

6to4 リレーアドレス経由でデフォルト IPv6 ルートを追加する

このステップでは、送信接続のための最後のピースであるデフォルトルートを構成します。tun6to4 インターフェイスに IP アドレスがあるだけでは不十分です。システムは、グローバルインターネット宛ての IPv6 トラフィックをどこに送信すべきかを知る必要があります。ここでは、特別な 6to4 リレー ルーターを指定します。

6to4 は、6to4 ワールドとネイティブ IPv6 インターネットを接続するパブリックリレー ルーターに依存しています。これらのルーターは、特定の、よく知られた anycast IPv4 アドレス 192.88.99.1 でカプセル化されたトラフィックをリッスンします。システムが外部宛先の IPv6 パケットを送信すると、それを IPv4 パケットにカプセル化し、このリレー アドレスに送信します。リレーはパケットをアンラップし、IPv6 ネットワークに転送します。

これを設定するために、ip -6 route add コマンドを使用してデフォルトの IPv6 ルートを追加します。ターミナルで次のコマンドを実行します。

sudo ip -6 route add default via ::192.88.99.1 dev tun6to4

コマンドを分析しましょう。

  • default: これは、ルーティングテーブル内のより具体的なルートと一致しないすべての IPv6 トラフィックの「デフォルトゲートウェイ」であることを指定します。
  • via ::192.88.99.1: これはネクストホップゲートウェイを設定します。::192.88.99.1 という構文は、IPv6 コンテキスト内で IPv4 アドレスを表す特別な方法であり、システムに IPv4 アドレス 192.88.99.1 にトラフィックを送信するように指示します。
  • dev tun6to4: これは、このルートに tun6to4 インターフェイスを使用するようにシステムに明示的に指示します。

これで、IPv6 ルーティングテーブルが正しく更新されたことを確認できます。次のコマンドを実行します。

ip -6 route show

出力には、トンネルインターフェイス経由で 6to4 リレーを指すデフォルトルートが含まれているはずです。正確な出力は若干異なる場合がありますが、重要なのは default の行です。

::1 dev lo proto kernel metric 256 pref medium
::/96 dev tun6to4 proto kernel metric 256 pref medium
2002:c000:201::/64 dev tun6to4 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via ::192.88.99.1 dev tun6to4 metric 1024 pref medium

このルートを設定することで、システムはシミュレートされた 6to4 トンネル経由で IPv6 トラフィックを送信するように完全に構成されました。

ping6 を使用してトンネル経由の IPv6 接続をテストする

このステップでは、新しく構成した 6to4 トンネルを、パブリック宛先に IPv6 トラフィックを送信してテストします。ここでは、おなじみの ping ユーティリティの IPv6 版である ping6 コマンドを使用します。

目標は、システムが IPv6 パケットを送信し、それを IPv4 パケットにカプセル化し、6to4 リレーに送信し、その後最終宛先に転送できるかどうかを確認することです。ping6-I フラグを使用して、トラフィックが tun6to4 インターフェイスから発信されるように指定します。

ipv6.google.com のような、よく知られた IPv6 対応ホストに ping してみましょう。-c 4 フラグは、コマンドが 4 つのパケットのみを送信するように制限します。

ターミナルで次のコマンドを実行します。

ping6 -c 4 -I tun6to4 ipv6.google.com

期待される結果と説明

コマンドは失敗し、宛先が到達不能であることを示す出力が表示されます。これは期待される結果であり、この実験室のこの部分はデモンストレーション目的のみです。

PING ipv6.google.com(sfo03s32-in-x0e.1e100.net (2607:f8b0:4005:814::200e)) from 2002:c000:201::1 tun6to4: 56 data bytes
From iZrj9hhbt3mi4boxowaqhxZ (2002:c000:201::1) icmp_seq=1 Destination unreachable: Address unreachable
From iZrj9hhbt3mi4boxowaqhxZ (2002:c000:201::1) icmp_seq=2 Destination unreachable: Address unreachable
From iZrj9hhbt3mi4boxowaqhxZ (2002:c000:201::1) icmp_seq=3 Destination unreachable: Address unreachable
From iZrj9hhbt3mi4boxowaqhxZ (2002:c000:201::1) icmp_seq=4 Destination unreachable: Address unreachable

--- ipv6.google.com ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3253ms

この失敗は、設定が間違っていることを意味するものではありません。 6to4 トンネルのクライアント側を正常にセットアップしました。この実験環境で失敗が予想される主な理由は 2 つあります。

  1. 実験環境: LabEx 仮想マシンには、実際のパブリック IPv4 アドレスがありません。構成には概念的なアドレス (192.0.2.1) を使用しました。6to4 リレーは、このルーティング不可能なアドレスに応答を返信できません。
  2. 廃止されたインフラストラクチャ: パブリック 6to4 リレーインフラストラクチャ(anycast アドレス 192.88.99.1)は、ほとんど廃止されており、最新のインターネットではメンテナンスされていません。ネットワークオペレーターは、ネイティブ IPv6、6rd、DS-Lite のような、より堅牢で安全な IPv6 移行メカニズムに移行しました。

この実験の主な目的は、歴史的に重要な IPv4 から IPv6 へのトンネリングメカニズムの概念と構成構文を教えることです。これは、CompTIA Network+ のようなネットワーク認定で扱われるトピックです。

まとめ

この実験では、Linux で IPv4 から IPv6 への 6to4 トンネルを構成する方法を学びました。まず、6to4 トンネリングのコア要件であるパブリック IPv4 アドレスを理解することから始めました。実験環境内のプライベート IP アドレスを特定した後、概念的なパブリック IPv4 アドレス (192.0.2.1) を採用して、実際のシナリオをシミュレートしました。次に、ip tunnel コマンドを使用して SIT (Simple Internet Transition) トンネルインターフェイスを作成しました。これは、IPv6 パケットを IPv4 内にカプセル化するためのエンドポイントとして機能します。

トンネルインターフェイスを確立した後、概念的なパブリック IPv4 アドレスからプログラム的に派生した 6to4 フォーマットの IPv6 アドレスを構築して割り当てました。トンネル経由で IPv6 トラフィックをルーティングするために、anycast 6to4 リレーアドレスを指すデフォルトの IPv6 ルートを追加しました。最後に、ping6 コマンドを使用して構成をテストしました。テストは予想通り失敗しましたが、これはローカルのセットアップは正しかったものの、パブリック 6to4 リレーインフラストラクチャがもはや広く利用可能ではないことを確認し、この技術が現在歴史的なものと見なされている主な理由を示しています。