スプラトゥーンで勝つために他のISPとピアリングした話

# スプラブーム再来
3ヶ月ぶりの投稿ですね、前回の投稿はサークルの友達が全員Palworldにハマってしまって、誰もスプラトゥーン（スプラ）で一緒に遊んでくれないのが寂しく、無理やり[M1マックにPalworldを入れた話](https://qiita.com/FRESH-SHIN/items/238870e723858c0ec2de)をしましたが、最近は春シーズンも始まり、スプラも少し盛んになってきました。

ところでみなさん、ガチエリアのエリア強制確保はご存知でしょうか。スプラトゥーンは基本どっちのチームがより塗っているかで勝負が決まるゲームですが、それ以外にも様々なゲームルールがあります。

__ガチエリアは、ステージの中央にある四角いマークで囲まれた「ガチエリア」と呼ばれる小さいエリアを塗り合うルール__ です。ガチエリア内の8割ほどを塗ると「エリアを確保」でき、確保した状態を維持し続けると「カウント」が減っていきます。このカウントがゼロになった方が勝ちます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/894060/37ef4c1e-0f11-8500-b86c-6a95c364cbf5.png" width="500px">

ガチエリアの確保には周辺の領域を塗り潰すと、同時に周りの敵も殺すことができる強力なサメライドという必殺技があり、この技を使うことで、一瞬でゲームの流れを変えることができます。

ある日、サメライドに関してこの動画を発見してしまいました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/F1fUMYfzjaw?si=ACTNz961BRhsuXVn" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

動画で重要なポイントを要約すると、
- サメライドでは必ずしもエリアを確保できるとは限らない
- エリアの確保のためには __ゲームのホストが有利__
- ホストになればエリア強制確保の確率が上がる

ということです。

スプラトゥーンにはホストと呼ばれるロールが存在し、その１人だけが管理する処理があります。ホストは「サーモンラン」等のルールで金イクラの位置を管理しており、金イクラ取得の際の遅延（ラグ）が一切なく、誰よりも優先して金イクラを取ることができます。

- __エリア確保も同様にまた、その判定をするのはホストであるためゲームのホストが有利__ といえます
- 塗りの反映が遅いのもホスト役から自分への通信の遅延が発生するためです。長い間塗れなくなり、試合そのものが落ちる現象はホストが落ちるときに起こります

ホストには、 __ネット環境の良いプレイヤーの方が選ばれやすい__ みたいです。良いネット環境とは何かというと

- 遅延（レイテンシ）が少ないこと
- 帯域幅が広く複数のセッションを張っても問題なくスループットが出ること

を指すようです。

# じゃとにかく速い回線を引こうぜ
ということで、突然ですが、他のISPと契約を結んでL1レベルで直接ピアリングすることで、低遅延の回線[^1]を引くことに成功しました。難しい話は後です。とりあえず高速な回線を手に入れたということがこの記事では重要なのです。

[^1]: 具体的なISP名や契約情報に関しては諸事情につき公開できません。あらかじめご了承ください。

## ISPって何だよ

一般にインターネットでは、複数の端末が集団をなすことでISP（AS番号を持つ組織）といった大きな集団を形成します。これらのISPは必ずインターネットで相互に接続しており、直接は接続していないAS組織であっても、インターネットに疎通する以上、必ずどこかのAS組織を介して他の全てのAS組織と繋がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/894060/58b46a81-719f-7014-c0cc-586a55cc2ac8.png)[^20]

[^20]: 「[ASとは（自律システムとは）？ネットワーク初心者向けにわかりやすく1分で解説｜BizOnline](https://it-biz.online/it-skills/autonomous_system/)」より引用

ISPを経由するインターネットへの接続は、日本においてはNTT東西のNGN網を経由してISPと、NTT東西から与えられるIPv6アドレスを用いてトンネル（IPIP、IPSec、GRE等）を張ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/894060/63cbb861-8c95-ad63-1d5d-d26b533fbacf.png)[^30]

[^30]: 「[「NGN」とは何でしょう？｜日経XTECH](https://xtech.nikkei.com/it/pc/article/NPC/20070827/280394/)」より引用

上の図で言うところの「プロバイダ」と「パソコン」がトンネルの両端に相当します。

そのあとIPv4で構成されるインターネットの世界へアクセスするためにはISPが所有しているゲートウェイ・ルータからIPv4へのパケットの交換を行い、インターネットが使えるような状態になります（IPoE方式の場合）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/894060/3e5fd816-6a60-b88c-6644-ef35a5106132.png)[^40]

