CUBE SUGAR CONTAINER

技術系のこと書きます。

YAMAHA RTX830 で DS-Lite と PPPoE を併用して IKEv2 VPN を使う (ひかり電話なし)

今回は YAMAHA RTX830 で DS-Lite と PPPoE を併用しながら IKEv2 のリモートアクセス VPN を使えるようにする設定を紹介する。

リモートアクセス VPN を利用するためにはインターネット側を起点にした通信が必要になる。 しかし、DS-Lite の IPv4 通信は CGN が間に挟まっているので VPN のエンドポイントとして利用できない。 そこで、ISP の PPPoE で得られる動的な IPv4 アドレスを代わりに VPN のエンドポイントにする。 通常の IPv4 トラフィックは DS-Lite に流しながら、VPN のトラフィックだけをポリシーベースルーティングで PPPoE に向ける。

なお、動作に必要な最低限のコマンドだけを記述している。 実際に稼働させる場合には、セキュリティの観点からフィルタ (IPv4 / IPv6) を追加で設定するのが望ましい。 具体的な設定については、公式ドキュメントの設定例を参照のこと。 基本的には、以下の方針で設定することになるはず。

  • インターネットから LAN への通信を原則として遮断する静的フィルタ
  • LAN からインターネットへの通信を原則として通過させる動的フィルタ

また、インターフェイス的には LAN2 がインターネット側、LAN1 が自宅の LAN 側になる。 LAN のプライベート IP アドレスには 172.16.0.0/16 のサブネットを想定している。 ひかり電話の契約はないため IPv6 のアドレスはルータ広告で得られるプレフィックスから生成する。

使った環境は次のとおり。

# show environment 
RTX830 BootROM Ver. 1.01
RTX830 FlashROM Table Ver. 1.02
RTX830 Rev.15.02.30 (Wed Aug  9 16:15:25 2023)

もくじ

LAN2

まずはインターネット側に対応するインターフェイス LAN2 の設定から。 基本的には IPv6 でルータ広告とステートレス DHCPv6 を受け取る設定を入れる。

# LAN2 はキャリア回線として NTT NGN に接続している
ngn type lan2 ntt
# LAN2 で受信したプレフィックスを登録する
ipv6 prefix 1 ra-prefix@lan2::/64
# LAN2 で DHCPv6 を要求する (Inform-Request)
ipv6 lan2 dhcp service client ir=on

LAN1

続いて LAN 側に対応するインターフェイス LAN1 を設定する。

IPv4 に関してはプライベートアドレスを静的に付与してプロキシ ARP を有効にする。

# LAN1 に IPv4 アドレスを付与する
ip lan1 address 172.16.0.1/16
# IKEv2 のリモートアクセス VPN を使うので LAN1 はプロキシ ARP を有効にする
ip lan1 proxyarp on

IPv6 に関してはルータ広告のプレフィックスを元にアドレスを付与する。 また、LAN 側にいる端末が IPv6 で通信できるようにルータ広告と DHCPv6 サーバを有効にする

# LAN2 で受信したルータ広告のプレフィックスで LAN1 に IPv6 アドレスを付与する
ipv6 lan1 address ra-prefix@lan2::1/64
# LAN1 でルータ広告を有効にする (Other フラグ付き)
ipv6 lan1 rtadv send 1 o_flag=on
# LAN1 で DHCPv6 サーバを有効にする
ipv6 lan1 dhcp service server

PPPoE

続いては ISP の PPPoE を設定する。 いわゆる、一般的に NTT のフレッツを利用する際に使用する設定になる。 コマンドの pp は Peer-to-Peer の略で接続先情報を表すらしい。 <id><password> は ISP から提供された接続アカウントの内容に置換する。

# PP 1 番で PPPoE を設定する
pp select 1
 # 常時接続する
 pp always-on on
 # LAN2 で PPPoE を利用する
 pppoe use lan2
 # 自動で切断しない
 pppoe auto disconnect off
 # 認証方式に CHAP を利用する
 pp auth accept chap
 # 認証に使うアカウント
 pp auth myname <id> <password>
 # IPCP で IP アドレスを取得する
 ppp ipcp ipaddress on
 # IPCP で DNS サーバの IP アドレスを取得する
 ppp ipcp msext on
 # パケットを圧縮しない
 ppp ccp type none
 # NAT の設定に 1 番のデスクリプタを利用する
 ip pp nat descriptor 1
 # この PP 設定でネットボランチ DNS サービスを有効にする
 netvolante-dns use pp server=<num> auto
 # ネットボランチ DNS サービスのドメイン名を指定する
 netvolante-dns hostname host pp server=<num> <hostname>.<sub-domain>.netvolante.jp
 # PP 1 番を有効にする
 pp enable 1

