NTT西日本でプロバイダ契約なしの拠点間VPN|v6オプション+YAMAHA RTXのIPv6 IPsec
NTT西日本のフレッツ光では、v6オプションだけの拠点から OPEN IPv6 DDNS の名前を引けません。YAMAHA RTXでCenterから接続する構成にすれば、プロバイダ契約なしの拠点も拠点間VPNに参加できます。実際に動いている設定例つき。
フレッツ光のv6オプションを使った拠点間VPN。調べてみると、出てくる情報はNTT東日本向けのものがほとんどです。 NTT西日本で同じようにやろうとすると、「名前が引けない」という壁にぶつかります。
この記事では、各拠点はプロバイダ契約なし(フレッツ 光ネクスト+v6オプションだけ) のまま、YAMAHA RTX同士をIPv6 IPsecでつなぐ方法を紹介します。 実際に動いている設定をもとにしています。
結論:できます。やることは3つだけ
プロバイダ契約が必要なのはCenterだけ。各拠点はフレッツ 光ネクスト+v6オプションだけでVPNに参加できます。
| どこで | やること |
|---|---|
| ① 各拠点 | 1分ごとに、ddns-proxy経由で自分のアドレスを OPEN IPv6 DDNS に登録する |
| ② 各拠点 | 相手のアドレスを決めずに(any)、Centerからの接続を待つ |
| ③ Center | 各拠点のDDNS名を調べて、Centerから各拠点へ接続しに行く |
なぜこの向きなのか? NTT西日本では、プロバイダ契約のない拠点はDDNSの名前を調べられないからです。名前を調べられるCenterから接続しに行けば、この問題を避けられます。
くわしい理由と設定は、このあと順番に説明します。
はじめに、いくつかお断り
- この構成は、NTT西日本や各サービスが公式にサポートしているものではありません。試すときは、自分の環境でしっかり動作を確認してから使ってください。
- 途中で使う「ddns-proxy」は、Asei SEKIGUCHI さんが個人で公開してくれている中継サーバーです。ずっと使えるとは限りません。また、DDNSを更新するためのホストキーがこのサーバーを通ります。
- 設定例のホストキー、事前共有鍵、ホスト名、プロバイダの情報などは伏せています。
使うもの
| 名前 | 何をするもの? |
|---|---|
| フレッツ 光ネクスト(NTT西日本)+ v6オプション | 拠点同士が、NGN網の中のIPv6で直接やりとりするための回線 |
OPEN IPv6 ダイナミック DNS(i.open.ad.jp) | 各拠点のIPv6アドレスを、名前で引けるようにしてくれるDDNS。ソフトイーサ株式会社が運営しています |
| ddns-proxy(Asei さん) | NTT西日本のNGN網の中から、OPEN IPv6 DDNSを更新するための中継サーバー |
| YAMAHA RTX | 各拠点とCenterのVPNルーター |
NTT西日本だと何が困るの?
DDNSには、2つの役割があります。
- 更新:自分の今のアドレスを登録する
- 名前解決:名前から、相手のアドレスを調べる
NTT東日本ならどちらも問題なくできるのですが、NTT西日本では事情が違います。
| NTT東日本 | NTT西日本(プロバイダ契約なし) | |
|---|---|---|
| OPEN IPv6 DDNSの更新 | できる | そのままではできない → ddns-proxy経由ならできる |
| NGN網の中での名前解決 | できる | できない |
| インターネット上のDNSでの名前解決 | できる | できる(プロバイダ契約がある拠点だけ) |
公式のよくある質問にも、NTT西日本ではIPv6対応のプロバイダ契約が必要だと書かれています(OPEN IPv6 DDNS よくある質問)。
つまり、プロバイダ契約のない拠点は、自分のアドレスを登録することはできても、相手の名前を調べることはできないんです。
じゃあ、どうつなぐ?
ここで考えたいのが、どっちから接続しに行くかです。
IPsecは、どちらの側からでも接続を始められます。ただ、接続を始める側は、相手のアドレスを知っていないといけません。
名前を調べられるのは、プロバイダ契約のあるCenterだけ。 だから、Centerから各拠点へ接続しに行く 形にすればいいわけです。
Center(筆者の環境:RTX1300)
- フレッツ 光ネクスト+IPoE(MAP-E方式)のプロバイダ契約あり
- 各拠点のDDNS名(
〇〇.i.open.ad.jp)をプロバイダのDNSで調べて、自分から各拠点へ接続しに行く
各拠点(筆者の環境:RTX840)
- フレッツ 光ネクスト+v6オプションだけ(プロバイダ契約なし)
- 1分ごとに、ddns-proxy経由で自分のアドレスを更新する
- 相手のアドレスは決めずに、Centerからの接続を待つ
実際のVPNの通信は、NTT西日本のNGN網の中のIPv6を通ります。 筆者の環境では、IPoE契約のCenterと、v6オプションだけの拠点との間で、問題なく通信できています。
うれしいおまけもあります。拠点のIPv4のデフォルトルートをVPNに向けると、プロバイダ契約のない拠点でも、Center経由でインターネットが使えます。
準備:OPEN IPv6 DDNSでホストを作る
OPEN IPv6 ダイナミック DNS で、拠点ごとにホスト名を作ります。 作ったときに出てくる ホストキー は、あとで使うので控えておきましょう。
各拠点の設定(RTX840)
NGN(v6オプション)側のインターフェース
ipv6 lan2 dhcp service client ir=on
ngn type lan2 ntt
中継サーバーの名前を引けるようにする
中継サーバーのURLは、NTT西日本の「ネーム」の仕組み(p-ns.flets-west.jp)の中にあります。
なので、このドメインだけは、NGN網の中のDNSサーバーに聞きに行くよう設定します。
dns server select 500001 2001:a7ff:5f01::a 2001:a7ff:5f01:1::a any .p-ns.flets-west.jp
ちなみに、VPNの相手を探すのにネームを使っているわけではありません。ネームの仕組みを借りているのは、中継サーバーにたどり着くところだけです。
1分ごとにDDNSを更新する
本来の更新用URLは http://ddnsapi-v6.open.ad.jp/api/renew/ なのですが、NTT西日本のNGN網の中からは届きません。
そこで、URLの先頭を ddns-proxy のものに置き換えます(ddns-proxyの説明ページ)。
あとは、RTXのスケジュール機能とLuaで、1分ごとにアクセスするだけです。
schedule at 1 */* *:*:00 * lua -e "rt.httprequest({url=\"http://update.p-ns.flets-west.jp/open/api/renew/\?<ホストキー>=dummy\", method=\"GET\"})"
ここでのポイントは2つです。
dummy:アドレスの代わりにdummyと書いておくと、ddns-proxyがアクセス元のIPv6アドレスに置き換えて登録してくれます。自分でアドレスを調べて入れる必要はありません。\?:RTXのコマンドでは?を打つとヘルプが出てしまうので、\?と書きます。ここ、地味にハマりやすいです。
IPsecの通信を通す
拠点はCenterからの接続を受ける側なので、NGN側の受信フィルターでIPsecの通信を許可しておきます。
ipv6 filter 1040 pass * * udp * 500
ipv6 filter 1041 pass * * esp
ipv6 filter 1042 pass * * udp * 4500
ipv6 lan2 secure filter in 101000 101001 101002 1040 1041 1042
| 番号 | 通信 | 何のため? |
|---|---|---|
| 1040 | UDP 500 | IKE(鍵の交換) |
| 1041 | ESP | 暗号化された通信そのもの |
| 1042 | UDP 4500 | NATトラバーサル |
IPsec:相手を決めずに待つ
拠点側では、相手のアドレスを any(指定しない)にして、Centerからの接続を待ちます。
「誰からの接続か」は、名前(key-id)で見分けます。
tunnel select 1
ipsec tunnel 1
ipsec sa policy 1 1 esp aes-cbc sha-hmac
ipsec ike keepalive use 1 on heartbeat 10 6
ipsec ike nat-traversal 1 on
ipsec ike pre-shared-key 1 text <事前共有鍵>
ipsec ike remote address 1 any
ipsec ike remote name 1 <CenterのID名> key-id
ip tunnel tcp mss limit auto
tunnel enable 1
ルーティング
CenterのLANと、インターネット(IPv4)への通信をVPNに向けます。
ip route default gateway tunnel 1
ip route <CenterのLAN>/24 gateway tunnel 1
Centerの設定(RTX1300)
DNS
プロバイダのDNSサーバーで、各拠点のDDNS名(i.open.ad.jp)を引けるようにしておきます。
筆者の環境では、IPoEのインターフェースでDHCPv6からもらったDNSサーバーを使っています。
dns server dhcp lan3
dns server select 500000 dhcp lan3 any .
IPsec:各拠点のDDNS名へ接続しに行く
拠点ごとにトンネルを作って、相手のアドレスに 拠点のDDNS名 を入れます。
自分のIDには、拠点側の remote name と同じ名前を local name として設定します。
tunnel select 8
description tunnel <拠点のホスト名>.i.open.ad.jp
ipsec tunnel 7
ipsec sa policy 7 7 esp aes-cbc sha-hmac
ipsec ike keepalive use 7 on heartbeat 10 6
ipsec ike local name 7 <CenterのID名> key-id
ipsec ike nat-traversal 7 on
ipsec ike pre-shared-key 7 text <事前共有鍵>
ipsec ike remote address 7 <拠点のホスト名>.i.open.ad.jp
ip tunnel tcp mss limit auto
tunnel enable 8
拠点が増えたら、同じようにトンネルを足していけばOKです。
ルーティング
ip route <拠点のLAN>/24 gateway tunnel 8
試す前に、ここだけは気をつけて
- 事前共有鍵は長く、推測されにくいものに:拠点は相手を限定せずに待っているので、事前共有鍵とIDが実質的な守りになります。短い単語や、IDと同じ文字列はやめておきましょう。
- まずは疎通の確認から:IPsecを設定する前に、Centerから拠点のIPv6アドレスへ
ping6が届くか試しておくと、うまくいかないときの切り分けがぐっと楽になります。 - 登録されたアドレスを確認:OPEN IPv6 DDNSの管理画面で、拠点のアドレスがちゃんと登録されているか見ておきましょう。
- NTT東日本の回線とはつながりません:東西をまたいで通信するには、両方の回線にプロバイダ契約が必要です。
- ddns-proxyが止まったら:拠点のアドレスが変わっても更新されなくなります。長く使うなら、代わりの手段も頭の片隅に置いておくと安心です。
まとめ
NTT西日本でも、プロバイダ契約はCenterだけで、拠点間VPNは組めます。
- 各拠点:ddns-proxy経由でアドレスを登録して、Centerからの接続を待つ
- Center:各拠点のDDNS名を調べて、自分から接続しに行く
「どっちから接続するか」を逆にするだけで、NTT西日本の「名前が引けない」問題を避けられます。同じところでつまずいている方の参考になればうれしいです。
検証環境
- 回線:フレッツ 光ネクスト(NTT西日本)
- Center:YAMAHA RTX1300(Rev.23.00.16)、IPoE(MAP-E方式)のプロバイダ契約あり
- 各拠点:YAMAHA RTX840(Rev.23.02.02)、v6オプションだけ(プロバイダ契約なし)