markdown

はじめに (対象読者・この記事でわかること)

この記事は、UbuntuとWindowsが混在するLAN環境で、UbuntuからWindowsのホスト名を解決できずに悩んでいる方を対象としています。具体的には、「ping windows-pc」や「ssh user@windows-pc」などのコマンドが「名前解決できません」というエラーで失敗してしまう問題に直面している方向けです。

この記事を読むことで、Windowsのホスト名解決が動作する仕組み(NetBIOS、mDNSなど)を理解し、Ubuntu側での正しい設定方法、そして実際に名前解決が成功するまでの具体的な手順を習得できます。また、よくあるトラブルとその解決方法も紹介するので、同じ問題で時間を無駄にすることなく、スムーズにLAN内の通信が実現できるようになります。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - 基本的なLinuxコマンド操作(cat、sudo、vim/nanoなど) - IPアドレスとホスト名の関係性についての基礎知識 - ローカルネットワーク(LAN)の基本的な仕組み

Windowsのホスト名解決の仕組みを理解する

Windowsのホスト名解決には、主に2つの方法があります。1つはNetBIOS(Network Basic Input/Output System)と呼ばれるレガシーなプロトコル、もう1つはmDNS(Multicast DNS)と呼ばれる比較的新しいプロトコルです。Windowsのデフォルト設定では、NetBIOSが有効になっており、これがWindows同士の名前解決を担っています。

しかし、UbuntuなどのLinux系OSでは、デフォルトでNetBIOSクライアントがインストールされていないため、Windowsのホスト名を解決できないという問題が発生します。これは「なぜWindows同士は名前で通信できるのに、UbuntuからWindowsには通信できないのか?」という疑問の答えでもあります。

mDNSは、.localドメインを使った名前解決を行うプロトコルで、Avahiデーモンによって実現します。最近のWindows 10/11ではmDNSもサポートしており、これを活用することでUbuntuからもWindowsのホスト名を解決できるようになります。

UbuntuからWindowsのホスト名を解決する3つの方法

ここでは、UbuntuからWindowsのホスト名を解決するための3つの実践的な方法を詳しく解説します。環境に応じて最適な方法を選択できます。

方法1:mDNSを使った名前解決(推奨)

mDNSを使った名前解決は、最も簡単で推奨される方法です。Windows 10/11とUbuntuの両方がmDNSに対応しているため、特別な設定なしに利用できます。

まず、Ubuntu側でAvahiデーモンがインストールされているか確認します:

Bash
sudo systemctl status avahi-daemon

もしインストールされていない場合は、以下のコマンドでインストールします:

Bash
sudo apt update sudo apt install avahi-daemon avahi-utils

次に、Windows側でmDNSが有効になっているか確認します。Windows 10/11ではデフォルトで有効ですが、一応確認しておきましょう。PowerShellを管理者権限で開き、以下のコマンドを実行します:

Powershell
Get-Service -Name "Function Discovery Provider Host" Get-Service -Name "Function Discovery Resource Publication"

これらのサービスが実行中であれば、mDNSは利用可能です。

これで準備が整いました。UbuntuからWindowsにアクセスする際は、ホスト名の後に「.local」を付けます:

Bash
ping windows-pc.local ssh user@windows-pc.local

方法2:NetBIOSを使った名前解決

古いWindowsシステムや、mDNSが無効になっている環境では、NetBIOSを使った名前解決が必要になります。UbuntuでNetBIOSを使うには、nmblookupコマンドを含むsamba-common-binパッケージをインストールします:

Bash
sudo apt install samba-common-bin

インストールが完了したら、Windowsのホスト名をNetBIOSで解決してみます:

Bash
nmblookup windows-pc

このコマンドが成功すれば、WindowsのIPアドレスが表示されます。しかし、これだけではpingやsshでホスト名を解決することはできません。そこで、/etc/nsswitch.confファイルを編集して、NetBIOSを名前解決に組み込みます:

Bash
sudo cp /etc/nsswitch.conf /etc/nsswitch.conf.backup sudo nano /etc/nsswitch.conf