上記で、PPPoE の IPCP で得られる動的 IP アドレスをネットボランチ DNS サービスに登録している点がポイントになる。 これによって VPN のエンドポイントが FQDN で解決できるようになる。

初回の設定をするときは pp select 1 した状態で、次のように <hostname> の部分だけを指定する。 この部分は、ドメイン名に沿った形でユーザが使いたいものを任意に指定する。

netvolante-dns use pp auto
netvolante-dns hostname host pp <hostname>

その上で、以下のコマンドを使って現在の IPv4 アドレスをネットボランチ DNS サービスに登録する。

netvolante-dns go pp 1

すると、設定が以下のような形に置き換わるはず。

netvolante-dns use pp server=<num> auto
netvolante-dns hostname host pp server=<num> <hostname>.<sub-domain>.netvolante.jp

置き換わったら設定を保存していく。

save

NAT

次に NAT (NAPT) を設定していく。

まずは PPPoE で Source NAT が使えるようにする。 先ほど設定した pp 1 では NAT のデスクリプタとして 1 番を指定していた。

# NAT のデスクリプタ 1 番で Source NAT を有効にする
nat descriptor type 1 masquerade

次に IPsec 関連のトラフィックを LAN1 に付与した IPv4 アドレスに Destination NAT する。 つまり、実際に VPN のエンドポイントになるのは LAN1 に付与された IPv4 アドレスということになる。

# ESP パケット
nat descriptor masquerade static 1 1 172.16.0.1 esp
# IKE パケット
nat descriptor masquerade static 1 2 172.16.0.1 udp 500
# NAT-T パケット
nat descriptor masquerade static 1 3 172.16.0.1 udp 4500

DS-Lite

次に DS-Lite を設定する。 といっても、単なる IP-IP トンネルに過ぎない。

# トンネル 1 番で DS-Lite を設定する
tunnel select 1
 # トンネル方式に IP-IP トンネリングを利用する
 tunnel encapsulation ipip
 # トンネルのエンドポイント (AFTR) を指定する
 tunnel endpoint name gw.transix.jp fqdn
 # トンネル 1 番を有効にする
 tunnel enable 1

ルーティング

続いて IPv4 のルーティングを設定する。 次のような方針で設定する。

  • メインの経路に DS-Lite のトンネルを利用する
  • バックアップの経路に PPPoE を利用する
  • IPsec 関連のトラフィックはポリシーベースルーティングで PPPoE に向ける

なお、YAMAHA のルータではポリシーベースルーティングをフィルタ型ルーティングと呼んでいる。

上記を反映したコマンドが次のとおり。 hide は接続が有効なときだけ経路として利用することを示す。 また weight はどれくらいの割合でトラフィックを流すかを指定する。 filter は、フィルタに合致したトラフィックだけをそのゲートウェイに流すことを意味する。

ip route default gateway tunnel 1 hide gateway pp 1 weight 0 gateway pp 1 filter 44051 44052 44053

つまり、DS-Lite が使える時はトラフィックをそちらに全て流し、使えない時は全て PPPoE に流す。 ただしフィルタに合致するトラフィックだけは常に PPPoE に流す、という意味になる。

コマンドの区切りを改行して分かりやすくしてみると次のようになる。 なお、あくまで例示のために改行しているだけで、この状態では有効なコマンドにならない。

ip route default
  gateway tunnel 1 hide
  gateway pp 1 weight 0
  gateway pp 1 filter 44051 44052 44053

上記で設定されているフィルタ型ルーティングに対応するフィルタは次のとおり。 LAN1 に付与した IPv4 アドレスが送信元になっている IPsec 関連のパケットがフィルタに合致する。 なお、フィルタ番号については任意の整数なので、取り違えにくいようなルールで自由に指定して構わない。

