ポートチェッカーが「開いている」と言うのに、Minecraftのプレイヤーが入れない理由
TCP接続の成功は、一つのソケットが一か所から受け入れられたことしか証明しません。ログイン、ワールドへの受け入れ、内側から外側への経路は別々のテストです。
誰かがポートチェックを実行し、開いているという言葉を見て、サーバーは解決済みと考える。その結果が実際に意味するのは限定的で、チェッカーの場所から、その瞬間に、そのアドレスとポートへのTCP接続が受け入れられたということだけである。Minecraftのプロトコルのハンドシェイクやアカウント認証、サーバーがプレイヤーをワールドに入れたかどうかについては何も語らない。
これらは四つの異なる層であり、どれか一つでも失敗すればプレイヤーからは「動かなかった」という同じ言葉が出る。
プローブは見えるものしか検査しない
TCP接続は、双方がスリーウェイハンドシェイクを完了したときに成立し、それはゲームが知っている何事よりも下の層にある。プローブが報告するのは、リスナーが存在し、そのネットワーク上の位置から応答したということだ。どんなプロセスでもポートを束縛して接続を受け入れられる以上、リスナーがゲームそのものだとは言えない。
場所は結果と同じくらい重要だ。公開インターネット上のチェッカーは、一つのネットワークから一つの経路を試す。運営者が同じネットワークの内側から実行するチェッカーは、まったく別の経路を試すのであり、そこの肯定的な結果は、遠隔のプレイヤーが何を経験しているかをほとんど語らない。別々のプロバイダーの別々のチェッカーが、あなたのサーバーとは無関係な理由で食い違うことさえある。
タイミングも重要だ。プローブの結果は実行した瞬間を記述しており、動的アドレスの家庭回線や変更された転送ルールは、本当の答えを数分後にずらすことがある。公開アドレス、ポート、アドレスファミリー、時刻を判定と一緒に記録しなければ、その観察は再現できない。同じ回線のスマートフォンからではなく、本当に別のネットワークからチェックを繰り返してほしい。
ソケットとプレイヤーの間にある複数の層
参加するクライアントが実際に行う順序を思い描いてほしい。まずアドレスを解決し、次に公開されたポートへTCP接続を開き、次にゲーム自身のプロトコルで交渉と認証を行い、最後にサーバーがその身元をワールドに入れてよいか決める。各層には固有の失敗の兆候があり、ポートチェッカーに見えるのは最初の層だけだ。
Java Editionの既定ポートは25565だが、運営者は別の外部ポートを公開して内側へ転送できるので、プレイヤーが入力する番号がサーバーの見る番号と同じとは限らない。誤った外部ポートに向けたチェッカーは、サーバーが完全に健全なのに閉じていると報告し、これがこの分野全体で最も多い誤警報だ。
名前はポートの上にもう一段階を加える。プレイヤーがホスト名を入力した場合、解決は公開アドレスを返さなければならず、ネットワーク内のマシンでは代わりにプライベートアドレスを返すことがある。それはファイアウォールの失敗ではなく、どれだけポート転送をしても変わらない。
内側のプレイヤーが別の経路を通る理由
同じLAN上、またはそのLANに到達するVPN上のプレイヤーは、内側から公開アドレスに届こうとする。要求はルーターの外部アドレスへ向かい、ルーターはそれを内側へ戻す翻訳をしなければならない。これが一般にヘアピンNATやNATリフレクションと呼ばれる構成で、往路の翻訳と復路の両方が噛み合う必要があり、多くの家庭用ルーターはそれをまったく実装していない。
だから外からのゲストは参加でき、サーバーの隣に座っている人はできない。外側の経路は本当に問題ない。失敗しているのは内側の回り道であり、プレイヤーの画面からはサーバーの問題のように見える形で失敗するが、翻訳されなかった接続は決してサーバーに届かないので、どちらが起きたかはサーバー自身のログが決める。
正直な修正は二つ、悪い習慣が一つある。良い選択肢は、内側のプレイヤーにプライベートアドレスまたはsplit-DNS名を使わせること、またはその機能があり正しく動作するならルーターでリフレクションを有効にすることだ。悪い習慣は、ポートをさらに開けたりホストのファイアウォールを無効にしたりすることであり、ルーターが一度も行っていない翻訳には影響しない。
NetgateのNATリフレクションのドキュメントは、外側と内側の区別およびsplit-DNSの代替をより詳しく説明している。これを仕組みの説明として読み、特定のVPNプロバイダーやルーターがすべてのループバック方式をサポートするという約束として読まないでほしい。
それぞれの視点から証拠を集める
テストごとに、誰が、どこから、何時に、どのアドレスとポートに対して実行したか、サーバーが何を記録したかを書き留める。サーバーコンソールに明確な理由のあるゲーム側の拒否は、決して到着しなかった接続とは別の所見であり、両者は逆方向に導く。
許可された遠隔のプレイヤーは参加でき、地元のプレイヤー一人だけが入れないなら、残る疑問はローカル経路であり、独自の調査に値する。クライアントがどのアドレスを使ったか、ルーターが翻訳をどう扱ったか、サーバーが接続の試行をそもそも記録したかという三つの事実を、ポートをでたらめに開け直すのではなくネットワークの所有者に渡してほしい。