6rdによるIPv6接続(Linux編その2)

  • ohkubo
at
    Tags:
  • IPv6
  • Network

当ブログをご覧のみなさまこんにちは。さくらインターネット研究所の大久保です。

前回に引き続き、今回もLinuxで6rdを使う方法について紹介します。

これまでは、IPv6アドレスにIPv4アドレス全部を埋め込む設定となっていましたが、Linuxの6rdの実装ではIPv4アドレスの一部をIPv6アドレスに埋め込むことができます。全部ではなく一部とすることで、6rdクライアントが使えるIPv6アドレス空間を増やすことができます。

試験ネットワーク環境

ここでは以下のようなネットワークを試験的に構築して動作確認を行います。

Image

6rd空間として2403:3a00::/32を割り当て、設置した6rd Border Relayにインターネットからルーティングされています。またIPv4ネットワークを介してUbuntu10.10のマシンとFedora14のマシンが接続されています。これらを6rd経由でIPv6インターネットに接続してみます。

アドレスフォーマットは下記のようになります。

6rdプレフィックス
2403:3a00::/32 (*1)
IPv4プレフィックス
61.211.0.0/16 (*2)下位16bitのみをIPv6アドレスに埋め込む
Border Relayアドレス
61.211.224.125
委譲空間
/48 (32+16)

例えば、61.211.224.119の割り当てられたUbuntu10.10の6rdクライアントの場合、2403:3a00::/32にIPv4アドレスの下16bit(224.119の部分)を埋め込み、2403:3a00:e077::/48の空間を利用することができます。

※ 補足事項

  • (*1) 2403:3a00::/32
    近い将来、弊社大阪エリアでのIPv6サービス提供用に取得したアドレスですが、現在準備中ということで、サービス提供開始まで一時的に6rdテスト用に利用しています。
  • (*2) 61.211.0.0/16
    弊社で割り振りを受けている空間は 61.211.224.0/20 のみですが、説明を簡略化するためここでは/16で説明しています。61.211.0.0/16内のIPアドレスを使用している他社さんのネットワークからアクセスできてしまいますので、本来はIPv4アドレスブロックに合わせて/20とした方が良いです。

Ubuntu10.10の設定

  1. IPv6アドレスの算出

    まずは、6rdクライアントとして使用するIPv6アドレスを算出します。以下のようにIPv4アドレスの下位2オクテットを引数として指定します。

    # printf "2403:3a00:%02x%02x::1\n" 224 119
    2403:3a00:e077::1
  2. /etc/network/interfaces ファイルの編集

    viでファイルを開き、以下の内容を追加します。

    # vi /etc/network/interfaces
    auto tun6rd
    iface tun6rd inet6 v4tunnel
    address 2403:3a00:e077::1
    netmask 32
    gateway ::61.211.224.125
    local 61.211.224.119
    endpoint any
    ttl 64
    up ip tunnel 6rd dev tun6rd 6rd-prefix 2403:3a00::/32 6rd-relay_prefix 61.211.0.0/16
    up ip link set mtu 1280 dev tun6rd

    6rd-relay_prefixオプションを指定することで、IPv4アドレスの全部ではなく一部(この場合は下16bit)をIPv6アドレスに埋め込むことができます。

  3. 再起動

    設定を反映させるために一度再起動します。

    # reboot
  4. 設定反映を確認

    正しく設定できると以下のようになります。

    # ifconfig tun6rd
    tun6rd Link encap:IPv6-in-IPv4
    inet6アドレス: ::61.211.224.119/128 範囲:Compat
    inet6アドレス: 2403:3a00:e077::1/32 範囲:グローバル
    UP RUNNING NOARP MTU:1280 メトリック:1
    RXパケット:10 エラー:0 損失:0 オーバラン:0 フレーム:0
    TXパケット:10 エラー:0 損失:0 オーバラン:0 キャリア:0
    衝突(Collisions):0 TXキュー長:0
    RXバイト:1040 (1.0 KB) TXバイト:1040 (1.0 KB)

    # ip tunnel show
    sit0: ipv6/ip remote any local any ttl 64 nopmtudisc 6rd-prefix 2002::/16
    tun6rd: ipv6/ip remote any local 61.211.224.119 ttl 64 6rd-prefix 2403:3a00::/32 6rd-relay_prefix 61.211.0.0/16

    # ip -6 route show | grep default
    default via ::61.211.224.125 dev tun6rd metric 1024 mtu 1280 advmss 1220 hoplimit 0

