-
LAN 内のホスト名が急に解決できなくなる問題
-
Windows が IPv6 を優先して名前解決する仕様変更
-
.local を付けるとアクセスできる理由(mDNS)
LAN 内に立てた Web サービス(例:http://myserver:8080)に、
今まではホスト名でアクセスできていたのに、急に名前で繋がらなくなる
という現象が発生しました。
しかし、IP アドレスでは普通にアクセスできます。
結論から言うと、原因は Windows の名前解決方式が IPv4 → IPv6 優先に切り替わったことでした。
■ 症状
-
サーバー側(Ubuntu など)では
http://localhost:8080でアクセスできる -
Windows からは IP アドレスならアクセスできる
-
しかし ホスト名ではアクセスできない
-
ping ホスト名をすると IPv6 アドレスが返ってくる
例:
ping myserver
→ myserver.local [2400:xxxx:xxxx:xxxx]
■ 原因:Windows が名前を IPv6 に解決するようになった
Windows は 2023〜2025 年のアップデートでmDNS(.local)を正式サポートしました。
その結果:
以前
-
Windows は IPv4(NetBIOS / LLMNR)で名前解決
-
サーバーは IPv4 で LISTEN
-
名前でアクセスできた
今
-
Windows が IPv6(mDNS)を優先して名前解決
-
サーバーは IPv6 で LISTEN していない
-
名前ではアクセスできない
-
IP なら繋がる
という状態になります。
これは nginx、Node.js、Flask、Django、CUPS、Samba など
LAN 内に動くあらゆるサービスで起こり得る現象です。
■ 解決方法:.local を付けてアクセスする
Windows は .local を付けると mDNS として正しく扱い、IPv4 を返すようになります。
例:
http://myserver.local:8080/
これで正常にアクセスできます。
■ なぜ .local を付けると IPv4 になるのか
Ubuntu や多くの Linux ディストリビューションは
Avahi(mDNS) でホスト名を配布しています。
mDNS の正式な名前は:
<hostname>.local
Windows は .local を付けた場合のみ mDNS と認識し、
IPv4 を返すことが多いため、結果として接続が成功します。
■ nginx や他のサービスでも同じ現象が起こる
この問題は特定のアプリではなく、
Windows の名前解決方式が IPv6 優先に変わったことが原因です。
そのため、以下のようなサービスでも同じ現象が起こります:
-
nginx
-
Apache
-
Node.js / Express
-
Python / Flask / Django
-
Samba
-
CUPS
-
Docker コンテナ内の Web サービス
-
NAS(自作 / 商用問わず)
つまり、LAN 内で動くサービスなら何でも影響を受けます。
■ まとめ
-
Windows Update により名前解決が IPv6 優先に変わった
-
サーバー側は IPv6 で LISTEN していない
-
結果として名前でアクセスできなくなる
-
.localを付けると IPv4 で解決されるため繋がる
■ 推奨されるアクセス方法
Windows からは:
http://<hostname>.local:ポート番号/
サーバー側からは:
http://localhost:ポート番号/
これが最も安定した方法です。
