本記事では、IPv6仮想アクセスの高度な使い方として、Linuxサーバをルータとして使う方法を紹介しています。「もっと簡単な」方法として、WindowsパソコンのみでIPv6に対応する方法を別記事で紹介していますので、こちらも併せてご覧ください。(2/14追記)
そろそろおうちもIPv6にしたいですよね
「IPv4アドレス枯渇!……か?」という話が世間を賑わす今日この頃、皆さんいかがお過ごしでしょうか。今日もIANAのからのIPv4アドレスの割り振りがついに最終局面に入ったという話題で持ちきりですね。ご存じの通り、「IPv4枯渇」というのはある種の象徴的な出来事で、ある日枯渇がやってきたとしても、その瞬間からインターネットが使えなくなるわけではありません。
とはいえ、この状況においてなお、IPv4にだけ依存した生活を続けるのは、我々インターネット人としてはよい選択肢とはいえません。オフィスで、公開セグメントで、家庭で、モバイルで、「ふつーv6使えるよね」なんて涼しい顔をしておくのがエンジニアとしては求められているのです。
オフィスや公開セグメント(サーバ)でIPv6に対応するのは、v6対応の接続サービスという点ではそんなに難しくありません。専用線やデータセンター内接続サービスで「v6ひとつ!」と言えば「あらよっ」ってな具合にv6アドレスが降ってきます。
しかし、残念ながら家庭でのv6についてはむしろ難しいというのが現状です。個人向けブロードバンドサービスで大きなシェアを持つNTT東西のフレッツシリーズでも、IPv6に対応したサービスが開始される予定ですが、まだ、もうちょっと先、という印象です。
そんなのを待ってられない、今すぐIPv6を家で使いたいという向きには、いくつかの会社からトンネリングを利用したIPv6サービスが提供されています。IIJではIPv6トンネリングサービスとIPv6仮想アクセス(IIJmio)(IIJ4U)を提供しています。
似たようなサービスでちょっとややこしいですね。
IPv6トンネリングサービス | IPv6仮想アクセス | |
---|---|---|
費用 | 無料オプション 申し込み必要 |
無料オプション 申し込み不要 |
対象サービス | IIJmio FiberAccess/SF IIJmio DSL/SF (固定IPv4アドレスのサービスのみ) |
IIJ4U,IIJmioの全接続サービス (動的IPv4アドレスサービス、モバイル含む) |
IPv6アドレスの割り当て | 固定 (/48) | 動的 (/64) |
対象 | 家庭内LAN全体 | 各端末 |
まとめても違いが分かりにくいですが、正直に言って「対象サービス」のところが重要です。IPv6トンネリングサービスは固定IPアドレスのサービスに限定して提供しているのですが、mioの固定IPアドレスのサービスは少々お高い……1ということで、今回は手軽なIPv6仮想アクセスを使ってみることにします。
なお、この方法はあくまで「てくろぐ」のネタとして紹介するもので、IIJが動作を保証するものではありません。本件についてサポート窓口へのお問い合わせはご遠慮ください。
IPv6仮想アクセスで家庭内LANごとv6化する
さて、公式な説明ではIPv6仮想アクセスを使う場合、Windows Vista/7のVPN接続を使うことになっていますが、これだと特定の端末でしかIPv6環境を利用できません。折角ですから家庭内LAN全体をv6化したいですよね?ということで、今回はLinuxを使ってIPv6仮想アクセスに接続し、ついでにそのLinuxサーバでv6をルーティングしてLAN全体をv6化するという実験をやってみることにします。
今回は右図のようなネットワークで実験します。ごく普通の家庭内LANですね?(つまり、私の自宅です)ご覧の通り、Linuxサーバ自身がグローバルアドレスを持っている必要はありません。すでに家庭内LANに内にLinuxサーバがあればそれを使ってもかまいません。ちなみに私は家にあるVMWareサーバ上に、新しく実験用のVMを作って試しました。Linuxのディストリビューションも大抵のもので利用できると想いますが、私はCentOS5.5(x86)を使っています。他のディストリビューションの場合は、パッケージのインストール方法が異なる事がありますが、適宜読み替えてください。
ブロードバンドルーターは特に機種の指定はありませんが、PPTP(GREパケット)が通過できる必要があります。「VPNパススルー」という機能名で書かれていることが多いですね。ちなみに筆者はNEC Aterm WR8700N HP(無線LAN対応ブロードバンドルーター)を使用しています。
なお、ルータによっては「IPv6ブリッジ」など、フレッツシリーズで使われるIPv6パケットをLAN側に中継する機能を持っているものがありますが、ルータの設定画面からoffにしておいてください。LAN側で複数のIPv6 RAが告知され、混乱の元になります。
パッケージの導入・設定
それでは実際に設定を始めましょう。
今回目指すのは、右の図のようにLinuxサーバをからIIJのトンネルルータまでPPTPでトンネルを作り、そこを経由してIPv6インターネットへと接続するものです。Linuxサーバでは、PPTPクライアントを動かしIPv6仮想アクセスし接続しながら、LANとのルーティングを行います。また、LAN内の端末にIPv6アドレスを付与するためにRA(Router Advertisement)を行います。
まず、関連するソフトウェアを導入します。必要になるのは、IPv6仮想アクセスに接続するためのPPTPクライアント(PPTPCient+pppd)と、LAN側にRAを告知するためのデーモン(radvd)です。
radvdと、PPPデーモンはCentOS配布物に含まれているため、yumでインストールしましょう。
1 2 |
# yum install radvd # yum install pppd |
残念ながら、PPTPクライアントはCentOS5.5の配布物には含まれていないため、http://pptpclient.sourceforge.net/で配布されているPPTPクライアントを利用します。
1 2 |
# wget http://pptpclient.sourceforge.net/yum/stable/rhel5Client/i386/pptp-1.7.2-5.rhel5.i386.rpm # rpm -ivh pptp-1.7.2-5.rhel5.i386.rpm |
次に、接続先の設定を行います。
接続先は、/etc/ppp/peers/[設定名]に保存します。ここではvirtualv6という名前を使います。
/etc/ppp/peers/
1 2 3 4 5 6 7 8 9 10 11 |
pty "pptp ipv6a.2iij.net --nolaunchpppd" lock noauth nobsdcomp nodeflate name <span style="color: #ff0000;">[アカウント]</span> remotename <span style="color: #0000ff;">virtualv6</span> ipparam <span style="color: #0000ff;">virtualv6</span> usepeerdns noip ipv6 <span style="color: #ff0000;">::1e</span> |
最後の「ipv6」オプションには、このサーバが使うIPv6アドレスのインターフェースIDを指定します。このサーバのIPv4アドレスの最下位オクテッドが30だったため、それに併せて1e(10進数で30)を指定しました。
また、このアカウントに対するパスワードは、/etc/ppp/chap-secretsに記述します。このファイルにはパスワードをそのまま書くことになるので、root以外が参照できないようにパーミッションに注意してください。
/etc/ppp/chap-secrets
1 2 |
# client server secret IP addresses <span style="color: #ff0000;">[アカウント]</span> virtualv6 "<span style="color: #ff0000;">[パスワード]</span>" * |
最後に、LAN側にRAを告知するためのradvdの設定を行いますが、実は、この設定に記載すべきIPv6アドレスのprefixは、PPTP接続をした瞬間に動的に決定されるため、あらかじめ指定しておくことができません。ここではとりあえずひな形だけを作っておき、PPTP接続後に修正します。
/etc/radvd.conf
1 2 3 4 5 6 7 8 9 10 11 12 |
interface eth0 { AdvSendAdvert on; MinRtrAdvInterval 30; MaxRtrAdvInterval 100; prefix <span style="color: #ff0000;">[後で決まるprefix]</span>::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr off; }; }; |
接続してみましょう
設定の準備が整ったところで、実際にIPv6仮想アクセスに接続してみます
1 |
# pppd call <span style="color: #0000ff;">virtualv6</span> |
実行するとすぐにプロンプトに戻ってきますが、設定に問題がなければこれでIPv6仮想アクセスに接続ができています。
ifconfigコマンドで確認してみましょう。
1 2 3 4 5 6 7 8 9 |
# ifconfig ppp0 ppp0 Link encap:Point-to-Point Protocol inet6 addr: <span style="color: #ff0000;">2001:240:bb8a:a7::1e/64</span> Scope:Global inet6 addr: fe80::1e/10 Scope:Link UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:12 errors:0 dropped:0 overruns:0 frame:0 TX packets:3 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:796 (796.0 b) TX bytes:76 (76.0 b) |
赤色の部分がIPv6仮想アクセスによって割り当てられた、IPv6 GUAアドレス(いわゆるグローバルアドレス)です。
この状態でサーバからpingをして接続を確認しておきます。
1 |
# ping6 www.iij.ad.jp |
正しくv6アドレスでpingの応答があれば、まずはIPv6仮想アクセスへの接続は成功です。
次に、LAN内のWindows端末からもv6を使えるようにするために、Linuxサーバ上でのパケットの転送(ルーティング)とRAの告知を行います。
まず、先ほど用意したradvd.confのひな形を書き換えます。
/etc/radvd.conf
※該当箇所のみ
1 |
prefix <span style="color: #ff0000;">2001:240:bb8a:a7::/64</span> |
radvdの起動のためには、先にLinux kernel上でルーティングが有効になっている必要があるので、sysctlを使ってkernel変数を書き換えてから、radvdを起動します。
1 2 |
# sysctl net.ipv6.conf.all.forwarding=1 # radvd |
これでLANに繋がったWindows端末でもIPv6アドレスが割り当てられているはずです。
ipconfigコマンドで確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
C:\> ipconfig Wireless LAN adapter ワイヤレス ネットワーク接続: 接続固有の DNS サフィックス . . . : IPv6 アドレス . . . . . . . . . . . : 2001:240:bb8a:a7:1084:4a77:e7c7:58b7 一時 IPv6 アドレス. . . . . . . . . : 2001:240:bb8a:a7:1567:7e3f:499f:657 リンクローカル IPv6 アドレス. . . . : fe80::1084:4a77:e7c7:58b7%12 IPv4 アドレス . . . . . . . . . . : 192.168.1.192 サブネット マスク . . . . . . . . : 255.255.255.0 デフォルト ゲートウェイ . . . . . : fe80::20c:29ff:fe1c:d47a%12 192.168.1.1 |
しかし、この状態ではLinuxサーバ上のルーティングテーブルが正しく設定されていないため、Windows端末からのIPv6パケットを正しくルーティングできません。次のようにして経路を設定します。
1 2 |
# route --inet6 add default ppp0 # route --inet6 add <span style="color: #ff0000;">2001:240:bb8a:a7::/64</span> eth0 |
現在の経路はroute –inet6を実行すると確認できます。
これでWindows端末からもIPv6でインターネットにアクセスできるようになっているはずです。Webブラウザから、http://www.iij.ad.jp/ を開いてみます。画面上部に「connected via IPv6」と表示されていれば、接続成功です。(ブラウザのキャッシュに残っている場合があるので、表示が変わらない場合はreloadしてみてください)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
C:\>ping www.iij.ad.jp www.iij.ad.jp [2001:240:bb42:b000::1:80]に ping を送信しています 32 バイトのデー タ: 2001:240:bb42:b000::1:80 からの応答: 時間 =8ms 2001:240:bb42:b000::1:80 からの応答: 時間 =8ms 2001:240:bb42:b000::1:80 からの応答: 時間 =6ms 2001:240:bb42:b000::1:80 からの応答: 時間 =6ms 2001:240:bb42:b000::1:80 の ping 統計: パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、 ラウンド トリップの概算時間 (ミリ秒): 最小 = 6ms、最大 = 8ms、平均 = 7ms |
IPv6仮想アクセスを終了するときは、radvdとpppdを終了すればOKです。パケット転送も無効にしておきます。
1 2 3 |
# kill `cat /var/run/radvd/radvd.pid` # kill `cat /var/run/ppp0.pid` # sysctl net.ipv6.conf.all.forwarding=0 |
これからはIPv6が標準ですよねー
ということで、無事に家庭でもIPv6を使える環境が準備できました。
今回は一台のWindows端末だけをつないでいますが、ちゃんとLANとしてIPv6 Readyになっていますので、別のWindows端末をつないでも、Macをつないでも、IPv6対応の家電をつないでも、問題なくv6環境を使うことができます。もちろんここでIPv6対応のサーバを稼働させることもできるのですが、IPv6仮想アクセスはv6アドレスが動的割り当てなので、サーバを設置するには適していないかもしれません。
IPv6対応サーバがご入り用でしたら、IPv6標準対応のIIJ GIOをご検討ください :-)
// FIX ME
今回の設定では以下の点について手抜きがあります。ご注意ください。
セキュリティ対策が施されていません
Linuxサーバ、Windows端末など、LAN内に接続されたIPv6対応端末は、インターネットからも自由にアクセスできてしまいます。Linuxサーバ上のppp0インターフェースに対し、ip6tablesでパケットの制御をかけるなど、適切な対策を施してください。
DNS名前解決がIPv4に依存しています
IPv6でアクセスできるDNS参照サーバを用意していません。このため、DNSの名前解決はIPv4でアクセスしています。
本日の関連コンテンツ
今回の記事はネットワークサービス部 サービス開発課 宮本 外英さんのアイデアを元に、堂前が検証・執筆を行いました。
- もちろんそれに見合ったサービスを提供していますよ! [↩]
記憶違いかもしれませんが、 net.ipv6.conf.all.forwarding を 1 にすると RA を受信しなくなったと思います。
すると一定期間の後にデフォルトゲートウェイを見失って、IPv6で通信できなくなりませんか?
的外れなコメントでしたら申し訳ありません。
記憶違いかもしれませんが、 net.ipv6.conf.all.forwarding を 1 にすると RA を受信しなくなったと思います。
すると一定期間の後にデフォルトゲートウェイを見失って、IPv6で通信できなくなりませんか?
的外れなコメントでしたら申し訳ありません。
Pingback: reconstructed RobotechBlog » Blog Archive » 2011-02-26 きょうのつぶやき
kさん
ご指摘ありがとうございます。
(spamが多いので、コメントは承認後に表示されるように設定しています。すみません)
net.ipv6.conf.all.forwarding=1にしたときには、ご指摘どおりRAを無視します。
ですが、default routeについては、接続後にrouteコマンドにより設定し直しているため、timeoutで消えることはありません。
また、ppp0についているv6アドレスも、PPTPが確立している間は維持されます。
反映されなかったのでコメント本文以外のフォームを埋めて再度送信してしまいました。申し訳ありません。
デフォルトルートに関しては勘違いでした。(しかもゲートウェイと書いてしまいました。嗚呼…)
また質問なのですが、記事中で ppp0 に付与されているリンクローカルではない方の IPv6 アドレスは PPP か PPTP のハンドシェイク過程で設定されるのでしょうか?
パッケージをインストールが指示されていないのでおそらく DHCPv6 ではないと考えていましたが、PPTP の接続が確立している間維持されるということは有限の preferred-lifetime / valid-lifetime を持つ RA でもないのかな、と思いまして。
すみません、お返事遅れました。
私も勘違いが一つありました。
確かに、ppp0のアドレスはRAでprefixを取得していますので、一定時間後に蒸発してしまいます。
ただ、ppp0と対向のルータの間はlinklocalでやりとりできてしまうので、LANからの通信はできてしまいます。
でも、Linux箱自体から通信ができないのは気持ち悪いですね。
RAで降ってきたprefixを使ってeth0等に明示的にifconfigでアドレスをつけてやると、回避できます。