<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Firewall | yewton.net</title><link>https://www.yewton.net/tags/firewall/</link><atom:link href="https://www.yewton.net/tags/firewall/index.xml" rel="self" type="application/rss+xml"/><description>Firewall</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>ja</language><lastBuildDate>Sat, 22 Aug 2026 00:00:00 +0900</lastBuildDate><image><url>https://www.yewton.net/media/sharing.png</url><title>Firewall</title><link>https://www.yewton.net/tags/firewall/</link></image><item><title>Minecraft Java 版の LAN 接続が Connection timed out する時にやるといいかもしれないこと</title><link>https://www.yewton.net/2026/08/22/minecraft-lan-connection-timed-out/</link><pubDate>Sat, 22 Aug 2026 00:00:00 +0900</pubDate><guid>https://www.yewton.net/2026/08/22/minecraft-lan-connection-timed-out/</guid><description>
&lt;details class="print:hidden xl:hidden" &gt;
&lt;summary&gt;目次&lt;/summary&gt;
&lt;div class="text-sm"&gt;
&lt;nav id="TableOfContents"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#tl-dr"&gt;TL;DR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#背景"&gt;背景&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#なぜ-リストには出るのに繋がらない-のか"&gt;なぜ「リストには出るのに繋がらない」のか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#必要な権限について"&gt;必要な権限について&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#切り分け"&gt;切り分け&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-dot-ping-で経路を確認する"&gt;1. ping で経路を確認する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-dot-nc-で-tcp-の到達性を確認する"&gt;2. nc で TCP の到達性を確認する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-dot-windows-側で待ち受けを確認する"&gt;3. Windows 側で待ち受けを確認する&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#犯人は-勝手に作られていたブロックルール"&gt;犯人は「勝手に作られていたブロックルール」&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#許可ルールが-10-件も溜まっていた"&gt;許可ルールが 10 件も溜まっていた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#バージョンごとにランタイムが違う-というのが決定打だった"&gt;バージョンごとにランタイムが違う、というのが決定打だった&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#なぜ勝手にブロックルールが作られるのか"&gt;なぜ勝手にブロックルールが作られるのか&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ブロックルールは許可ルールより優先される"&gt;ブロックルールは許可ルールより優先される&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#ハマりどころ"&gt;ハマりどころ&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#program-のパスに空白が混入しても-エラーにならない"&gt;&lt;code&gt;-Program&lt;/code&gt; のパスに空白が混入しても、エラーにならない&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#powershell-の行継続文字"&gt;PowerShell の行継続文字&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ポート単位ではなくプログラム単位でルールを作る"&gt;ポート単位ではなくプログラム単位でルールを作る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ランチャー更新でパスが変わる"&gt;ランチャー更新でパスが変わる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#ファイアウォール以外を疑う場合"&gt;ファイアウォール以外を疑う場合&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#参考"&gt;参考&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#終わりに"&gt;終わりに&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;/div&gt;
&lt;/details&gt;
&lt;h2 id="tl-dr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Windows の Minecraft Java 版で LAN に公開したワールドに、別マシンから接続出来ない
( &lt;strong&gt;サーバーリストには表示されるのに&lt;/strong&gt; &lt;code&gt;connection timed out after 30000 ms&lt;/code&gt; になる )場合、
Windows ファイアウォールに &lt;code&gt;javaw.exe&lt;/code&gt; に対する &lt;strong&gt;ブロックルール&lt;/strong&gt; が自動生成されている可能性があります。&lt;/p&gt;
&lt;p&gt;まず確認します ( 標準ユーザーのままで実行出来ます ):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetFirewallApplicationFilter&lt;/span&gt; &lt;span class="n"&gt;-Program&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*javaw.exe&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Get-NetFirewallRule&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Select-Object&lt;/span&gt; &lt;span class="n"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Format-Table&lt;/span&gt; &lt;span class="n"&gt;-AutoSize&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Action&lt;/code&gt; が &lt;code&gt;Block&lt;/code&gt; のルールがあれば、それが原因です。
&lt;strong&gt;ブロックルールは許可ルールより優先される&lt;/strong&gt; ため、後から許可ルールを追加しても効きません。
削除してから許可ルールを追加します ( こちらは &lt;strong&gt;管理者権限が必要&lt;/strong&gt; ):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ブロックルールを削除&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetFirewallApplicationFilter&lt;/span&gt; &lt;span class="n"&gt;-Program&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*javaw.exe&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Get-NetFirewallRule&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Action&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Block&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Remove-NetFirewallRule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 許可ルールを追加&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$p&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Process&lt;/span&gt; &lt;span class="n"&gt;javaw&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;Path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-NetFirewallRule&lt;/span&gt; &lt;span class="n"&gt;-DisplayName&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Minecraft Java LAN (javaw)&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Direction&lt;/span&gt; &lt;span class="n"&gt;Inbound&lt;/span&gt; &lt;span class="n"&gt;-Action&lt;/span&gt; &lt;span class="n"&gt;Allow&lt;/span&gt; &lt;span class="n"&gt;-Protocol&lt;/span&gt; &lt;span class="n"&gt;TCP&lt;/span&gt; &lt;span class="n"&gt;-Program&lt;/span&gt; &lt;span class="nv"&gt;$p&lt;/span&gt; &lt;span class="n"&gt;-Profile&lt;/span&gt; &lt;span class="n"&gt;Private&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;息子が Windows で Minecraft Java 版のワールドを LAN に公開したので、
いつものように私も Linux 機から参加しようとしました。&lt;/p&gt;
&lt;p&gt;ところが最近、Minecraft を最新版に更新したところ、マルチプレイのサーバーリストにはちゃんと表示されるのに、
いざ接続しようとすると &lt;code&gt;connection timed out after 30000 ms&lt;/code&gt; で弾かれてしまうようになりました。&lt;/p&gt;
&lt;p&gt;「Minecraft LAN connection timed out」などで検索すると、
「ファイアウォールが原因かも」というところまでは出てくるのですが、
&lt;strong&gt;ではどうやってそれを確かめるのか、確かめた結果どう直すのか&lt;/strong&gt; が具体的に書かれている情報をぱっと見つけられませんでした。&lt;/p&gt;
&lt;p&gt;普段 Xubuntu か macOS ばかりで Windows 事情にはとんと疎く、
時間と手間がかかりそうで対応に躊躇しており、しばらくは旧バージョンでプレイしてもらって凌いでいましたが、
いい加減対応するかと重い腰を上げて、Claude Opus に相談しながら対応しました。&lt;/p&gt;
&lt;p&gt;なお、後から一次情報を当たったところ、今回の現象は Microsoft Learn の
という記事にほぼそのまま書かれている挙動だったようです…。&lt;/p&gt;
&lt;h2 id="なぜ-リストには出るのに繋がらない-のか"&gt;なぜ「リストには出るのに繋がらない」のか&lt;/h2&gt;
&lt;p&gt;まずここが腑に落ちていませんでした。
「一覧に出ているのだから通信は出来ているはずでは？」と思ってしまいます。&lt;/p&gt;
&lt;p&gt;しかし、この 2 つは &lt;strong&gt;通信の向きが逆&lt;/strong&gt; のようです。&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;サーバーリストへの表示&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;ホスト側から LAN 全体へ、UDP マルチキャスト ( &lt;code&gt;224.0.2.60:4445&lt;/code&gt; ) で「ここで公開してるよ」と 1.5 秒ごとに通知している。ホストから見て &lt;strong&gt;送信&lt;/strong&gt; なので、インバウンドの制限とは無関係。&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;実際の接続&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;参加する側からホストへ TCP で繋ぎにいく。ホストから見て &lt;strong&gt;受信。&lt;/strong&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;マルチプレイヤーの仕組みについては
に記載があります。&lt;/p&gt;
&lt;p&gt;つまり、 &lt;strong&gt;一覧に見えていることと、接続出来ることは別&lt;/strong&gt; ということのようです。&lt;/p&gt;
&lt;p&gt;とはいえ「通知は届いている＝経路自体は生きている」ので、
今度はホスト側で受信が塞がれている可能性を疑う、というように追っていくとよいようです。&lt;/p&gt;
&lt;h2 id="必要な権限について"&gt;必要な権限について&lt;/h2&gt;
&lt;p&gt;「ブロックルールが存在する」という原因の特定までは子どものアカウントのまま到達出来ますが、
ルールの変更時には管理者権限が必要です。&lt;/p&gt;
&lt;p&gt;標準ユーザーで変更操作をしようとすると以下のようになります:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Remove-NetFirewallRule : アクセスが拒否されました。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; + CategoryInfo : PermissionDenied: (MSFT_NetFirewal...ystemName = &amp;#34;&amp;#34;):root/standardcimv2/MSFT_NetFirewallRule) [Remove-NetFirewallRule], CimException
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; + FullyQualifiedErrorId : Windows System Error 5,Remove-NetFirewallRule
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Windows System Error 5&lt;/code&gt; は &lt;code&gt;ERROR_ACCESS_DENIED&lt;/code&gt; のことです
(
)。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;ERROR_ACCESS_DENIED&lt;/p&gt;
&lt;p&gt;5 (0x5)&lt;/p&gt;
&lt;p&gt;Access is denied.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これが出る作業は、管理者が行う必要があります。&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Note&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;今回は息子のアカウントでログインしたまま、PowerShell を「管理者として実行」し、
表示されたダイアログに自分（管理者アカウント）の PIN を入力しました。&lt;/p&gt;
&lt;p&gt;これは UAC ( User Account Control ) の &lt;strong&gt;credential prompt&lt;/strong&gt; と呼ばれる挙動です。
標準ユーザーの既定の昇格方法について、Microsoft Learn の
にはこうあります。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;The default, built-in UAC elevation component for standard users is the credential prompt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;「Admin Approval Mode」ではありません。&lt;/strong&gt; あれは管理者アカウントが consent prompt / credential prompt を
使って自分自身を昇格させる仕組みの呼び名で、標準ユーザーには適用されないそうです。
標準ユーザー側のポリシーの既定値は、
の &lt;code&gt;Behavior of the elevation prompt for standard users&lt;/code&gt; の項にこう明記されています。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Prompt for credentials (default): When an operation requires elevation of privilege, the user is prompted to enter an administrative user name and password. If the user enters valid credentials, the operation continues with the applicable privilege.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;PIN で通るのは Windows Hello が資格情報の入力手段として使えるためで、扱いは同じです。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="切り分け"&gt;切り分け&lt;/h2&gt;
&lt;h3 id="1-dot-ping-で経路を確認する"&gt;1. ping で経路を確認する&lt;/h3&gt;
&lt;p&gt;サーバーリストに表示されている IP アドレス宛に ping を打ちます ( ここでは &lt;code&gt;192.168.1.100&lt;/code&gt; とします )。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ping -c3 192.168.1.100
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 192.168.1.100: icmp_seq=1 ttl=128 time=0.388 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 192.168.1.100: icmp_seq=2 ttl=128 time=0.388 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;64 bytes from 192.168.1.100: icmp_seq=3 ttl=128 time=0.464 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3 packets transmitted, 3 received, 0% packet loss
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通りました。これで、Wi-Fi のプライバシーセパレータ ( AP アイソレーション ) や
VLAN 分離といった &lt;strong&gt;経路側の問題は除外&lt;/strong&gt; 出来るんだそう。&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Note&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;code&gt;ping&lt;/code&gt; コマンド自体は普段からよく使うのですが、
「なぜ ping が通れば経路の問題を除外出来るのか」は改めて聞かれると曖昧だったので、教わった内容を残しておきます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ping&lt;/code&gt; が使う ICMP は、TCP や UDP と同じく IP データグラムに載せて運ばれるプロトコルです。
RFC 792 にはこうあります。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;ICMP messages are sent using the basic IP header. The first octet of the data portion of the datagram is a ICMP type field; the value of this field determines the format of the remaining data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(
)&lt;/p&gt;
&lt;p&gt;つまり ICMP も TCP も、同じ IP の上に乗っているだけの兄弟プロトコルです。
AP アイソレーションや VLAN 分離のような経路レベルの分離は、一般的には IP より下のレイヤーで経路そのものを分けるものなので、
プロトコルを問わず ICMP も TCP も一緒に落ちるはず、というのが一般的な理解のようです
( 実装は製品によって異なり、手元の機材向けの一次資料は見つけられませんでした )。
逆に ICMP ( ping ) が通ったなら、少なくともこのレベルでは経路が分離されていないと判断出来ます。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="2-dot-nc-で-tcp-の到達性を確認する"&gt;2. nc で TCP の到達性を確認する&lt;/h3&gt;
&lt;p&gt;次に、公開されているポート宛に TCP で繋いでみます。
ポート番号は、ワールドを LAN に公開した際に表示されるものを使います。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nc -w &lt;span class="m"&gt;5&lt;/span&gt; -vz 192.168.1.100 &lt;span class="m"&gt;54321&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nc: connect to 192.168.1.100 port 54321 (tcp) failed: Connection timed out
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで返ってくるエラーの種類が重要らしい。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;結果&lt;/th&gt;
&lt;th&gt;意味&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;succeeded&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ネットワークは問題なし。ゲーム側の別要因を疑う&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Connection refused&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RST が返っている。そのポートで待ち受けていない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Connection timed out&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;応答が一切ない。 &lt;strong&gt;パケットが破棄されている&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;今回は &lt;code&gt;timed out&lt;/code&gt; でした。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;connect(2)&lt;/code&gt; のエラーとしては、こう定義されているらしいです
(
)。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;ECONNREFUSED
A connect() on a stream socket found no one listening on the remote address.&lt;/p&gt;
&lt;p&gt;ETIMEDOUT
Timeout while attempting connection. The server may be too busy to accept new connections.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Windows ファイアウォールのインバウンドの既定動作は &lt;strong&gt;ブロック&lt;/strong&gt; であり、
ブロックされたパケットは拒否応答を返すのではなく &lt;strong&gt;破棄 ( drop ) されます。&lt;/strong&gt;
これは &lt;code&gt;New-NetFirewallRule&lt;/code&gt; の &lt;code&gt;-Action&lt;/code&gt; パラメータの説明にも明記されています
(
)。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Block: Network packets that match all criteria specified in this rule are dropped by the firewall.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;なので &lt;code&gt;refused&lt;/code&gt; ではなく &lt;code&gt;timed out&lt;/code&gt; になる、というのが今回の症状と一致します。&lt;/p&gt;
&lt;p&gt;なお &lt;code&gt;-w 5&lt;/code&gt; を付けずに実行すると &lt;strong&gt;2 分以上&lt;/strong&gt; 待たされました。&lt;/p&gt;
&lt;p&gt;これは Linux カーネルの SYN 再送 ( &lt;code&gt;tcp_syn_retries&lt;/code&gt; ) を打ち切るまでの時間のようです。
既定値は 6 回で、カーネルのドキュメントにはこうあります
(
)。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;tcp_syn_retries - INTEGER&lt;/p&gt;
&lt;p&gt;Number of times initial SYNs for an active TCP connection attempt will be retransmitted.
Should not be higher than 127. Default value is 6, which corresponds to 67 seconds
(with tcp_syn_linear_timeouts = 4) till the last retransmission with the current initial
RTO of 1 second. With this the final timeout for an active TCP connection attempt will
happen after 131 seconds.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;指数バックオフで SYN を打ち直しつつ、最終的に約 131 秒 ( 2 分強 )で諦める、という計算のようです。
&lt;code&gt;-w 5&lt;/code&gt; が無いと &lt;strong&gt;2 分以上&lt;/strong&gt; 待たされたのは、これに一致します。&lt;/p&gt;
&lt;h3 id="3-dot-windows-側で待ち受けを確認する"&gt;3. Windows 側で待ち受けを確認する&lt;/h3&gt;
&lt;p&gt;ここまでで「Windows のホスト上で受信が塞がれている」ところまで絞れたので、Windows 側に移ります。
以降のコマンドはすべて、削除・作成の 2 つを除いて標準ユーザーのまま実行出来ます。&lt;/p&gt;
&lt;p&gt;まずゲームがちゃんと待ち受けているかを、ループバック経由で確認します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Test-NetConnection&lt;/span&gt; &lt;span class="n"&gt;-ComputerName&lt;/span&gt; &lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt; &lt;span class="n"&gt;-Port&lt;/span&gt; &lt;span class="mf"&gt;54321&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ComputerName : 127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RemoteAddress : 127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RemotePort : 54321
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;InterfaceAlias : Loopback Pseudo-Interface 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SourceAddress : 127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TcpTestSucceeded : True
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Test-NetConnection&lt;/code&gt; は ping ・ TCP ポート疎通・経路トレースをまとめて実施してくれるやーつらしいです
(
)。
&lt;code&gt;TcpTestSucceeded : True&lt;/code&gt; なら、ゲームは正常に待ち受けています。
&lt;code&gt;False&lt;/code&gt; なら、そもそも公開されていないか、ポート番号が違います。&lt;/p&gt;
&lt;p&gt;併せて、待ち受けアドレスと &lt;code&gt;javaw.exe&lt;/code&gt; の実パスも確認しておきます。
このパスは後で使います。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Process&lt;/span&gt; &lt;span class="n"&gt;javaw&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;Path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\Users\&amp;lt;user&amp;gt;\AppData\Local\Packages\Microsoft.4297127D64EC6_8wekyb3d8bbwe\LocalCache\Local\runtime\java-runtime-epsilon\windows-x64\java-runtime-epsilon\bin\javaw.exe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-orange-100 dark:bg-orange-900 border-orange-500"
data-callout="warning"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-orange-600 dark:text-orange-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0zM12 15.75h.007v.008H12z"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Warning&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;ここで &lt;code&gt;Get-Process javaw | Select-Object Id, Path&lt;/code&gt; と書くと、パスが途中で省略されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Id Path
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -- ----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;15056 C:\Users\&amp;lt;user&amp;gt;\AppData\Local\Packages\Microsoft.4297127D64EC6_8wekyb3d8bbwe\LocalCache\Local\runt...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Format-Table&lt;/code&gt; は表示幅に収まらない分を切り詰めるためです
(
)。
&lt;code&gt;-AutoSize&lt;/code&gt; や &lt;code&gt;-Wrap&lt;/code&gt; を付ける手もありますが、
今回のように &lt;strong&gt;値がひとつ欲しいだけなら、そもそも表にしない&lt;/strong&gt; のが確実です。
&lt;code&gt;(Get-Process javaw).Path&lt;/code&gt; は文字列そのものを返すので、幅の制限を受けません。&lt;/p&gt;
&lt;p&gt;ウィンドウを広げて対処することも出来ますが、後述するようにこのパスはルール作成にそのまま使うので、
変数に入れて扱うほうが安全です。&lt;/p&gt;
&lt;p&gt;エージェントは気を効かせてしれっとテーブル出力にしてきたりするので要注意。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;待ち受けアドレスも見ておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetTCPConnection&lt;/span&gt; &lt;span class="n"&gt;-LocalPort&lt;/span&gt; &lt;span class="mf"&gt;54321&lt;/span&gt; &lt;span class="n"&gt;-State&lt;/span&gt; &lt;span class="n"&gt;Listen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LocalAddress LocalPort RemoteAddress RemotePort State
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------ --------- ------------- ---------- -----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:: 54321 :: 0 Listen
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Get-NetTCPConnection&lt;/code&gt; は現在の TCP コネクションをローカル/リモートアドレスや状態付きで一覧してくれます
(
)。
&lt;code&gt;LocalAddress&lt;/code&gt; が &lt;code&gt;0.0.0.0&lt;/code&gt; または &lt;code&gt;::&lt;/code&gt; なら全インターフェイスで待ち受けているので正常です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;::&lt;/code&gt; ( IPv6 のワイルドカード )しか出てこないので、 Claude は IPv4 で待ち受けていない可能性を疑ったらしく、
色々と説明を補強してくれました。&lt;/p&gt;
&lt;p&gt;直前の &lt;code&gt;Test-NetConnection 127.0.0.1&lt;/code&gt; は IPv4 で成功しているし、最終的に Linux 側から IPv4 アドレスで接続出来ているので、
少なくとも今回の事象の原因ではないだろう、という判断になったようです。&lt;/p&gt;
&lt;p&gt;そして、これは &lt;strong&gt;デュアルスタックソケット&lt;/strong&gt; の挙動、という結論になりました。
Winsock のドキュメントにはこうあります
(
)。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;By default, an IPv6 socket created on Windows Vista and later only operates over the IPv6 protocol. In order to make an IPv6 socket into a dual-stack socket, the setsockopt function must be called with the IPV6_V6ONLY socket option to set this value to zero before the socket is bound to an IP address. When the IPV6_V6ONLY socket option is set to zero, a socket created for the AF_INET6 address family can be used to send and receive packets to and from an IPv6 address or an IPv4 mapped address.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;つまり &lt;code&gt;::&lt;/code&gt; にバインドされたソケットが IPv4 も受け付けるかどうかは、
ソケット側が &lt;code&gt;IPV6_V6ONLY&lt;/code&gt; を明示的に無効化しているかどうか次第で、Windows の既定は IPv6 専用だそうです。
今回のゲームサーバーは IPv4 からの接続を実際に受け付けているので、
Java 側でデュアルスタックとして待ち受けている、ということのようです。
なので &lt;code&gt;::&lt;/code&gt; だけが表示されていても、IPv4 で繋がらない理由にはなりません。&lt;/p&gt;
&lt;h2 id="犯人は-勝手に作られていたブロックルール"&gt;犯人は「勝手に作られていたブロックルール」&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;javaw.exe&lt;/code&gt; で有効になっているファイアウォールルールの一覧を確認します:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetFirewallApplicationFilter&lt;/span&gt; &lt;span class="n"&gt;-Program&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*javaw.exe&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Get-NetFirewallRule&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Select-Object&lt;/span&gt; &lt;span class="n"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Format-Table&lt;/span&gt; &lt;span class="n"&gt;-AutoSize&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DisplayName Direction Action Profile Enabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;----------- --------- ------ ------- -------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Block Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Action&lt;/code&gt; が &lt;code&gt;Block&lt;/code&gt; のルールが存在していました。犯人はこれです。&lt;/p&gt;
&lt;p&gt;なおこのワンライナーは、ルールそのものではなく &lt;strong&gt;フィルタオブジェクト&lt;/strong&gt; を経由しているのがポイントだそうで、
Windows ファイアウォールでは、ルールの &lt;code&gt;Program&lt;/code&gt; や &lt;code&gt;Package&lt;/code&gt; といった条件は
&lt;code&gt;NetFirewallApplicationFilter&lt;/code&gt; という別オブジェクトとして保持されており、
これらの条件でルールを検索するにはフィルタオブジェクト側から辿る必要があるんだそう
(
)。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Get-NetFirewallRule&lt;/code&gt; に「このプログラムのルールを出して」と直接聞けないのは、そういう構造だからでした。&lt;/p&gt;
&lt;p&gt;PowerShell 難しい!&lt;/p&gt;
&lt;h3 id="許可ルールが-10-件も溜まっていた"&gt;許可ルールが 10 件も溜まっていた&lt;/h3&gt;
&lt;p&gt;もうひとつ気になったのが、 &lt;code&gt;Allow&lt;/code&gt; のルールがやたら多いことです。
表示名はどれも &lt;code&gt;javaw.exe&lt;/code&gt; で区別が付きませんが、
ルールごとの &lt;code&gt;Program&lt;/code&gt; を並べてみると理由が分かります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetFirewallApplicationFilter&lt;/span&gt; &lt;span class="n"&gt;-Program&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*javaw.exe&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Get-NetFirewallRule&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;ForEach-Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;PSCustomObject&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="vm"&gt;@&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Action&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Action&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Protocol&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Get-NetFirewallPortFilter&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;Protocol&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Get-NetFirewallApplicationFilter&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;Program&lt;/span&gt; &lt;span class="n"&gt;-split&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\\&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mf"&gt;-3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Sort-Object&lt;/span&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Protocol&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Format-Table&lt;/span&gt; &lt;span class="n"&gt;-AutoSize&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;手元では &lt;code&gt;jre-legacy&lt;/code&gt; 、 &lt;code&gt;java-runtime-alpha&lt;/code&gt; 、 &lt;code&gt;beta&lt;/code&gt; 、 &lt;code&gt;gamma&lt;/code&gt; 、 &lt;code&gt;delta&lt;/code&gt; の
5 世代分のパスに対して、それぞれ 2 件ずつルールが存在していました
( 最新の &lt;code&gt;epsilon&lt;/code&gt; はここには含まれません。ブロックルール側だからです )。&lt;/p&gt;
&lt;p&gt;この「2 件ずつ」は、後述する Microsoft Learn の記述
&lt;strong&gt;「通常は TCP と UDP に 1 つずつ、計 2 つ作られる」&lt;/strong&gt; とも符合します。&lt;/p&gt;
&lt;p&gt;ドキュメントで読んだときはピンと来ませんでしたが、こうして並ぶと納得します。&lt;/p&gt;
&lt;h3 id="バージョンごとにランタイムが違う-というのが決定打だった"&gt;バージョンごとにランタイムが違う、というのが決定打だった&lt;/h3&gt;
&lt;p&gt;そして、この一覧から解決したことがもうひとつありました。&lt;/p&gt;
&lt;p&gt;冒頭の &lt;strong&gt;昔のバージョンなら繋がっていた&lt;/strong&gt; ことについて、ランチャーの仕組みで説明が付きます。&lt;/p&gt;
&lt;p&gt;Minecraft ランチャーは、起動するバージョンに必要な JRE を自動でダウンロードし、世代ごとに別ディレクトリで管理します
(
)。
対応はおおよそ以下の通りです。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ランタイム&lt;/th&gt;
&lt;th&gt;Java&lt;/th&gt;
&lt;th&gt;対象バージョン&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jre-legacy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;〜1.16.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;java-runtime-alpha&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;1.17 系&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;java-runtime-beta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;1.18 初期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;java-runtime-gamma&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;1.18.2 〜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;java-runtime-delta&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;1.20.5 〜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;java-runtime-epsilon&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;最新系&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Java と Minecraft バージョンの対応は Wiki のリリースノートから追えますが、
ランタイムのディレクトリ名 ( &lt;code&gt;jre-legacy&lt;/code&gt; や &lt;code&gt;java-runtime-alpha&lt;/code&gt; など )と Java バージョンの対応は
Mojang 公式ドキュメントには見当たらず、有志のランチャープロジェクトのドキュメントで確認しました
(
)。&lt;/p&gt;
&lt;p&gt;つまり、こういうことのようです:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;昔の起動構成 → &lt;code&gt;jre-legacy&lt;/code&gt; 〜 &lt;code&gt;delta&lt;/code&gt; のいずれかを使う → &lt;strong&gt;許可ルールがある&lt;/strong&gt; → 繋がる&lt;/li&gt;
&lt;li&gt;最新の起動構成 → &lt;code&gt;epsilon&lt;/code&gt; を使う → &lt;strong&gt;ブロックルールがある&lt;/strong&gt; → 繋がらない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ファイアウォールのルールは完全パス一致なので、ランタイムが違えば完全に別のプログラム扱いです。
「バージョンによって繋がったり繋がらなかったりする」という一見不可解な症状は、
実は &lt;strong&gt;ファイアウォールルールがプログラム単位である&lt;/strong&gt; ことの、分かりやすい証拠だったわけです。&lt;/p&gt;
&lt;p&gt;同じ症状に遭遇したら、 &lt;strong&gt;古いバージョンの起動構成で試してみる&lt;/strong&gt; のは良い切り分けになりそうです。
それで繋がるなら、ネットワーク経路ではなくプログラム単位の制限を疑うべき、と判断出来ます。&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Note&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;細かい話ですが、自動生成されたらしいルールのパスはすべて小文字に正規化されていて、
今回自分で &lt;code&gt;New-NetFirewallRule&lt;/code&gt; で作ったルールだけが、指定した通りの大文字混じりで残っていました。&lt;/p&gt;
&lt;p&gt;Windows のパス照合は大文字小文字を区別しないので実害はありませんが、
自動生成されたものか手で作ったものかの見分けを付けるいち手段として使えるかも。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="なぜ勝手にブロックルールが作られるのか"&gt;なぜ勝手にブロックルールが作られるのか&lt;/h3&gt;
&lt;p&gt;むしろ何故今まで問題なく動いていたかの方が謎なのですが…ブロックルールの挙動については Microsoft Learn の
という記事に明記されていました。&lt;/p&gt;
&lt;p&gt;アプリが初めてネットワークで待ち受けようとしたとき、対応する許可ルールが存在しないと、
「このアプリの機能のいくつかが Windows Defender ファイアウォールでブロックされています」
というダイアログが表示されるらしく、原文にはこうあります。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;If there&amp;rsquo;s no active application or administrator-defined allow rule(s), a dialog box prompts the user to either allow or block an application&amp;rsquo;s packets the first time the app is launched or tries to communicate in the network:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the user has admin permissions, they&amp;rsquo;re prompted. If they respond No or cancel the prompt, block rules are created. Two rules are typically created, one each for TCP and UDP traffic.&lt;/li&gt;
&lt;li&gt;If the user isn&amp;rsquo;t a local admin and they are prompted, block rules are created. It doesn&amp;rsquo;t matter what option is selected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In either of these scenarios, once the rules are added, they must be deleted to generate the prompt again. If not, the traffic continues to be blocked.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;つまり:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;管理者権限のあるユーザーが &lt;strong&gt;「いいえ」を選ぶかプロンプトをキャンセルすると、ブロックルールが作成される。&lt;/strong&gt; 通常は TCP と UDP に 1 つずつ、計 2 つ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ローカル管理者でないユーザーの場合は、どの選択肢を選んでもブロックルールが作成される&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;いずれの場合も、 &lt;strong&gt;作成されたルールを削除しない限り再びプロンプトは表示されず、通信はブロックされ続ける&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;息子のアカウントは標準ユーザーなので、これに従うなら 2 番目のケースにあたります。
つまり息子がダイアログで &lt;strong&gt;何を押していても、ブロックルールが作られていた&lt;/strong&gt; ことになります。
「よく分からずキャンセルしてしまった」のではなく、そもそも選択の余地が無かったわけです。&lt;/p&gt;
&lt;p&gt;これは知らないと理不尽に感じますが、
「標準ユーザーが勝手にファイアウォールに穴を開けられては困る」と考えれば、妥当な設計ではあります。&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-orange-100 dark:bg-orange-900 border-orange-500"
data-callout="warning"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-orange-600 dark:text-orange-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0zM12 15.75h.007v.008H12z"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Warning&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;前述の通り、今まで問題無かった理由は不明です。&lt;/p&gt;
&lt;p&gt;標準ユーザーの操作からはブロックルールしか生成されないはずなのに、
&lt;code&gt;jre-legacy&lt;/code&gt; 〜 &lt;code&gt;delta&lt;/code&gt; の 10 件は &lt;strong&gt;すべて許可ルール&lt;/strong&gt; です。
しかもパスの構造は、前述の &lt;code&gt;(Get-Process javaw).Path&lt;/code&gt; で見えた
&lt;code&gt;C:\Users\&amp;lt;user&amp;gt;\AppData\Local\Packages\...\runtime\&amp;lt;ランタイム名&amp;gt;\...\javaw.exe&lt;/code&gt; と同じで、
息子のユーザーディレクトリ配下と考えられます
( ファイアウォールの &lt;code&gt;Profile&lt;/code&gt; 列＝ Private/Public/Domain の話ではなく、
Windows のユーザーディレクトリの話です )。&lt;/p&gt;
&lt;p&gt;これらがどういう経緯で作られたのかは謎のままです。&lt;/p&gt;
&lt;p&gt;ルールの作成は、作成者の SID 付きでイベントログに記録されるらしく
( ログ名 &lt;code&gt;Microsoft-Windows-Windows Firewall With Advanced Security/Firewall&lt;/code&gt; )、
ルール追加のイベント ID は環境により &lt;code&gt;2004&lt;/code&gt; または &lt;code&gt;2097&lt;/code&gt; らしいです
(
)。&lt;/p&gt;
&lt;p&gt;これを元に確認してみました。&lt;/p&gt;
&lt;p&gt;ログ自体は有効で 1000 件以上残っていましたが、
&lt;code&gt;javaw.exe&lt;/code&gt; 関連のイベントを &lt;code&gt;Where-Object&lt;/code&gt; で絞り込むと出てきたのは &lt;strong&gt;今回の作業で自分が作ったルールの分だけ&lt;/strong&gt; で、
&lt;code&gt;jre-legacy&lt;/code&gt; 〜 &lt;code&gt;delta&lt;/code&gt; の作成当時のものはすでにローテーションで消えていました。
残念。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="ブロックルールは許可ルールより優先される"&gt;ブロックルールは許可ルールより優先される&lt;/h3&gt;
&lt;p&gt;要注意なのは、「許可されてないなら許可すればいいだろう」と後から許可ルールを足しても効かない、という点です。&lt;/p&gt;
&lt;p&gt;前述の &lt;code&gt;Windows Firewall Rules&lt;/code&gt; には、「Rule precedence for inbound and outbound rules」という
セクションがあり、そこにルールの優先順位が明記されています:&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;ol&gt;
&lt;li&gt;Explicitly defined allow rules take precedence over the default block setting.&lt;/li&gt;
&lt;li&gt;Explicit block rules take precedence over any conflicting allow rules.&lt;/li&gt;
&lt;li&gt;More specific rules take precedence over less specific rules, except if there are explicit block rules as mentioned in 2. For example, if the parameters of rule 1 include an IP address range, while the parameters of rule 2 include a single IP host address, rule 2 takes precedence.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;日本語にするとこうです:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;明示的に定義された許可ルールは、既定のブロック設定より優先される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;明示的なブロックルールは、競合する許可ルールより優先される&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;より限定的なルールがより広範なルールより優先される ( ただし 2 のブロックルールがある場合を除く )&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;また、同じセクションにはこうも書かれています。&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Windows Firewall doesn&amp;rsquo;t support weighted, administrator-assigned rule ordering.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Windows ファイアウォールには管理者が重み付けで順序を指定する仕組みは無い、ということです。
順番を工夫して回避することは出来ないわけです。&lt;/p&gt;
&lt;p&gt;なので、先にブロックルールを削除する必要があります。
&lt;strong&gt;ここから管理者権限が必要&lt;/strong&gt; です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetFirewallApplicationFilter&lt;/span&gt; &lt;span class="n"&gt;-Program&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*javaw.exe&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Get-NetFirewallRule&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Where-Object&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;Action&lt;/span&gt; &lt;span class="o"&gt;-eq&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Block&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Remove-NetFirewallRule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;その上で許可ルールを追加します
(
)。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$p&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Process&lt;/span&gt; &lt;span class="n"&gt;javaw&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="py"&gt;Path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$p&lt;/span&gt; &lt;span class="c"&gt;# 出力を目視確認 ( 複数出たら Minecraft のものを選ぶ。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c"&gt;# 配列なら $p = $p[0] のようにインデックスで絞るか、表示された文字列をそのまま $p = &amp;#34;...&amp;#34; と入れ直す )&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-NetFirewallRule&lt;/span&gt; &lt;span class="n"&gt;-DisplayName&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Minecraft Java LAN (javaw)&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;-Direction&lt;/span&gt; &lt;span class="n"&gt;Inbound&lt;/span&gt; &lt;span class="n"&gt;-Action&lt;/span&gt; &lt;span class="n"&gt;Allow&lt;/span&gt; &lt;span class="n"&gt;-Protocol&lt;/span&gt; &lt;span class="n"&gt;TCP&lt;/span&gt; &lt;span class="n"&gt;-Program&lt;/span&gt; &lt;span class="nv"&gt;$p&lt;/span&gt; &lt;span class="n"&gt;-Profile&lt;/span&gt; &lt;span class="n"&gt;Private&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Note&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;&lt;code&gt;-Profile&lt;/code&gt; には &lt;code&gt;Any&lt;/code&gt; も指定出来ますが、それだと Domain / Private / Public のすべてで許可することになります。
&lt;code&gt;Public&lt;/code&gt; はカフェや駅など &lt;strong&gt;信頼できないネットワーク&lt;/strong&gt; の分類で、
Minecraft の LAN ワールドにはホワイトリストの仕組みが無いので、
そこでも &lt;code&gt;javaw.exe&lt;/code&gt; への着信を許可してしまうのは過剰です。&lt;/p&gt;
&lt;p&gt;Windows が自動生成する既存のルールも、前述の一覧の通りすべて &lt;code&gt;Profile: Private&lt;/code&gt; だったので、それに粒度を合わせました。&lt;/p&gt;
&lt;p&gt;ただし &lt;code&gt;-Profile Private&lt;/code&gt; が効くのは、自宅のネットワークが実際に Private に分類されている場合だけです。
念のため確認しておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetConnectionProfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Name : Network
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;InterfaceAlias : イーサネット
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;InterfaceIndex : 18
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NetworkCategory : Private
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DomainAuthenticationKind : None
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IPv4Connectivity : Internet
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IPv6Connectivity : Internet
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;NetworkCategory : Private&lt;/code&gt; になっていました。 &lt;code&gt;Public&lt;/code&gt; のままだと、この許可ルールは効きません。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;これで Linux 側から無事に接続出来ました! 🎉&lt;/p&gt;
&lt;p&gt;作成後は、実際に登録された状態も確認しておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetFirewallApplicationFilter&lt;/span&gt; &lt;span class="n"&gt;-Program&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*javaw.exe&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Get-NetFirewallRule&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Select-Object&lt;/span&gt; &lt;span class="n"&gt;DisplayName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Direction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Enabled&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Format-Table&lt;/span&gt; &lt;span class="n"&gt;-AutoSize&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DisplayName Direction Action Profile Enabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;----------- --------- ------ ------- -------
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Minecraft Java LAN (javaw) Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javaw.exe Inbound Allow Private True
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Block&lt;/code&gt; の行が消え、追加した &lt;code&gt;Minecraft Java LAN (javaw)&lt;/code&gt; が
&lt;code&gt;Inbound&lt;/code&gt; / &lt;code&gt;Allow&lt;/code&gt; / &lt;code&gt;Private&lt;/code&gt; / &lt;code&gt;True&lt;/code&gt; で登録されているのが分かります。&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Note&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;今回見つかったブロックルールは 1 件だけでした。
前述の引用にある「通常は TCP と UDP に 1 つずつ」に照らすと 1 件少ないので、状況によって変わるようです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Action -eq 'Block'&lt;/code&gt; で引っかかったものをまとめて消す今回のやり方なら、件数によらず対処出来ます。&lt;/p&gt;
&lt;p&gt;許可ルールの方は、Minecraft Java 版のゲーム接続が TCP なので今回は TCP だけで足りました。&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;なお、ファイアウォールルールはマシン全体に適用されるので、
このルールは息子のアカウントでも私のアカウントでも有効です。
ただしルールが指しているのは &lt;strong&gt;息子のユーザーディレクトリ配下の &lt;code&gt;javaw.exe&lt;/code&gt;&lt;/strong&gt; なので、
私が自分のアカウントで Minecraft を起動する場合は JRE のパスが変わり、別途ルールが必要になります。&lt;/p&gt;
&lt;h2 id="ハマりどころ"&gt;ハマりどころ&lt;/h2&gt;
&lt;h3 id="program-のパスに空白が混入しても-エラーにならない"&gt;&lt;code&gt;-Program&lt;/code&gt; のパスに空白が混入しても、エラーにならない&lt;/h3&gt;
&lt;p&gt;最初、パスを手でコピペした際に先頭に半角スペースが紛れ込んでいました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-Program &amp;#34; C:\Users\...\javaw.exe&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↑ これ
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;アプリケーションルールでは &lt;strong&gt;ワイルドカードが使用出来ず、完全パスでのみルールを作成出来ます。&lt;/strong&gt;
つまり文字列としての厳密一致なので、先頭にスペースがあると実体と一致せず、
&lt;strong&gt;そのルールは永久に発火しません。&lt;/strong&gt;
しかもルールの作成自体はエラーにならず、一見成功したように見えます。&lt;/p&gt;
&lt;p&gt;作成後は次のコマンドで、登録された値を目視確認しておくと安全です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-NetFirewallRule&lt;/span&gt; &lt;span class="n"&gt;-DisplayName&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Minecraft Java LAN (javaw)&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;Get-NetFirewallApplicationFilter&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Select-Object&lt;/span&gt; &lt;span class="n"&gt;-ExpandProperty&lt;/span&gt; &lt;span class="n"&gt;Program&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;前述のように &lt;code&gt;$p&lt;/code&gt; 経由で渡してしまうのが確実です。&lt;/p&gt;
&lt;h3 id="powershell-の行継続文字"&gt;PowerShell の行継続文字&lt;/h3&gt;
&lt;p&gt;これも Windows に不慣れゆえに引っかかった点です。
Web で見かける PowerShell のコマンドは、しばしばバッククォートで改行されています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;New-NetFirewallRule&lt;/span&gt; &lt;span class="n"&gt;-DisplayName&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Minecraft Java LAN (javaw)&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-Direction&lt;/span&gt; &lt;span class="n"&gt;Inbound&lt;/span&gt; &lt;span class="n"&gt;-Action&lt;/span&gt; &lt;span class="n"&gt;Allow&lt;/span&gt; &lt;span class="n"&gt;-Protocol&lt;/span&gt; &lt;span class="n"&gt;TCP&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;-Program&lt;/span&gt; &lt;span class="nv"&gt;$p&lt;/span&gt; &lt;span class="n"&gt;-Profile&lt;/span&gt; &lt;span class="n"&gt;Private&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このバッククォートは行継続文字で、見やすさのために複数行に分けた結果として必要になっているだけです。
1 行にまとめるなら不要です。&lt;/p&gt;
&lt;p&gt;そして &lt;strong&gt;バッククォートの直後に空白があると効きません。&lt;/strong&gt;
行の一番最後の文字でないと駄目なので、コピペで末尾に空白が紛れ込むと壊れます。
1 行にしてしまうほうが事故が少ないと思います。&lt;/p&gt;
&lt;h3 id="ポート単位ではなくプログラム単位でルールを作る"&gt;ポート単位ではなくプログラム単位でルールを作る&lt;/h3&gt;
&lt;p&gt;LAN 公開のポート番号は公開するたびに変わります。
そのため、ポート番号を指定したルールを作ると、次回にはもう役に立ちません。
&lt;code&gt;-Program&lt;/code&gt; でプログラム単位のルールにしておけば、ポートが変わっても効き続けます。&lt;/p&gt;
&lt;h3 id="ランチャー更新でパスが変わる"&gt;ランチャー更新でパスが変わる&lt;/h3&gt;
&lt;p&gt;今回の &lt;code&gt;javaw.exe&lt;/code&gt; のパスは、Microsoft Store 版ランチャー同梱の JRE でした:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\Users\&amp;lt;user&amp;gt;\AppData\Local\Packages\Microsoft.4297127D64EC6_8wekyb3d8bbwe\LocalCache\Local\runtime\java-runtime-epsilon\windows-x64\java-runtime-epsilon\bin\javaw.exe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;前述の通り、 &lt;code&gt;java-runtime-epsilon&lt;/code&gt; の部分は Minecraft のバージョンによって変わります。
アプリケーションルールではワイルドカードが使えないので、
ランチャーが新しい JRE を使うようになると、以前作ったルールのパスが実体とずれて同じ症状が再発します。&lt;/p&gt;
&lt;p&gt;許可ルールが 10 件も溜まっていたのは、これが世代ごとに繰り返された結果です。
再発したときは &lt;code&gt;(Get-Process javaw).Path&lt;/code&gt; で新しいパスを取り直して作り直せば大丈夫です。&lt;/p&gt;
&lt;h3 id="ファイアウォール以外を疑う場合"&gt;ファイアウォール以外を疑う場合&lt;/h3&gt;
&lt;p&gt;手順 3 まで確認してもファイアウォールが原因でなさそうなら、以下も候補になるらしいです
( 今回は実際に踏み込んで調べたわけではなく、聞きかじった話です ) 。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;サードパーティのセキュリティソフト ( ESET / Norton / Avast 等 ) の独自ファイアウォール。Windows ファイアウォールを切っても効き続けるとか&lt;/li&gt;
&lt;li&gt;Hyper-V や WSL の &lt;code&gt;vEthernet&lt;/code&gt; 側のサブネットが混ざっている、とか&lt;/li&gt;
&lt;li&gt;有線と無線で VLAN が分かれている、とか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;切り分けの補助としては、 &lt;strong&gt;逆向き&lt;/strong&gt; ( Linux 側で LAN 公開してホスト側から接続 )を試すのも有効らしいです。
逆向きが通るなら経路は健全で、Windows のインバウンドが原因だと確定出来る、とのことでした。&lt;/p&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
— ルールの優先順位、プロンプト時のブロックルール自動生成、ワイルドカード非対応について&lt;/li&gt;
&lt;li&gt;
— 標準ユーザーの credential prompt と、管理者の Admin Approval Mode の違いについて&lt;/li&gt;
&lt;li&gt;
— &lt;code&gt;Behavior of the elevation prompt for standard users&lt;/code&gt; の既定値について&lt;/li&gt;
&lt;li&gt;
— ICMP が IP データグラムに載って運ばれることについて&lt;/li&gt;
&lt;li&gt;
— &lt;code&gt;Windows System Error 5&lt;/code&gt; ( &lt;code&gt;ERROR_ACCESS_DENIED&lt;/code&gt; )について&lt;/li&gt;
&lt;li&gt;
— &lt;code&gt;ECONNREFUSED&lt;/code&gt; / &lt;code&gt;ETIMEDOUT&lt;/code&gt; の定義について&lt;/li&gt;
&lt;li&gt;
— &lt;code&gt;tcp_syn_retries&lt;/code&gt; の既定値とタイムアウト時間について&lt;/li&gt;
&lt;li&gt;
— &lt;code&gt;::&lt;/code&gt; へのバインドと IPv4 待ち受けの関係について&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
— 出力が省略される件と &lt;code&gt;-AutoSize&lt;/code&gt; / &lt;code&gt;-Wrap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
— ルール追加イベントの記録項目 ( 作成者 SID など ) について&lt;/li&gt;
&lt;li&gt;
— LAN 公開時のマルチキャスト告知について&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
— バージョンごとの Java / ランタイムの対応について&lt;/li&gt;
&lt;li&gt;
— ランタイムのディレクトリ名と Java バージョンの対応について ( 有志プロジェクトのドキュメント )&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="終わりに"&gt;終わりに&lt;/h2&gt;
&lt;p&gt;検索で出てくる情報は「ファイアウォールが原因かもしれない」で止まっていることが多く、
そこから先の &lt;strong&gt;どのコマンドで何を確認して、何が分かったら何をするのか&lt;/strong&gt; が繋がっていませんでした。&lt;/p&gt;
&lt;p&gt;今回 Claude Opus に相談して助かったのは、
「一覧に出るのは送信方向のマルチキャストだから、インバウンドの制限とは別の話」
という説明で症状の意味が腑に落ちたことと、
&lt;code&gt;timed out&lt;/code&gt; と &lt;code&gt;refused&lt;/code&gt; の違いから何が言えるかを踏まえた手順を出してくれたことでした。&lt;/p&gt;
&lt;p&gt;そして記事を書くにあたって一次情報を確認したところ、
「標準ユーザーの場合は何を押してもブロックルールが作られる」も
「ブロックルールが許可ルールより優先される」も、Microsoft Learn に明記されている仕様でした。
知らない領域だと、そもそも &lt;strong&gt;何を調べればその答えに辿り着くのか&lt;/strong&gt; が分からないものだな、と改めて思います。&lt;/p&gt;
&lt;p&gt;同じところで詰まっている親御さんの助けになれば幸いです。&lt;/p&gt;</description></item></channel></rss>