NECのVPN対応ルータで自宅と実家の間にVPNを張った話
自宅サーバは一台あるだけで人生に彩りを与えてくれる素晴らしいものですが、帰省などで暫く家を留守にしていると、外出先からアクセスしたくなるもののインターネットに公開するのはセキュリティ的に怖い、といったジレンマが頭を擡げてきます。お正月の特番を眺めながら、これを録画サーバで撮れていればと何度思ったことでしょうか。
こんな時に丁度良いのがVPN接続で、通信内容を秘匿しながら自宅に居るかのようにネットワーク接続できるため、サーバをファイアウォールの外に晒す心配がありません。
本記事では、NECのVPN対応ルータであるIX2215を2個使って、自宅LANと実家LANとの間をVPNで接続したようなネットワークを構築します。これにより、セキュリティを担保しながら実家から自宅サーバにアクセスできるだけでなく、自宅に居ながらの実家ネットワーク保守も可能になる*1ことでしょう。
本記事で構築するネットワークの要件
本記事では、以下のような要件を満たすネットワークを構築します。
- IPv4/IPv6デュアルスタックのインターネット接続
- IPv4 PPPoE接続による、IPv6 IPoE接続のインターネット回線を使ったIKEv2/IPsec VPNのバックアップ
- IPv4 PPPoE接続による、IPv6 IPoE + IPv4 over IPv6接続のインターネット回線のバックアップ
各要件を盛り込んだ理由は次の通りです。
IPv4/IPv6デュアルスタックのインターネット接続
自宅と実家共にフレッツ光コラボの回線を契約している*2ため、対応しているWebサイトはIPv6でアクセスできた方が速度的に好ましいのはもちろんですが、父がひかりTVを契約している事から来た要請です。本記事ではひかりTVに関する設定は割愛しますが、このサービスではNGN網からIPv6マルチキャストで放送内容が配信されるため、視聴にはIPv6対応が必要になります。
IPv4 PPPoE接続による、IPv6 IPoE接続の回線を使ったVPNのバックアップ
フレッツ光コラボのIPv4 PPPoE接続は大抵網終端装置が輻輳しており褒められたユーザ体験ではないのですが、手元の環境ではIPv6 IPoE接続のインターネット回線を使ったVPNが不安定だったので冗長化を行います。これに関しては環境依存な面が強いと思われますが、以下のような原因で接続が切れる機会に見舞われた記憶があります。
- 実家のVPN対応ルータがひかり電話ルータ*3配下に接続されているためか、一定期間実家からパケットが送られないと自宅からのパケットが通らなくなる*4
- NECの提供しているNetMeister DDNSサービスに何故かIPv6アドレスが登録されなくなる*5
- 普通に誤った設定を入れてしまった
実家のルータとの通信が途絶えた場合、復旧は物理的に困難なため信頼性を担保したいところです。一応NECの提供するクラウド型管理サービス、NetMeister*6からコマンドを流し込む手もありますが、誤った操作でクラウドとの接続が切れると時間経過でVPN接続まで失われかねない*7ため、個人的には最後の手段くらいに考えています。
IPv4 PPPoE接続による、IPv6 IPoE + IPv4 over IPv6接続のインターネット回線のバックアップ
別に実家の家族がIPv4でインターネットに接続できなくても僕は困らないのですが、先述の通りNetMeisterとの接続が途絶えると実家のルータに手を加える手段が全て失われてしまうため、バックアップに使える回線は使っておきます。
余談ですが、IX2215でOCNバーチャルコネクトを使ってIPv6 IPoE + IPv4 over IPv6接続を行うためにはバージョン10.2.20以降のファームウェアが必要です。ヤフオクに落ちてる激安IX2215は大抵ファームウェアが更新されてないので、まともな速度で通信したければソフトウェアダウンロードサイトへの接続申請書を書きましょう。
ネットワークの構築
それでは実際にネットワークを構築していきましょう。
OCNバーチャルコネクトによるインターネット接続の設定
まずはIPv6 IPoEとIPv6 IPoE + IPv4 over IPv6を使って、自宅と実家共に最低限インターネットに接続できるように設定します。自宅と実家両方ともOCNバーチャルコネクトを用いるプロバイダを契約しているため、NEC公式の設定例をインターフェース番号だけ読み替えて流し込めば良さそうです。
本記事では、NEC公式の設定例を以下のように変更して自宅のIX2215に流し込みます。自宅ではひかり電話を契約していないのでIPv6 RAを使う設定に従っていますが、バージョン10.3以降のファームウェアであればDHCPv6-PDとIPv6 RAのどちらが適切か自動判別する機能が存在するため、それを用いて設定しても良いかもしれません。
ip route default Tunnel0.0 ip dhcp enable ! ipv6 ufs-cache enable ipv6 dhcp enable ipv6 access-list deny deny ip src any dest any ipv6 access-list dhcpv6 permit udp src any sport any dest any dport eq 546 ipv6 access-list dhcpv6 permit udp src any sport any dest any dport eq 547 ipv6 access-list icmpv6 permit icmp src any dest any ipv6 access-list permit permit ip src any dest any ipv6 access-list ipip permit 4 src any dest any ipv6 access-list dynamic dynamic access permit ! proxy-dns ip enable proxy-dns ip request both ! ip dhcp profile dhcpv4-server dns-server 192.168.100.1 ! ipv6 dhcp client-profile dhcpv6-client information-request option-request dns-servers ! ipv6 dhcp server-profile dhcpv6-server dns-server dhcp ! interface GigaEthernet0.0 no ip address ipv6 enable ipv6 traffic-class tos 0 ipv6 dhcp client dhcpv6-client ipv6 nd proxy GigaEthernet2.0 ipv6 filter dhcpv6 1 in ipv6 filter icmpv6 2 in ipv6 filter ipip 3 in ipv6 filter deny 100 in ipv6 filter dynamic 100 out no shutdown ! interface GigaEthernet2.0 ip address 192.168.100.1/24 ip dhcp binding dhcpv4-server ipv6 enable ipv6 dhcp server dhcpv6-server ipv6 nd ra enable ipv6 nd ra other-config-flag no shutdown ! interface Tunnel0.0 tunnel mode map-e ocn ip address map-e ip tcp adjust-mss auto ip napt enable no shutdown
また、NEC公式の設定例ではNAPTに期待してかIPv4のファイアウォールが設定されていませんが、精神衛生上良くないのでWAN側から開始された通信は全て遮断しても良いかもしれませんね。
ip access-list deny deny ip src any dest any ip access-list permit permit ip src any dest any ip access-list dynamic dynamic access permit ! interface Tunnel0.0 ip filter deny 100 in ip filter dynamic 100 out
実家側のIX2215にも同様の設定を流し込むのですが、相互接続した際にLANのアドレス範囲が被らないよう*8192.168.10.0/24に変更しておきます。
ip route default Tunnel0.0 ip dhcp enable ip access-list deny deny ip src any dest any ip access-list permit permit ip src any dest any ip access-list dynamic dynamic access permit ! ipv6 ufs-cache enable ipv6 dhcp enable ipv6 access-list deny deny ip src any dest any ipv6 access-list dhcpv6 permit udp src any sport any dest any dport eq 546 ipv6 access-list dhcpv6 permit udp src any sport any dest any dport eq 547 ipv6 access-list icmpv6 permit icmp src any dest any ipv6 access-list permit permit ip src any dest any ipv6 access-list ipip permit 4 src any dest any ipv6 access-list dynamic dynamic access permit ! proxy-dns ip enable proxy-dns ip request both ! ip dhcp profile dhcpv4-server dns-server 192.168.10.1 ! ipv6 dhcp client-profile dhcpv6-client information-request option-request dns-servers ! ipv6 dhcp server-profile dhcpv6-server dns-server dhcp ! interface GigaEthernet0.0 no ip address ipv6 enable ipv6 traffic-class tos 0 ipv6 dhcp client dhcpv6-client ipv6 nd proxy GigaEthernet2.0 ipv6 filter dhcpv6 1 in ipv6 filter icmpv6 2 in ipv6 filter ipip 3 in ipv6 filter deny 100 in ipv6 filter dynamic 100 out no shutdown ! interface GigaEthernet2.0 ip address 192.168.10.1/24 ip dhcp binding dhcpv4-server ipv6 enable ipv6 dhcp server dhcpv6-server ipv6 nd ra enable ipv6 nd ra other-config-flag no shutdown ! interface Tunnel0.0 tunnel mode map-e ocn ip address map-e ip tcp adjust-mss auto ip napt enable ip filter deny 100 in ip filter dynamic 100 out no shutdown
ここで注意すべき点は、ひかり電話契約の有無についてです。うちの実家のようにひかり電話ルータのLANポートにIX2215を接続している場合、ひかり電話ルータが回線網からDHCPv6-PDでIPv6プレフィックスを受け取ってIPv6 RAで振り分けようとするため、ひかり電話を契約していてもIPv6 RAを使った設定をしなければなりません。*9
また、ひかり電話ルータのファイアウォール設定を変更する場合には192.168.1.1:80のWeb設定画面にアクセスする必要がありますから、ひかり電話ルータのLANポートと繋がっているIX2215のインターフェースに適当な*10IPv4アドレスを振って疎通可能にしても良いかもしれませんね。
interface GigaEthernet0.0 ip address 192.168.1.254/24 ip napt enable
別にNAPTを使わずにひかり電話ルータ側でスタティックルートを設定しても良いのですが、Web UIでしか設定を変更できない機器を下手に触ると、忘れた頃に問題が起こりそうなので極力触らない方針で運用しています。なお余談ですが、IX2215はペイロード内にIPv4アドレスを含むプロトコルについてはNATに対応していない場合があるので、ひかり電話ルータのSIPサーバ機能を使う際は注意が必要です。
IPv4 PPPoE接続による、IPv6 IPoE + IPv4 over IPv6接続のインターネット回線のバックアップ
次に、IPv4 PPPoE接続を使ってインターネット回線のバックアップを行います。IPv4 PPPoEに関してはNECの公式サイトにサンプルコンフィグ作成ツールが存在しますから、生成されたコンフィグから必要な部分を抜き出せば簡単に接続できます。
ppp profile flets-v4 authentication myname user-A@example.com authentication password user-A@example.com password-1 ! interface GigaEthernet0.1 ppp binding flets-v4 ip address ipcp ip napt enable ip tcp adjust-mss auto no shutdown
この設定例についてもファイアウォールが設定されていないので、一応WAN側からの通信は遮断する設定にしても良いかもしれませんね。
interface GigaEthernet0.1 ip filter deny 100 in ip filter dynamic 100 out
さて、IPv4 PPPoEでもインターネット回線に接続できたので、IPv6 IPoE + IPv4 over IPv6接続のインターネット回線がダウンした事を検知した際に切り替える設定を行いましょう。NEC公式サイトにある設定事例集を読むと、低い優先度でIPv4 PPPoE接続の回線にもデフォルトルートを用意しておき、watch groupで障害が確認された際にIPv6 IPoE + IPv4 over IPv6接続の回線へのデフォルトルートを落とせば良いことが分かります。
ip route default GigaEthernet0.1 distance 100 ! watch-group map-e 10 event 10 ip unreach-host 8.8.8.8 Tunnel0.0 action 10 turn-BAK-LED-on action 20 ip shutdown-route 0.0.0.0/0 Tunnel0.0 ! network-monitor map-e enable
ここではインターネット回線の疎通確認のために定期的に*118.8.8.8へpingを打っていますが、あまり行儀の良い行動ではないので*12適当なアドレスを入れるのが好ましいです。*13
NetMeisterへの登録
次にDDNSを使うために、NECの提供するクラウド型管理サービスであるNetMeisterへIX2215を登録します。自宅と実家の回線は共に固定IPアドレスを契約していないのですが、NetMeisterの提供するDDNSにIPアドレスを登録することで、変動IPアドレスであっても相互接続が可能になります。
NetMeisterへの端末登録はWeb UI*14から簡単に行えるのですが、NetMeisterからアクセスするためのIPv4アドレスを複数登録*15したり、NetMeister DDNSにIPv6アドレスを登録したりだとか詳細な設定はコマンドで行う必要があるようです。Web UIの操作は紙面で解説するのも難しいので、本記事では最初からコマンドで登録を行います。
まずNEC公式の設定事例集を参考に、以下のようなコマンドで自宅のIX2215をNetMeisterに登録します。ここで、混乱を避けるためにホスト名もユニークなものに変えておきましょう。言うまでもないですが、本記事を参考にする際はNetMeisterのグループ名、パスワード等々は自分の設定したものに読み替えてください。
hostname ix2215-tokyo ! nm ip enable nm account fetburner password plain password-fetburner
実家側のIX2215は次のように設定します。
hostname ix2215-kagawa ! nm ip enable nm account fetburner password plain password-fetburner
これでNetMeisterから各ルータが認識されるようになったので、次にDDNSの設定を行います。IPv6 IPoE + IPv4 over IPv6接続のIPv4アドレスはwell-knownポートを開けられる事が保証されないため、ちゃんとIKEv2/IPsecで使うポートが開くIPv4 PPPoE接続の方のIPv4アドレスを登録しておきましょう。
nm ddns notify interface GigaEthernet0.1 protocol ip nm ddns notify interface GigaEthernet2.0 protocol ipv6
ここで注意すべきは、IPv6 RAでインターネットに接続している場合にはIPv6アドレスはLAN側のインターフェースに割り振られる点です。WAN側のインターフェースはNDプロキシに設定されている場合にはL2レベルの通信に徹しようとするため、L3レベルの通信はLAN側のインターフェースから行われている事が原因と思われます。*16
ルータとNetMeisterとの通信が途絶えた場合、クラウドからルータの保守が不可能になるだけでなく、DDNSへのIPアドレス登録が不可能になり時間経過でVPNまで切れかねないため、予備の回線も登録して障害発生時に切り替える設定にしておきます。
nm standby ip enable nm outgoing-interface Tunnel0.0 auto protocol ip nm standby outgoing-interface GigaEthernet0.1 auto protocol ip ! watch-group map-e 10 action 30 netmeister-switch-mode standby
IKEv2/IPsec VPNの設定
いよいよお待ちかね、IKEv2/IPsec VPNの設定を行います。これに関してはNEC公式の設定事例集でも異様に紙面を割いて解説されているので、わざわざブログに書く事も無いかもしれませんね。
まずファイアウォールの設定を変更し、IKEv2で使うポートへのUDPパケットとIPsecで使うESPのパケットがWAN側から通るようにします。
ip access-list ikev2 permit udp src any sport any dest any dport eq 500 ip access-list ipsec permit 50 src any dest any ! ipv6 access-list ikev2 permit udp src any sport any dest any dport eq 500 ipv6 access-list ipsec permit 50 src any dest any ! interface GigaEthernet0.0 ipv6 filter ikev2 4 in ipv6 filter ipsec 5 in ! interface GigaEthernet0.1 ip filter ikev2 1 in ip filter ipsec 2 in
次に、IKEv2で使う事前共有鍵を設定します。*17
ikev2 authentication psk id keyid ix2215-kagawa key char ix2215-kagawa-psk ikev2 authentication psk id keyid ix2215-tokyo key char ix2215-tokyo-psk ! ikev2 default-profile local-authentication psk id keyid ix2215-tokyo
ここで、default-profile
で指定しているのは接続を受け付ける際のパスフレーズなので、実家のIX2215にはそちら用のものを設定します。
ikev2 authentication psk id keyid ix2215-kagawa key char ix2215-kagawa-psk ikev2 authentication psk id keyid ix2215-tokyo key char ix2215-tokyo-psk ! ikev2 default-profile local-authentication psk id keyid ix2215-kagawa
事前共有鍵が設定できたので、IPv4 PPPoE接続とIPv6 IPoE接続のインターネット回線を使って、IKEv2/IPsecのVPNを張っていきましょう。自宅側のIX2215の設定は次の通りです。
interface Tunnel1.0 tunnel mode ipsec-ikev2 ip unnumbered GigaEthernet2.0 ikev2 connect-type auto ikev2 outgoing-interface GigaEthernet0.0 auto ikev2 peer-fqdn-ipv6 ix2215-kagawa.fetburner.v6.nmddns.jp authentication psk id keyid ix2215-kagawa no shutdown ! interface Tunnel2.0 tunnel mode ipsec-ikev2 ip unnumbered GigaEthernet2.0 ikev2 connect-type auto ikev2 outgoing-interface GigaEthernet0.1 auto ikev2 peer-fqdn-ipv4 ix2215-kagawa.fetburner.nmddns.jp authentication psk id keyid ix2215-kagawa no shutdown
対向側の実家IX2215にはドメイン名や事前登録鍵を入れ替えた設定を流し込みます。
interface Tunnel1.0 tunnel mode ipsec-ikev2 ip unnumbered GigaEthernet2.0 ikev2 connect-type auto ikev2 outgoing-interface GigaEthernet0.0 auto ikev2 peer-fqdn-ipv6 ix2215-tokyo.fetburner.v6.nmddns.jp authentication psk id keyid ix2215-tokyo no shutdown ! interface Tunnel2.0 tunnel mode ipsec-ikev2 ip unnumbered GigaEthernet2.0 ikev2 connect-type auto ikev2 outgoing-interface GigaEthernet0.1 auto ikev2 peer-fqdn-ipv4 ix2215-tokyo.fetburner.nmddns.jp authentication psk id keyid ix2215-tokyo no shutdown
NetMeister DDNSを用いたお陰で、IPアドレスを指定せずとも相互に接続できていますね。
最後に、LAN側からVPNへのルーティングやバックアップ回線への切り替えを設定しておきましょう。ちなみに冒頭でも触れましたが、IPv4 PPPoE接続のインターネット回線とIPv6 IPoE接続のインターネット回線の両方でVPNを張ってバックアップを行うのは、ひかり電話ルータが悪いのか契約している回線が悪いのか、手元の環境ではIPv6 IPoE接続の回線を使ったVPNが妙に不安定なためです。
IPv4 PPPoE接続でIPv6 IPoE + IPv4 over IPv6接続の回線をバックアップする際には、プロバイダが気の利いたプロトコルを喋る必要のないwatch groupを使っていましたが、対向側ルータも自分が管理しているVPN接続の経路を適宜切り替えるのであれば、ダイナミックルーティングを使った方がルーティングテーブルを管理する手間が省けて良さそうです。
ここではOSPFv2を用い、IPv4 PPPoE接続の回線経由で張ったVPN接続には重めのコストを設定する事で適宜切り替えを行います。自宅と実家両方のルータに以下のような設定を流し込みましょう。
ip router ospf 1 redistribute connected area 0 network Tunnel1.0 area 0 network Tunnel2.0 area 0 ! interface Tunnel1.0 ip ospf mtu-ignore ! interface Tunnel2.0 ip ospf cost 100 ip ospf mtu-ignore
VPN接続経由でOSPFを使う場合は、MTUが異なる場合にもneighborを確立するためにip ospf mtu-ignore
を指定しなければならない点に注意が必要です。
まとめ
本記事では、NECのVPN対応ルータであるIX2215を2個使って、自宅LANと実家LANとの間をVPNで接続したようなネットワークを構築しました。これにより、セキュリティを担保しながら実家から自宅サーバにアクセスできるだけでなく、自宅に居ながらの実家ネットワークの保守を行えるようになりました。
本記事のネットワーク構成で課題となったのは、IPv6 IPoE接続の回線を使ったVPNが妙に良く切れる点です。とりあえずIPv4 PPPoE接続の回線をバックアップに使って誤魔化していますが、今度実家に帰ったらひかり電話ルータのONU部分にIX2215を直結して問題の切り分けを図っても良いかもしれませんね。
*1:果たしてそれは良い事なのだろうか…
*2:ちなみにフレッツ光の東西に跨がっているので、NGN折り返しで通信はできません
*3:NTTが貸し出している機器で、ONUとルータが一体になっている
*4:VPNをバックアップするために定期的に疎通確認でpingを打つよう設定するので、実は問題にならない説ある
*5:色々設定を変更していると起きがちで、再起動すると直る
*6:基本プレイ無料(一部課金要素あり)
*7:今回利用するNetMeister DDNSへのIPアドレス登録が不可能になる
*8:NATしても良いけど面倒
*9:ややこしいしもう自動判別機能使った方が良いんじゃないかな…
*10:192.168.1.0/24の
*11:頻度に関してはデフォルト設定なので二秒に一回
*12:「福岡大 NTP」で検索
*13:Androidから散々ウマ娘に課金してるし許してほしい
*14:/admin/detail/netmeister.html
*15:IPv6でNetMeisterからルータにアクセスする機能は課金コンテンツです
*16:この辺良く分からないのでIPv6に詳しい人が居たら教えて下さい
*17:設定の手間を惜しんでパスフレーズで認証したものの、セキュリティ的に気になるしデジタル署名とか使うように変更しても良いかも