Splatoon2のLAN プレイモードが無線だとインターネット接続必須なのでパケットキャプチャしてみた

# オフラインでのSplatoon2の対戦方法（通信方式）
Splatoon2のオフ会では個々のプレヤーがNintendo Switchを持ち込んで対戦をするが、主に3つの方法がある。 

* [ローカル通信](https://support.nintendo.co.jp/app/answers/detail/a_id/34684)
    * Nintendo Switch同士で直接接続する方法のため追加の機器が不要。
    * 混線しやすいらしい。
    * 最大8人までのため、9台目、10台目を観戦モードで参加することができない。
* [LANプレイ（有線）](https://support.nintendo.co.jp/app/answers/detail/a_id/34661)
    * ルータを介して通信する方法で、LANケーブルで接続する。
    * ルータとプレイヤー分のLANポートを持つハブ、プレイヤー分のLANケーブルが必要である上、「USB Type-C -> USB Type-A -> LANポート」等の変換アダプタもプレイヤー分必要で、用意が大変。
    * 最も通信が安定する方法。
    * （Nintendo Switchドックを使用する場合は更にモニタ、HDMIケーブル、純正ACアプタなどが必要。。）
    * 9台目、10台目を観戦モードで参加することができる。
* LANプレイ（無線）
    * LANプレイ（有線）と同様ルータが必要だが、無線で接続するため、ケーブル類の持参が不要になる。
    * __ルータのWAN側がインターネットに接続している必要がある。__
    * モバイルWiFiなど、性能が低いルータに多数のNintendo Switch接続すると、プレイ中に通信が切断される可能性があるので注意。
    * 9台目、10台目を観戦モードで参加することができる。
    * 有線接続と無線接続のNintendo Switchが同一ネットワークなら混在して対戦可能。
    * LANプレイは有線前提なので任天堂非公式の接続方法。

# 目的
LANプレイ（無線）の方式のほうが通信も安定し、大量のLANケーブル類が不要なのでオフ会の開催がしやすい。
しかし、Splatoon2に限ったことではないが、Nintendo Switchで無線接続する際には、接続先のルータのWAN側がインターネットに接続していないと失敗し、このようなエラーが出る。

インターネット側につながらないと無線ルータへの接続自体もだめ。
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/149690/980725ca-7de9-3be2-d84b-9a5c703dfa33.png)

詳細を見ると何らかのDNS名前解決をしようとしてエラーになっている模様。
![2018122915332300-1AB131B6E6571375B79964211BB3F5AE.jpg](https://qiita-image-store.s3.amazonaws.com/0/149690/01b333e5-dc67-53a5-ec8b-7819159c85e3.jpeg)

そのため、いつもは無線ルータのWANポートからモバイルWiFiのドックへ有線接続をして、外部のインターネット接続を確保している。
ただ、できれば無線ルータ一つでオフ会環境ができると嬉しいため、Nintendo Switchが無線接続する際にどんな通信をしているかパケットキャプチャして、何か対応策がないか検討する。

# ネットワーク構成
調査時のネットワーク構成はこんな感じ。

Nintendo Switch (192.168.0.102) <-無線-> ルータ(192.168.0.254) <-無線-> キャプチャマシンのMacBook（192.168.0.100）

* ルータ： TP-Link TL-WR710N
* キャプチャソフト：Mac OS版 Wireshark Version 2.6.5
* キャプチャタイミング：Nintendo Switchからアクセスポイントに無線接続をし、接続開始から接続完了または接続失敗まで
* 無線セキュリティプロトコル：暗号化なし。
※無線を暗号化している場合に、パケットを横取りするには WiresharkにSSIDやPre Shared Keyを設定する必要があるが、Wiresharkの最新UIでどうやって設定するかすぐに分からなかったため、危険だが一時的に暗号化を無効化した。。

# キャプチャ結果
## ルータがインターネット接続していない場合
ルータに接続後、DHCPによるIPアドレス取得をした後に、Nintendo SwitchからDNS(Dst Port 53)プロトコルによるリクエストをルータ経由で送信している。
DNSリクエストでは「ctest.cdn.nintendo.net」のIPアドレスを取得しようとしている。
当然インターネットにつながっていないため、DNSサーバからのリクエストの返答がなく、ここで接続失敗。

<img width="1026" alt="offline.png" src="https://qiita-image-store.s3.amazonaws.com/0/149690/bcde3f56-c90e-0d10-3e3e-b1ee376b00b9.png">

## ルータがインターネット接続している場合
DNSリクエストをするところまでは同じだが、DNSサーバから「ctest.cdn.nintendo.net」のIPアドレスを応答している。ここでは「210.143.147.155」と「210.143.147.138」で、どうやらAkamaiがホストしているCDNサーバだった模様。

<img width="1137" alt="online1.png" src="https://qiita-image-store.s3.amazonaws.com/0/149690/912d845e-84cb-cd1e-2a49-4d9527f063ea.png">

「ctest.cdn.nintendo.net」の名前解決後、「210.143.147.155」へシンプルなHTTPのGETリクエストを送信。
```GET / HTTP/1.1\r\n```
<img width="1137" alt="online2.png" src="https://qiita-image-store.s3.amazonaws.com/0/149690/f75c095e-5ebf-62d6-3e47-0cd63d22170a.png">


「210.143.147.155」から「HTTPステータスコード200」と「ok」の本文を返却。
この時点で無線接続成功。
<img width="1137" alt="online3.png" src="https://qiita-image-store.s3.amazonaws.com/0/149690/714bbfe9-c727-1dbb-cc5e-21ee364fac80.png">

# まとめ
* Nintendo Switchは無線接続時に、「ctest.cdn.nintendo.net」へHTTP GETリクエストを送信することでインターネット接続を確認しているということが推測できる。
* ローカルネットワーク内にDNSサーバを構築し、さらに「ctest.cdn.nintendo.net」を偽ったモックサーバも構築してHTTPで「ok」テキストのレスポンスを返せば、インターネット接続なしでも無線接続できる可能性がある。
    * これには少なくともPCが一台必要なのであまり便利にならない。。
* 任天堂に無線接続の仕様を変えてほしい。

# 他の事例
以下の情報によるとインターネットなしでも無線接続が成功したとのことだが、~~どのように実施したかは不明。~~ 記事を書かれた@kntmar31さんから詳細な状況をコメントで頂いたのでコメント欄を参照。

 [「Splatoon 2 のイカッチャでの LAN プレイは無線 LAN 環境でも可能だったというお話」](https://note.mu/kntmar31/n/nb592923325e3)
>しかしインターネットに繋がっていないルーターに Nintendo Switch は接続してくれるのか不安があったのですが、ちょっと裏技めいた繋ぎ方ではあったものの、なんとか接続させる事はできました！


また、以下の記事でもインターネット接続なしで成功している模様。

[「Splatoon2のイカッチャでLANプレイを使って観戦モードをやる方法」](http://blog.mogmet.com/splatoon2-how-to-lan-play-on-ikatcha-to-public-viewing/)
>LANプレイをするには無線ルータなどに接続し、Nintendo Switch同士がLAN（ローカルエリアネットワーク）に接続する必要があります。

>ルータ自体はインターネットに接続する必要はございませんが、ルータの設定にもよってはLANが構築できないものもあるかもしれません。


上記の状況からは無線ルータの仕様によってはインターネット接続がなくても無線ルータに無線接続できる可能性がある。
無線ルータ等の情報があればコメント頂けると嬉しいです。