IPv4ネットワーク同士をIPv6で結ぶ(IPv4 over IPv6)
友人や離れて住む家族にパソコンの操作方法を聞かれ、テレビ電話などで対応し「直接PCを操作したい」ともどかしい思いをしたり、会社のPCを家から操作したいと思ったことはありませんか。
それを実現するためにVNCというアプリがあるのですが、従来のIPv4接続のインターネットの世界では「固定IPアドレス」が必要か、そうでなければ「DDNS」といった仕組みと一緒に利用しないといけなかったりして、費用が掛かったり安定性に欠けたり、設定が複雑でした。
しかしIPv6の世界ではそのような仕組みを使わなくても、遠隔地とネットワークを接続できるようになりました。IPアドレスの数が増え、インターネットを接続する端末毎にグローバルネットワークアドレスが割り当てられるようになったためです。
ただ、通常IPv6環境を利用するには自分の家のインターネット環境をすべてを対応させなければいけません。ルーターやパソコン等の機器がIPv6に対応している必要があるだけでなく、それらの設定やプロバイダとの契約内容まで変更がおよびます。
そこでこの記事では、家庭内の環境はIPv4のままでNTTの光回線において標準(無料)で提供されているIPv6のサービスを使って、遠隔地とネットワーク接続をしてみます。この技術は「IPv4 over IPv6」や「DS-Lite」と呼ばれているそうです。
NTTの光サービスを使いますのでNTTの東西に壁があり、それらをまたいだ接続はできません※。
※正確には、IPv6でプロバイダ契約をすれば東西をまたぐことは可能です。しかし、その場合はIPv6を使って2つの場所を直接接続できると思いますので、この記事でやることに意味がないと思われます。
予備知識
前述のとおり接続したい2つの場所の回線が、NTTの光回線かNTT光コラボ回線で、NTTのサービスエリアが同じでなければいけません。そして、それぞれの場所でフレッツ・v6オプションを契約する必要があります。契約といっても、NTTを利用している場合ネットからの申し込みなら工事費・利用料ともに無料です。(コラボ光の場合はプロバイダにご確認ください)
接続のイメージは次の通りです。
遠隔地のPCと接続するには図の①の方法と②の方法があります。①は一度インターネットに出てから目的の場所へ接続する方法。もう一つは②のようにインターネットに出る前のネットワーク上で目的の場所へ接続する方法です。
ここでは②の方を使います。なので、インターネット接続(プロバイダ契約)がなくても接続可能です。
ここでは触れませんが、ADSLだったりCATV系や電力会社系の回線だったりする場合は①のような接続を用います。
②のメリットとしては遠回りをしないので早いということ、なにより安定的な接続を低コストで実現できるということです。
デメリットとしては、第三者とあなたのPCがネットワークを通じてつながっている状態になるということです。IPアドレスさえわかれば、誰でも他人の家のネットワークまで到達できます。従来のIPv4においては第三者が到達できるのはルーターまででしたが、IPv6においてはその内側にある端末まで到達が可能です。
そのような理由から、今まで以上に「ファイアウォール」の存在が重要になってきます。二の足を踏みたくもなりますが、IPv6の世界は遅かれ早かれ家庭にもやってくると思いますので、家庭内のネットワークセキュリティの見直しのいい機会と考えましょう。
IPv6オプションの申し込み
IPv6オプションの申し込みをNTT西日本を例に説明していきます。詳しくは、公式ページのフレッツ・v6オプションのページに掲載されています。
IPv6のアドレスがすでに降りてきている場合はこちら、そうでない場合はこちらから、NTTのサービス申込受付ページに進みます。
自分が契約している回線からでないとつながりません。また、IPv4サイトへの接続の場合はPPPoEのIDとパスワードを変えて接続する必要があります。その際のIDとパスワードは固定のようですが、ここで案内するのは問題かもしれませんので、公式ページをご確認ください。ただ公式ページに記述がなかったので、設定ガイドファイルにリンクします。このSTEP2の手順6にPPPoEの接続のための情報が記述されています。
ちなみに、NTT東日本の場合のアドレスは、IPv6の場合はこちら、IPv4の場合はこちらとなっています。PPPoEの接続パスワード等はこちらよりご確認ください。
リンク先を表示させると「NGNサービス情報サイト」というトップページが出てきます。ここから「サポート情報」の項目内にある「申し込み受付」のリンクより設定ページに移ります。
設定ページのトップページには、下の方にログインボタンがあります。契約時の書類に記載してあるCAFから始まる「お客様ID」と「アクセスキー」を画面に入力します。
ログイン後のページ中段にある「フレッツ・v6オプション」の項目の「詳細・申込・変更」から申し込みをします。
自動で処理が行われているようで、夜に申し込みをしたのですが数時間後には開通の通知メールが来ました。
IPv6データの受け入れ
開通するとIPv6のアドレスが配布されるようになります。なにも設定しなくてもルーターの内側にまで配布されるかもしれませんが、そうでなければルーターー側の設定で、IPv6のデータを「IPv6パススルー」や「IPv6ブリッジ」等の名前のついた機能を使って内側に引き込みます。
本格的に運用する場合は、パケットフィルタリング等をして、意図しない場所からの通信を遮断しましょう。
例えば、Buffallo製品では、ND Proxyという機能と、IPv6フィルターを用います。ND Proxyは「Internet IPv6」の項目に選択項目として存在しますので、それを選択します。その後、「セキュリティー」「IPv6フィルター」の項目からフィルターを登録します。この製品のフィルターでは上から順にチェックしていき最初に一致したルールを採用するので、最後にすべてを拒否する設定を入れてその上に許可対象のルールを登録します。
このIPv6フィルターはND Proxyでなくても設定自体は可能ですが、「パススルー」モードだとフィルターが機能しません。逆にND Proxyだけ設定してフィルターの設定をしなくい場合は、ステートフルインスペクションファイアウォールとして機能するようですが、相手からのIPv4 over IPv6トンネル構築も防いでしまいます。
参考画像では相手先からのICMP(Ping)だけ受け付ける設定となっていますが、ネットワーク単位ですべての通信を許可するか、さらにそこから搾りこみIPv4 over IPv6トンネルのポート番号を指定したフィルターを作るようにします。
IPv6が配布されているかどうかは、WindowsPCのコマンドプロンプトから確認できます。
ipconfig /all
「IPv6 アドレス」の項目にアドレスが入っていたら成功しています。リンクローカル IPv6アドレスではありません。
IPv4のネットワーク同士をIPv6を使って接続するためには、IPv6上にIPv4のデータを通す技術「IPv4 over IPv6」を用います。「DS-Lite」とも表記されることがあります。IPv4とIPv6を混在させる技術としては、逆の「IPv6 over IPv4」(IPv4のネットワークにIPv6のデータを流す)方が一般的らしく、家庭用のルーターでは対応しているものは少ないです。IO-DATA製のルーター「WN-DX1167GR」がIPv4 over IPv6に対応可能なようですが、ルーティングに対応していないようで意図した使い方はできません。
家庭用ではないと思いますがヤマハのNVR510を、同機種間でのIPv4 over IPv6が可能です。
もう少し安く上げようとすると、経路設定のできるBaffaloのルーター(経路設定とIPv6フィルターがある機種が必要です)と、古いPCにDebianをインストールしてトンネル通信をするPCを設けるという構成になると思います。通常のインターネットをする際にはルーターのIPv4のPPPoE(IPv6通信ができない前提です)、ネットワーク間をつなげるにはPCを経由してIPv6という経路の振り分をします。
WindowsXP世代の古い使われていないPCで構いませんのでDebianをインストールしてください。ラズベリーパイでもかまいません。ネットワークアダプター(NIC)は複数持つ必要はありません。
トンネル構築用のDebianに自分が利用しているIPv4ネットワークのアドレスを割り振って再起動します。次のコマンドを入力して、IPv6アドレスが割り振られているのを確認します。
$ ip -6 a
このIPv6アドレスをメモして次のスクリプトファイルに記述します。また、同様にして得た接続先のIPv6アドレスも必要です。
Debianに次のようなbashスクリプトファイルを作ります。環境に応じて変数の値を変えてください。
$ nano maketunnel.sh
#!/bin/bash #トンネル処理をするPC(またはルーターの)IPv6アドレス 相手側 REMOTE=2001:xxxx:xxxx:xxxx::1 #トンネル処理をするPC(またはルーターの)IPv6アドレス 自分側 LOCAL=2001:yyyy:yyyy:yyyy::1 #トンネルを作るNIC(ネットワークインターフェース)名 TUNNIC=enp2s0 #トンネルの名称 TUNNM=tunv6 #相手先のIPv4ネットワークを「ネットワークアドレス/サブネットマスク」の書式で。相手とネットワークアドレスが重複していると接続できません REMOTEV4=192.168.202.0/24 #記述ミス確認の為、自分のIPv6アドレスへPingしています ping -c 4 $LOCAL #宛先にPingテストをします ping -c 4 $REMOTE #IP6トンネルモジュールをカーネルに追加します。 modprobe ip6_tunnel #トンネルを作成します ip -6 tunnel add $TUNNM mode ipip6 remote $REMOTE local $LOCAL dev $TUNNIC #トンネルをリンクアップさせます ip link set dev $TUNNM up #ルーティングテーブルに追加アドレスを追加します。 ip route add $REMOTEV4 dev $TUNNM #複数NIC間の転送を許可します sysctl -w net.ipv4.ip_forward=1
このIPトンネルの張り方は15分で出来るRaspberryPi(Linux)でDS-Lite(IPv6/IPv4)を参考にさせていただきました。ありがとうございました。
スクリプトを保存したら実行可能にします。このスクリプトは管理者権限で起動させる必要がありますので、所有者をrootにして、所有者だけに権限を付与します。
筆者のDebian環境におけるスクリプトですので、状況に応じて書き換えてください。スクリプトの実行時、modprobeやsysctlが見つからないという内容のエラーが出たらパスが通っていませんので、その際は/sbin/modprobeという風に絶対パスに書き換えてください。また、ラズベリーパイ等の、sudo環境の場合もそれに読み替えてください。
作成したスクリプトに実行権限を付けるには次のようにします。
# chown root:root maketunnel.sh # chmod 744 maketunnel.sh
スクリプトを手動で実行するか、PC起動時またはネットワーク起動時に自動実行されるように設定しておきます。
インターネット接続に使用しているルーターの設定(ルーティングテーブル)に、接続相手先のIPアドレスの場合は、作成したトンネル用PCのIPアドレスへ転送するように設定を記述します。Buffalo製のWXR-1750DHPだと次のようになります。
特定のPCからしか接続しないという場合は、ルーターではなくPCのルーティングテーブルだけ変えるという方法もあります。Windowsのコマンドプロンプトだと次のようになります。管理者権限が必要です。
route add 192.168.200.0 mask 255.255.255.0 192.168.100.1
route addの後は、宛先ネットワーク、宛先ネットワークのサブネットマスク、転送先(ゲートウェイ)アドレスとなっています。遠隔地向けのデータは、トンネル用PCに転送する設定にしています。
両方のネットワークでこのスクリプトを実行すると、ネットワーク間で接続が可能になります。PCを遠隔操作したい場合は、相手先のPCのプライベートIPアドレスを指定してVNCができます。VNCアプリについては別記事に記載します。