以下の行を見つけて:

hosts:          files mdns4_minimal [NOTFOUND=return] dns

以下のように修正します:

hosts:          files mdns4_minimal [NOTFOUND=return] wins dns

「wins」を追加することで、NetBIOS(WINS)を名前解決に利用するようになります。設定を反映させるため、nmbdサービスを再起動します:

Bash
sudo systemctl restart nmbd

これで、以下のコマンドが動作するようになります:

Bash
ping windows-pc ssh user@windows-pc

方法3:静的なhostsファイルを使った解決

少数のWindowsマシンを扱う場合、最も確実な方法は/etc/hostsファイルに静的にエントリを追加することです。これは最もシンプルで確実な方法ですが、Windows側のIPアドレスが変わると動作しなくなるという欠点があります。

まず、WindowsマシンのIPアドレスを確認します。Windowsでコマンドプロンプトを開き、以下を実行:

ipconfig

IPv4アドレスをメモしておきます。例:192.168.1.100

次に、Ubuntu側で/etc/hostsファイルを編集します:

Bash
sudo nano /etc/hosts

以下の行を追加します:

192.168.1.100   windows-pc
192.168.1.100   windows-pc.local

保存して終了すると、即座に名前解決が可能になります:

Bash
ping windows-pc ssh user@windows-pc

ハマった点と解決方法

実際に設定していく中で、以下のような問題に遭遇しました。

問題1:ファイアウォールによってmDNSがブロックされる

Ubuntu 20.04以降、ufw(Uncomplicated Firewall)が有効になっている場合、mDNSのポート(5353)がブロックされることがあります。これを解決するには、以下のコマンドでmDNSを許可します:

Bash
sudo ufw allow 5353/udp sudo systemctl restart avahi-daemon

問題2:Windows側でネットワークが「プライベート」に設定されていない

Windows側で、接続しているネットワークが「プライベートネットワーク」に設定されていないと、mDNSが動作しません。これを確認するには:

  1. Windowsの設定を開く
  2. 「ネットワークとインターネット」を選択
  3. 接続中のネットワークを選択
  4. 「ネットワークプロファイル」が「プライベート」になっていることを確認

問題3:systemd-resolvedとAvahiの競合

Ubuntu 18.04以降、systemd-resolvedがデフォルトで有効になっており、これがAvahiと競合することがあります。症状としては、.localドメインの名前解決が不安定になる、または完全に失敗するなどがあります。

解決方法は、/etc/systemd/resolved.confを編集して、.localドメインをsystemd-resolvedから除外することです:

Bash
sudo cp /etc/systemd/resolved.conf /etc/systemd/resolved.conf.backup sudo nano /etc/systemd/resolved.conf

以下の行のコメントを外して、値を設定:

[Resolve]
MulticastDNS=yes
Domains=~local

設定後、サービスを再起動:

Bash
sudo systemctl restart systemd-resolved sudo systemctl restart avahi-daemon

これらの問題に遭遇した場合、以下のコマンドでデバッグ情報を確認すると原因特定が早くなります:

Bash
# mDNSのデバッグ avahi-browse -a avahi-resolve -n windows-pc.local # NetBIOSのデバッグ nmblookup -d 4 windows-pc

まとめ

本記事では、UbuntuからWindowsのホスト名を解決するための3つの方法(mDNS、NetBIOS、静的hostsファイル)を解説しました。

  • mDNSを使った方法が最も簡単で推奨され、現代的なWindows 10/11環境では問題なく動作します
  • NetBIOSを使った方法は、古いWindowsやmDNSが無効な環境で有効ですが、設定がやや複雑です
  • 静的hostsファイルは最も確実ですが、IPアドレスの変更には対応できません

この記事を通して、Windowsのホスト名解決の仕組みを理解し、Ubuntuからシームレスにアクセスできるようになりました。今後は、これらの設定をスクリプト化して、複数マシンでの展開を自動化する方法についても記事にする予定です。

参考資料