Fedora14の設定

  1. IPv6アドレスの算出

    Ubuntuと同様に6rdクライアントとして使用するIPv6アドレスを算出します。

    # printf "2403:3a00:%02x%02x::1\n" 224 124
    2403:3a00:e07c::1
  2. /etc/sysconfig/network-scripts/ifcfg-sit1 ファイルの作成

    viでファイルを開き、以下の内容を入力します。

    # vi /etc/sysconfig/network-scripts/ifcfg-sit1
    DEVICE=sit1
    IPV6INIT=yes
    IPV6_MTU=1280
    IPV6_DEFAULTGW=::61.211.224.125
    IPV6TUNNELIPV4=any
    IPV6TUNNELIPV4LOCAL=61.211.224.124
    IPV6ADDR=2403:3a00:e07c::1/32
  3. /etc/rc.local ファイルの編集

    以下の内容を追記します。

    # vi /etc/rc.local
    ip tunnel 6rd dev sit1 6rd-prefix 2403:3a00::/32 6rd-relay_prefix 61.211.0.0/16
  4. 再起動

    設定を反映させるために一度再起動します。

    # reboot
  5. 設定反映を確認

    正しく設定できると以下のようになります。

    $ ifconfig sit1
    sit1 Link encap:IPv6-in-IPv4
    inet6 addr: 2403:3a00:e07c::1/32 Scope:Global
    inet6 addr: ::61.211.224.124/128 Scope:Compat
    UP RUNNING NOARP MTU:1280 Metric:1
    RX packets:6 errors:0 dropped:0 overruns:0 frame:0
    TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:624 (624.0 b) TX bytes:624 (624.0 b)

    $ ip tunnel show
    sit0: ipv6/ip remote any local any ttl 64 nopmtudisc 6rd-prefix 2002::/16
    sit1: ipv6/ip remote any local 61.211.224.124 ttl 64 6rd-prefix 2403:3a00::/32 6rd-relay_prefix 61.211.0.0/16

    $ ip -6 route show | grep default
    default via ::61.211.224.125 dev sit1 metric 1 mtu 1280 advmss 1220 hoplimit 0

通信テスト

6rdドメイン内での通信ができるか、IPv6インターネット向けの通信ができるかを確認します。

  • Ubuntu10.10→Fedora14
    # ping6 2403:3a00:e07c::1
    PING 2403:3a00:e07c::1(2403:3a00:e07c::1) 56 data bytes
    64 bytes from 2403:3a00:e07c::1: icmp_seq=1 ttl=64 time=2.07 ms
    64 bytes from 2403:3a00:e07c::1: icmp_seq=2 ttl=64 time=0.508 ms
    64 bytes from 2403:3a00:e07c::1: icmp_seq=3 ttl=64 time=0.370 ms
  • Ubuntu10.10→Border Relay
    # ping6 2403:3a00:e07d::1
    PING 2403:3a00:e07d::1(2403:3a00:e07d::1) 56 data bytes
    64 bytes from 2403:3a00:e07d::1: icmp_seq=1 ttl=64 time=1.64 ms
    64 bytes from 2403:3a00:e07d::1: icmp_seq=2 ttl=64 time=0.312 ms
    64 bytes from 2403:3a00:e07d::1: icmp_seq=3 ttl=64 time=0.591 ms
  • Ubuntu10.10→IPv6インターネット向け
    # ping6 www.iij.ad.jp
    PING www.iij.ad.jp(2001:240:bb42:b000::1:80) 56 data bytes
    64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=1 ttl=55 time=1.71 ms
    64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=2 ttl=55 time=1.77 ms
    64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=3 ttl=55 time=1.79 ms

問題なく通信できていることが確認できます。

まとめ

今回は、Linuxの6rdの実装において、IPv4アドレスの一部をIPv6アドレスに埋め込む方法について説明しました。この方式の場合、6rdクライアントが使えるIPv6アドレス空間を増やせる一方、6rd Border Relayも含めてIPv4アドレスの先頭部分が同じネットワークでしか使えませんので、適用箇所は十分検討が必要です。

これまでサーバ系OSでの設定方法について説明してきましたが、CiscoルータのIOSでも6rdがサポートされていますので、次回はそちらの設定方法について解説したいと思います。