Starlink(スターリンク)でBCP対策、フレッツ光クロスと冗長構成、IPv6にも対応、情シス必見!?
2024年03月12日 火曜日
CONTENTS
BCP対策とStarlink
Starlinkが日本でも使えるようになり、新聞やテレビのCMでもその活躍が色々と紹介されるようになってきました。ウクライナ戦争での利用やイーロン・マスクの話題性から始まり、スターリンクトレインによる天文イベント的な認知、能登半島地震によって日本でも有用性がアピールされています。
企業のBCP対策に必要なインターネットへの接続性を確保する手段として期待は高くなる一方でいざ導入となるとどうしたらいいのか?調べてみてもなかなか的確な内容にたどりつかない状況があるかなとも思います。
今回はIIJエンジニアリングさんが用意してくれた神田オフィスのデモ環境で冗長構成を構築してみました。
用意したのは、メイン回線が「フレッツ 光クロス」、バックアップ回線が「Starlink レジデンシャル」です。インターネット接続に使うルータはSEIL/X4を2台IIJで用意しました。以前に紹介した、自作のSEIL/x86 Ayameでも動作すると思います。
関連リンク
これまで掲載してきたStarlink関係の記事をまとめていますので活用してください。
動画も公開していますので、よろしければそちらもあわせてご覧ください。
ブログ | 動画(YouTube) |
---|---|
冗長構成について
回線の冗長化にはVRRPを使いました。SEILのVRRPはIPv4だけでなくIPv6にも対応しているのでIPv6も冗長構成にしてみたいと思います。
IPv4のVRRP構成について
あまり書く事はないですが、
- VRRPの仮想ルータのIPアドレスは192.168.1.1/24
- ルータの実アドレスはそれぞれ192.168.1.2,192.168.1.3
- それぞれのルータでDHCPサーバを動かし、プールアドレスは被らないように配布
という構成にしました。
一つのネットワークセグメントで2台のDHCPサーバが動いている状態というのはあまり馴染みがないかもしれません。ただSEILは設定でこのような状態でも動かす事ができます。もちろん1台だけ動かすとか別にDHCPサーバを用意するという方法もとれます。
IPv6のVRRP構成について
IPv6のVRRP構成はネットやSEILのドキュメントをみてもあまり情報がありません。仕様などから2種類の構成を考えました。
- フレッツとStarlinkのパブリックネットワークをそのまま配布する
- 配布するアドレスはULAを用い、NAT6経由でそれぞれのパブリックネットワークに繋げる
実際に試してみるといくつか課題があり、結局採用したのはフレッツ側はULA+NAT6構成でStarlink側はパブリックネットワークを配布する変則的な構成でした。
なぜこのような構成になったのか?最終構成までの道のり
「IPv6でNATは使わない、アクセスコントロールはフィルタで実装する」が基本的なルールですから最初は「フレッツとStarlinkのパブリックネットワーク情報をそのまま配布する」で始めました(まぁこれで問題なく動けばラッキーぐらいの感覚です)。
この構成自体は動いたのですが、端末に割り当てられたIPアドレスの挙動をみていると
- 最初は フレッツのパブリックIPアドレスのみが設定されている状態
- VRRPの設定を変更して、Starlinkをプライマリに昇格させる
- Starlinkのアドレスがプライマリになり、セカンダリにフレッツのアドレスが残っている
- フレッツ側のセカンダリのアドレスがなかなか消えない
- この状態でVRRPを切り戻すと通信ができない?ようにみえた(検証不十分)
こんな挙動になりました。
フレッツのアドレスがいつまでも残っている原因はフレッツ網からDHCPv6で配布されているタイマー関係のパラメータ(valid-lifetime preferred-lifetime) が原因でした。これは配布されたネットワークの有効期間を表していてそれぞれ14400秒と12600秒になっていました。これだと12,600秒(3.5時間)はフレッツのアドレスが残る事になります。
Starlinkはこの値が1200秒、600秒とフレッツに比べてかなり短くなっているので、ネットワーク情報の配布が止まると10分で無効になります。これくらいの値なら許容範囲としました。
次に、試したのが当初のポリシーを捨てて、配布するネットワークはULAを用い、NAT6経由で繋げるという形式です。NAT6を使いULAを配布する形は端末の構成が切り替わってもネットワークをそのまま引き継げる事やlifetimeを独自に設定できる事から、動けばこれでもいいかなという気持ちになっていました。
しかし、まずNAT6の挙動を確認しようと手元のフレッツひかり(ひかり電話を契約しNTTのHGWに接続)の環境にSEIL/x86を繋いで試すと初っ端から通信できないという謎の現象に悩まされます。設定を有識者に確認しても問題はないと言われ途方にくれます。しかたないのでパケットをキャプチャして挙動を確認すると、HGWが想定外の挙動をして通信できなくなっていました。
そこでSEILは悪くないのですが、設定を若干変更する事で動くようになりました、またNAT6経由でインターネット側から通信できる事も確認できたのでこの設定を本番のフレッツに反映しました。この段階でフレッツはNAT6、Starlinkはパブリックアドレスという構成ができています。
次に、Starlink側でもNAT6の設定をやってみたのですが、これまた通信できなくなりました。おそらくStarlinkの網側の挙動が想定と違うんだろうなと思いつつ、一旦もとに戻しました。Starlink環境でパケットキャプチャして原因を探ろうろ思うと準備が必要なので、いったんこの変則的な構成で利用して問題があるか確認する事にしました。
なので現状はフレッツはNAT6、Starlinkはパブリックアドレスという変則構成なのです。アドレスが変化していく様子はこんな感じになります。
フレッツ回線利用中、IPv6アドレスがULAで設定した(fd00:192:168:1::/64)から割り当てられています。IPv4アドレスもフレッツ回線のSEILから割り当てられています。
VRRPの設定でStarlink回線の優先度を上げるとStarlinkのネットワーク情報がStarlink側のSEILからRAで配布されます。フレッツ側のSEILはバックアップに遷移しRA情報などは更新しなくなります。IPv4アドレスはそのまま使えます。
時間の経過とともにフレッツ側のアドレスのタイマー(preferred_lft)が0になると無効になります。
valid_lftが0になりネットワーク情報そのものが削除されます。
今後の予定とここまでの設定例
結局、フレッツとStarlink両方がULAになった構成は、Starlinkで通信できない原因が判明すれば動くようになると思います。確認できたらいずれブログで紹介しようと思います。
最後に現在までのSEIL/X4での設定例を紹介します。環境に固有な所は隠しますので、そのまま使えるわけではありませんが、参考にはなるかと思いますので同様の環境がある方は試してみてください。Starlinkの方は隠す所はないのでこれが動いている設定です。
SEILの設定例(フレッツ光クロス回線向け)IPv4は固定IPでの利用
interface.ge0.ipv6.address : router-advertisement route.ipv6.0.destination : default route.ipv6.0.gateway : router-advertisement dhcp6.client.service : enable dhcp6.client.0.interface : ge0 dhcp6.client.0.prefix-delegation.0.subnet : ge0 dhcp6.client.0.prefix-delegation.0.sla-id : 0x0000 dhcp6.client.0.prefix-delegation.0.interface-id : ::feed interface.loopback0.ipv4.address : ***.***.***.***/32 interface.tunnel0.ipv6.source : ge0 interface.tunnel0.ipv6.destination : ****:****:0000:0000:0000:0000:****:**** interface.tunnel0.ipv4.address : loopback0 interface.tunnel0.ipv4.tcp-mss : 1420 interface.tunnel0.mtu : 1460 route.ipv4.0.destination : default route.ipv4.0.gateway : tunnel0 resolver.service : enable resolver.1.address : 2001:4860:4860::8888 resolver.2.address : 2001:4860:4860::8844 interface.ge1.ipv4.address : 192.168.1.2/24 interface.ge1.ipv6.address : fd00:192:168:1::2/64 dhcp.server.service : enable dhcp.server.0.expire-detail: 20m dhcp.server.0.interface : ge1 dhcp.server.0.pool.address : 192.168.1.150/24 dhcp.server.0.pool.count : 100 dhcp.server.0.gateway : 192.168.1.1 dhcp.server.0.dns.0.address : 8.8.8.8 dhcp.server.0.ignore-unknown-request: enable nat.ipv4.napt.0.private: 192.168.1.0-192.168.1.255 nat.ipv4.napt.0.interface: tunnel0 router-advertisement.service:enable router-advertisement.0.interface:ge1 router-advertisement.0.advertise.0.prefix:auto router-advertisement.0.other-flag:enable router-advertisement.0.max-interval:10 router-advertisement.0.dns.0.address: 2001:4860:4860::8844 router-advertisement.0.advertise.0.valid-lifetime: 1200 router-advertisement.0.advertise.0.preferred-lifetime: 600 vrrp.vrouter.0.interface: ge1 vrrp.vrouter.0.vrid: 1 vrrp.vrouter.0.address: 192.168.1.1 vrrp.vrouter.0.priority: 100 vrrp.vrouter.0.watch.interface : ge0 vrrp.vrouter.1.interface: ge1 vrrp.vrouter.1.vrid: 61 vrrp.vrouter.1.address: fe80::1 vrrp.vrouter.1.priority: 100 vrrp.vrouter.1.watch.interface : ge0 nat.ipv6.0.interface: ge0 nat.ipv6.0.internal: fd00:192:168:1::/64 nat.ipv6.0.type: transparent
SEILの設定例(Starlink向け)
interface.ge0.ipv6.address : router-advertisement route.ipv6.0.destination : default route.ipv6.0.gateway : router-advertisement interface.ge0.ipv4.address : dhcp interface.ge0.ipv4.alias.0.address: 192.168.100.2/24 route.ipv4.0.destination : default route.ipv4.0.gateway : dhcp resolver.service : enable resolver.1.address : 2001:4860:4860::8888 resolver.2.address : 2001:4860:4860::8844 ntp.service : enable ntp.client.1.address : ntp1.v6.mfeed.ad.jp ntp.client.2.address : ntp2.v6.mfeed.ad.jp ntp.client.3.address : ntp3.v6.mfeed.ad.jp dhcp6.client.service : enable dhcp6.client.0.interface : ge0 dhcp6.client.0.prefix-delegation.1.subnet : ge1 dhcp6.client.0.prefix-delegation.1.sla-id : 0x0001 interface.ge1.ipv4.address : 192.168.1.3/24 dhcp.server.service : enable dhcp.server.0.expire-detail: 20m dhcp.server.0.interface : ge1 dhcp.server.0.pool.address : 192.168.1.50/24 dhcp.server.0.pool.count : 100 dhcp.server.0.gateway : 192.168.1.1 dhcp.server.0.dns.0.address : 8.8.8.8 dhcp.server.0.ignore-unknown-request: enable nat.ipv4.napt.0.private: 192.168.1.0-192.168.1.254 nat.ipv4.napt.0.interface: ge0 router-advertisement.service : enable router-advertisement.0.interface : ge1 router-advertisement.0.advertise.0.prefix : auto router-advertisement.0.other-flag : enable router-advertisement.0.max-interval:10 router-advertisement.0.dns.0.address: 2001:4860:4860::8844 router-advertisement.0.advertise.0.valid-lifetime: 1200 router-advertisement.0.advertise.0.preferred-lifetime: 600 vrrp.vrouter.0.interface: ge1 vrrp.vrouter.0.vrid: 1 vrrp.vrouter.0.address: 192.168.1.1 vrrp.vrouter.0.priority: 99 vrrp.vrouter.0.watch.interface : ge0 vrrp.vrouter.1.interface: ge1 vrrp.vrouter.1.vrid: 61 vrrp.vrouter.1.address: fe80::1 vrrp.vrouter.1.priority: 99 vrrp.vrouter.1.watch.interface : ge0