TECH NOTES ネットワーク

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
番号通信何のため?
1040UDP 500IKE(鍵の交換)
1041ESP暗号化された通信そのもの
1042UDP 4500NATトラバーサル

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オプションだけ(プロバイダ契約なし)
この記事を書いた人
MIYA / Lauro Studio

IT・大型ビジョン・広告の会社で働いています。ブライダル映像の制作経験もあり。