SEILでニンテンドースイッチの「NAT越え」問題を解決する方法


概要

ニンテンドースイッチでオンラインゲームをする場合、しばしは遭遇するのが「NAT越え」問題です。
基本的にはルータがCone NATをサポートしていれば、UDPホールパンチング機能によるNAT越えが使えるため、この問題は起こりません。
しかしながらSEILのNATはSymmetric NATのみをサポートするためUDPホールパンチングは機能しません。
従って、この問題を解決するためにポートフォワード設定が必要です。

スイッチを使えるようにするためのポートフォワード設定(基本)

ニンテンドースイッチでNAT越え問題が発生した際の対処方法として、任天堂の公式サイトでは以下の手順を推奨しています。

  1. スイッチのIPアドレスを固定
  2. WANから入ってくるUDPパケット(ポート1~65535)を全てスイッチのIPアドレスにフォワード

ポートフォワード設定(任天堂公式/英語)

従って、SEILでも同様の設定を施すことで解決できます。
具体的にはnat定義に以下のような1行を足す事で解決できます(スイッチのIPアドレスを"192.168.10.100"に固定した場合)。

nat snapt add protocol udp listen 1-65535 forward 192.168.10.100 1-65535 enable interface pppoe0

ただし、全てのUDPパケットをスイッチにフォワードするのも心情的に宜しくありません。
実際には、40000~65535をフォワードしておけば問題ないようです。
実際、自分は以下のような環境で動作するのを確認しました。

スイッチを2台同時に使えるようにする(応用)

ポートフォワードをするとSymmetric NATのみをサポートするSEILでも、スイッチでネット対戦等が問題なくできるようになりますが、ここでもう一つ問題があります。
ポートフォワードはフォワード先のアドレスが固定されるため、同時に2台のスイッチをSEIL配下のLANに繋ぎ、NAT越えさせることができません。
これを解決する一番の方法はSEILを使わない事です。
Cone NAT系、できればポートとアドレス毎にパケットを制御できる「Port Restricted cone NAT」をサポートしているルータに交換する事が最も確実です。

ただし理由は人それぞれでしょうが、SEILを使うにはそれなりの理由があると思います。
以下は「SEILは使いたいけどスイッチも使いたい」と言うワガママな人向けの対応方法です。
環境は限りなく不格好ですが、使う事は出来ると思います。
細かい説明は省きます。まずは以下の図を見てください。

構成図の中にルータ(市販のブロードバンドルータ)が1台増えています。
そしてスイッチは、このブロードバンドルータに接続しています。スイッチのIPアドレスは固定でもDHCPでも構いません。
SEILからUDPパケットをブロードバンドルータにフォワードし、こちらで再度NATします。
つまり、自宅LAN内にスイッチ専用のネットワークを組むと言う方法です。

この構成が上手く動作するためには、追加したルータがCone NATをサポートしている必要があります。
こればかりは機種ごとに異なりますのでメーカーへの確認が必要ですが、最近の市販ブロードバンドルータはニンテンドースイッチ等メジャーなゲーム機の対応が出来ていないと売れませんから、最初からCone NATをサポートしているものが多いと思います。
自分はNEC製の安いブロードバンドルータを使いました。

この環境でSTUNnerというスマホアプリで接続中のネットワークのNATタイプを調べると、以下のような結果になりました。
左はSEIL直下のWiFiアクセスポイントにスマホを繋いだ結果で、右がポートフォワードしたWiFiブロードバンドルータにスマホをつないだ時の結果です。
左はSymmetric Cone(Symmetric NAT)なのに対して、右はPort Restricted Cone NATになっている事が分かるでしょう。

最後に

因みに、Port Restricted Cone NATで接続されることで、スイッチを2台同時に接続できると思いますが、所有台数の関係で当方は1台しかスイッチの接続を試しておりません。あしからず。