ip filter 44051 pass 172.16.0.1 * esp
ip filter 44052 pass 172.16.0.1 * udp 500 *
ip filter 44053 pass 172.16.0.1 * udp 4500 *

なお、IPv6 のルーティングに関してはルータ広告を元にデフォルトルートが自動で設定されるようだ。

DHCP サーバ

次に DHCP (DHCPv4) サーバを設定する。 といっても、サービスを有効にして払い出すアドレスレンジを指定するくらい。

# DHCP サーバを有効にする
dhcp service server
# リース情報を持たないクライアントからの DHCPREQUEST を無視する以外は RFC2131 の挙動に準拠する
dhcp server rfc2131 compliant except remain-silent
# DHCP サーバで払い出す IPv4 のアドレスレンジ
dhcp scope 1 172.16.1.1-172.16.1.254/16

DNS サーバ

DNS サーバに関してはプロキシのサービスを有効にする。 フルサービスリゾルバのアドレスは LAN2 から DHCPv6 で取得する。 PPPoE から取得する場合は dns server pp 1 を入れても良いけど、両方入っている場合は常に PPPoE が優先されるらしい。

# LAN1 で DNS サーバ (プロキシ) を有効にする
dns host lan1
# DNS サーバを LAN2 から DHCP で取得する
dns server dhcp lan2

IKEv2

そして IKEv2 のリモートアクセス VPN を設定する。 ipsec ike local name にはネットボランチ DNS サービスの FQDN を使っている。 ただ、もしかすると FQDN として解釈できる任意の文字列で良いかもしれない。 ipsec ike remote name には FQDN として解釈できる任意の文字列を入れる。 クライアント側で VPN の設定を作る際は localremote が入れ替わる点に注意する。 <psk> は IPsec の事前共有鍵なので、複雑で十分に長い文字列を指定する。

# トンネル 10 番で IKEv2 リモートアクセス VPN を設定する
tunnel select 10
 # トンネル方式に IPsec を利用する
 tunnel encapsulation ipsec
 # IPsec トンネル 1 番を設定する
 ipsec tunnel 1
  # IPsec ポリシー 1 番 / セキュリティゲートウェイ 1 番は ESP モードで動作する
  ipsec sa policy 1 1 esp
  # IKEv2 を利用する
  ipsec ike version 1 2
  # IKE Keepalive をログに出力しない
  ipsec ike keepalive log 1 off
  # RFC4306 方式で 10 秒毎に IKE Keepalive を送って 3 回失敗したら切断する
  ipsec ike keepalive use 1 on rfc4306 10 3
  # ローカル ID を指定する
  ipsec ike local name 1 <domain>.<sub-domain>.netvolante.jp fqdn
  # 事前共有鍵を指定する
  ipsec ike pre-shared-key 1 text <psk>
  # リモート ID を指定する
  ipsec ike remote name 1 <remote> fqdn
  # 配布するアドレスプールに 1 番を利用する
  ipsec ike mode-cfg address 1 1
  # IKE の鍵交換をルータ側から始動しない
  ipsec auto refresh 1 off
 # トンネル 10 番を有効にする
 tunnel enable 10

また、上記の設定で指定されている IKEv2 リモートアクセス VPN で配布するアドレスプールを定義する。

ipsec ike mode-cfg address pool 1 172.16.2.1-172.16.2.254/16

以上で RTX830 で DS-Lite と PPPoE を併用しながら IKEv2 のリモートアクセス VPN が使えるようになるはず。

クライアント側を設定する

あとはクライアント側に IKEv2 リモートアクセス VPN の設定をするだけ。 主な設定項目は前述のコンフィグから抜き出すと次のようになる。

  • エンドポイント
    • <domain>.<sub-domain>.netvolante.jp
  • リモート ID
    • <domain>.<sub-domain>.netvolante.jp
  • ローカル ID
    • <remote>
  • ユーザ認証
    • なし
  • 事前共有鍵
    • <psk>

つながらないときは syslog debug on にしたり、コンフィグを確認したり、パケットキャプチャしながら切り分けていく。

いじょう。

参考

www.rtpro.yamaha.co.jp

www.rtpro.yamaha.co.jp

www.rtpro.yamaha.co.jp