Starlink(スターリンク)でBCP対策、フレッツ光クロスと冗長構成、IPv6にも対応、情シス必見!?

2024年03月12日 火曜日


【この記事を書いた人】
谷口 崇

結構長くゲーム業界に出向していましたが、2022年秋に戻ってきました。 ゲーム業界での経験も生かしながらIIJのエンジニアとしてちょっと面白いことを提供できていければいいなぁと思っています。 格闘ゲームの世界チャンピオン(Evo2017)になった従兄弟がいますが彼にゲームを教えたのは僕ではありません。2023年は4位でしたね、おめでとうというべきか残念というべきか。 どうぞよろしくお願いします。

「Starlink(スターリンク)でBCP対策、フレッツ光クロスと冗長構成、IPv6にも対応、情シス必見!?」のイメージ

BCP対策とStarlink

Starlinkが日本でも使えるようになり、新聞やテレビのCMでもその活躍が色々と紹介されるようになってきました。ウクライナ戦争での利用やイーロン・マスクの話題性から始まり、スターリンクトレインによる天文イベント的な認知、能登半島地震によって日本でも有用性がアピールされています。

企業のBCP対策に必要なインターネットへの接続性を確保する手段として期待は高くなる一方でいざ導入となるとどうしたらいいのか?調べてみてもなかなか的確な内容にたどりつかない状況があるかなとも思います。

今回はIIJエンジニアリングさんが用意してくれた神田オフィスのデモ環境で冗長構成を構築してみました。

用意したのは、メイン回線が「フレッツ 光クロス」、バックアップ回線が「Starlink レジデンシャル」です。インターネット接続に使うルータはSEIL/X42IIJで用意しました。以前に紹介した、自作のSEIL/x86 Ayameでも動作すると思います。

関連リンク

これまで掲載してきたStarlink関係の記事をまとめていますので活用してください。
動画も公開していますので、よろしければそちらもあわせてご覧ください。

 

冗長構成について

回線の冗長化には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アドレスの挙動をみていると

  1. 最初は フレッツのパブリックIPアドレスのみが設定されている状態
  2. VRRPの設定を変更して、Starlinkをプライマリに昇格させる
  3. Starlinkのアドレスがプライマリになり、セカンダリにフレッツのアドレスが残っている
  4. フレッツ側のセカンダリのアドレスがなかなか消えない
  5. この状態で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

谷口 崇

2024年03月12日 火曜日

結構長くゲーム業界に出向していましたが、2022年秋に戻ってきました。 ゲーム業界での経験も生かしながらIIJのエンジニアとしてちょっと面白いことを提供できていければいいなぁと思っています。 格闘ゲームの世界チャンピオン(Evo2017)になった従兄弟がいますが彼にゲームを教えたのは僕ではありません。2023年は4位でしたね、おめでとうというべきか残念というべきか。 どうぞよろしくお願いします。

Related
関連記事