6rdによるIPv6接続(Linux編その2)
当ブログをご覧のみなさまこんにちは。さくらインターネット研究所の大久保です。
前回に引き続き、今回もLinuxで6rdを使う方法について紹介します。
これまでは、IPv6アドレスにIPv4アドレス全部を埋め込む設定となっていましたが、Linuxの6rdの実装ではIPv4アドレスの一部をIPv6アドレスに埋め込むことができます。全部ではなく一部とすることで、6rdクライアントが使えるIPv6アドレス空間を増やすことができます。
試験ネットワーク環境
ここでは以下のようなネットワークを試験的に構築して動作確認を行います。

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の設定
- IPv6アドレスの算出
まずは、6rdクライアントとして使用するIPv6アドレスを算出します。以下のようにIPv4アドレスの下位2オクテットを引数として指定します。
# printf "2403:3a00:%02x%02x::1\n" 224 119
2403:3a00:e077::1 - /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 tun6rd6rd-relay_prefixオプションを指定することで、IPv4アドレスの全部ではなく一部(この場合は下16bit)をIPv6アドレスに埋め込むことができます。
- 再起動
設定を反映させるために一度再起動します。
# reboot
- 設定反映を確認
正しく設定できると以下のようになります。
# 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の設定
- IPv6アドレスの算出
Ubuntuと同様に6rdクライアントとして使用するIPv6アドレスを算出します。
# printf "2403:3a00:%02x%02x::1\n" 224 124
2403:3a00:e07c::1 - /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 - /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 - 再起動
設定を反映させるために一度再起動します。
# reboot
- 設定反映を確認
正しく設定できると以下のようになります。
$ 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がサポートされていますので、次回はそちらの設定方法について解説したいと思います。