[^40]: 「[IPoE IPv6 ローミング接続サービス｜BBIX](https://www.bbix.net/service/ipoe/)」より引用

しかしながら、IPoE方式におけるゲートウェイ・ルータでさえ複数の加入者を収用しているために、帯域幅が限られており、ゲートウェイ・ルータが輻輳を起こしている場合、遅延やスピード低下の原因となります。

本来は適切なプロバイダを選定すべきところですが、あえて力業で、__NGN網を経由せず直接IPv4ネットワークに接続する__ ことができれば、低遅延でスプラトゥーンができるんじゃないかなと言う考えに至りました。

# ISP同士のピアリングへ
ここからは自らISPとして他のISPとピアリングする方法を書いていきたいと思います。

## 必要なもの - IPv4アドレス、そしてAS番号
[前の投稿](https://qiita.com/FRESH-SHIN/items/51368286d079b66a4c06) からも何回か説明したことでもありますが、インターネットを使って通信するには __IPv4アドレス__ を取得している必要があります。IPv4アドレスは近年枯渇してきており、これ以上新規のIPv4の取得はなかなか難しくなってきてるようです。代替手段としては、IPv6アドレスを新規取得する方向で行くのが良いかもしれません。

他には __AS番号__ というものを取得する必要があります。AS番号は個別のネットワークを識別する番号です。インターネットは複数のネットワークが集まってできた集団なので、そのネットワークを管理する集団（ISPやクラウド事業者など）を識別するために必要な番号がこれです。

※ ASの概要については[Cloudflareさんが作成した記事](https://www.cloudflare.com/ja-jp/learning/network-layer/what-is-an-autonomous-system/)もよくまとまっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/894060/e7b9a2c3-ed5b-8309-6698-573a4a671dc2.png)

上の図において、Global Tier1にあたるISPとは例えば、
- AT&T （米国）
- NTTコミュニケーションズ（日本）
- Orange（フランス）
- Arelion（スウェーデン）

などが該ります。Tier2は例えば

- Hurricane Electric（米国）
- インターネット・イニシアティブ【IIJ】（日本）
- KDDI（日本）
- British Telecom（英国）

などがこれにあたります[^50]。

[^50]: 「[Tier2 Network｜Wikipedia](https://en.wikipedia.org/wiki/Tier_2_network)」を参考

## 実際の通信経路 - 我々の通信内容はどこへ行くのか
![0800_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/894060/2247c3d1-c7ab-5ab4-f691-61e4e70d383b.gif)[^60]

[^60]: 「[インターネット10分講座：BGP｜JPNIC](https://www.nic.ad.jp/ja/newsletter/No35/0800.html)」より引用、一部改変

例を挙げると、Cloudflareが提供しているDNSサーバ1.1.1.1に接続するには次のルートを経由します。

1. 自分のISPがピアリングしているIXにパケットが到達、パケットは __上流ISP2__ へ
1. ISP2からCloudflareへパケットが到達、パケットは __Cloudflare__ へ
1. Cloudflareは自分のルータを使って __1.1.1.1のホスト__ へアクセス。
パケットは２で通ったルートを通ってクライアント側に返される

他のISP（例：ISP2）を通して、Cloudflareへアクセスするためには、我々がどのAS番号を持っていて誰と繋がっているのかという情報（ __経路情報__ ）を他のISPに周知させる必要があります。これを __ピアリング__ と呼んだり、 __トランジット__ と呼んだりします。

# BGPによる経路交換
経路情報を他のISPに周知させる（ __広報する__ ）ためには、 __BGP（Border Gateway Protocol）__ という仕組みを使います。BGPで直接接続しているASに対して広報する情報は大体以下の通りです。

- AS番号（例：AS60001）
- 自分が 地域レジストラ（例：[JPNIC](https://www.nic.ad.jp/ja/)） から割当を受けたIPv4アドレス
（例：192.168.100.0 - 192.168.100.255，または 192.168.100.0/24）

## 実際の設定例
我々は今回資金がなかったので、ネットで適当なシャーシを購入し、その辺に落ちていたマザーボードと電源、そしてCPUなどをかき集めて全部ぶち込み、BGPルータを自作しました。

そして完成したものがこれです。よく見かけるサーバの形をしたナニカです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/894060/edece023-8aca-752d-1b22-610408906aea.png" width="300px">[^70]

[^70]: 写真のシャーシは [RM23-502-MINI｜SilverStone](https://www.silverstonetek.com/jp/product/info/server-nas/RM23-502-MINI/)

この全てを詰め込んだ特級呪物には、Ubuntu上にFRRoutingをインストールし、ホワイトボックスルータとしました。configの動作にあたり、 __FRRoutingのbgpdをonに設定__ する必要があります。

実際のconfigの例は下記の通りです。

```
frr version 9.1
frr defaults traditional
hostname myrouter
log syslog informational
no ipv6 forwarding
service integrated-vtysh-config
!

ip route A.B.0.0/24 A.B.0.1
ip route A.B.1.0/24 A.B.0.1
ip route C.D.E.188/30 C.D.E.189
!
interface enp1s0f0np0
 ip address C.D.E.188/30
exit
!
interface enp1s0f1np1
 ip address A.B.0.0/24
exit
!
!
router bgp 150xxx
 bgp router-id A.B.0.1
 neighbor C.D.E.189 remote-as 2xxx
 neighbor C.D.E.189 ebgp-multihop
 !
 address-family ipv4 unicast
  network A.B.0.0/23
  neighbor C.D.E.189 soft-reconfiguration inbound
  neighbor C.D.E.189 route-map ALLOW-ALL in
  neighbor C.D.E.189 route-map rmap-asns out
 exit-address-family
exit
!
access-list rmap-prefix seq 5 permit A.B.0.0/23
!
!
!
route-map ALLOW-ALL permit 100
exit
!
route-map rmap-asns permit 5
 match ip address rmap-prefix
exit
!
```

## 注意点
BGPの設定にあたっていくつか注意点があるので、紹介したいと思います。

### １．eBGPに対してポリシーの設定が必須
BGPと一括りに書きましたが、実際のBGPには

- eBGP（__他の自立システム等と接続__ し、経路情報を全世界に対して広報するときに使う）
- iBGP（__同一の自律システム内__ で経路情報の交換を行う時に使う）

と２種類あります。eBGPは全世界に対して繋がっていますので、どのルートを受け入れてどのルートを広報するかをポリシーとして指定してあげないといけません。

上の設定例には反映してはいますが、改変して利用するときに特別留意すべきポイントです。

### ２．Ubuntuの設定で、ipv4.forwardingをonにすることが必要
LinuxをL3ルータとして使うためには、Linuxの設定で __ipv4のフォワード機能をon__ にする必要があります。

`sudo nano /etc/sysctl.conf` 等のコマンドによって

```ruby:/etc/sysctl.conf
net.ipv4.ip_forward = 0
↓
net.ipv4.ip_forward = 1
```
のように `net.ipv4.ip_forward` を `1` に変えてください。

### ３．Ubuntuの設定で、NetworkManagerをdisableに設定
せっかく入れたfrrの設定が、再起動したらインターフェースに対するIPアドレスの指定などが全部消えてしまい、frrのサービスを再起動するまでIPアドレスが割り当てられない問題を発見しました。

UbuntuのNetworkManagerとFRRサービスが同時にIPを割り当てようとするためにこの不具合が起きているものと思われます。私の場合は、NetworkManagerを使わないようUbuntu側で設定したところ、再起動してもIPアドレスがfrrで指定した通り反映されるようになりました。

この設定をするためには、__ターミナルで `sudo systemctl disable NetworkManager` を実行__ します。

### ４．QSFP28モジュールを使うときはベンダーロックに注意
今回、Mellanox Connect-X5というネットワークカード（NIC）を使いましたが、どうやら __Mellanox製のNICは、同じ `Mellanox互換` のQSFP28モジュールでないと使えない__ ようです。

他のL2スイッチとの間で試してみたところ、リンクアップしませんでした。試しに、`Cisco互換` → `Mellanox互換` へQSFP28モジュールのファームウェアを無理やり書き換えてみたところ、正常に動作したので __そういうこと__ だと思います。

このようなベンダーロックを実装しているのは、私の知る限りではNVIDIA(Mellanox)だけですが、他のメーカーでもこのような事象があるかもしれません。

CiscoとBrocade、HPEのSFP+ NICに関しては、このようなベンダーロックインは確認できませんでしたが、現行の100G QSFP28 NICはIntelとMellanoxのチップを積んだものの２種類しか市場にないのでこのような事象に遭遇する可能性は高いと思います。

# ぼくの考えた最強の回線でスプラをやった結果
最強の回線で「ガチエリア」に挑んだ結果、実力の低さゆえ、3回連続で敗北してしまいました。Xマッチのレートは200下がりました。

結果、最強の回線を引いても **勝てるかどうかはプレイヤーの実力** であって、ネットワーク品質はさほど大きく影響しません。