60278
UbuntuからWindowsマシンのホスト名を、NetBIOSによって名前解決をしたいです。

やったことは、

  * `sudo apt purge avahi-daemon`
  * `sudo apt install winbind libnss-winbind`
  * `/etc/nsswitch.conf` の `hosts:` の行の最後に `wins` を追加

この設定で、Ubuntu 16.04ではできていましたが、Ubuntu 18.04でできなくなりました。

今私のネットワークには次のマシンがあるとします。

  * 10.10.10.205/24 alice (Ubuntu18)
  * 10.10.10.200/24 julia (Windows10)

aliceからjuliaにpingを実行します。

```

    soramimi@alice:~$ ping julia
    ping: julia: 名前またはサービスが不明です
    
```

同じことを、Ubuntu16やWindows10のコマンドプロンプトで実行すると、pingの結果が帰ってきます。Ubuntu18では、上記の通り「名前またはサービスが不明です」というエラーになります。

このときの通信パケットは次のようなものでした。

[![wireshark](https://i.stack.imgur.com/B9qZp.png)](https://i.stack.imgur.com/B9qZp.png)  
NetBIOS Name Service
のリクエストとレスポンスは成功しているようです。リクエストのブロードキャストに対して、10.10.10.200が応答していることがわかります。このIPアドレスに対するpingは正常ですし、Remmina（リモートデスクトップ）による接続もできたので、問い合わせに対する結果は正しいことがわかります。ですが、Ubuntu18のリゾルバがそのIPアドレスを返してくれないようです。

この原因と解決策として考えられることは何でしょうか？
CC BY-SA 4.0
2019-10-19T07:26:49.853
59808
2019-11-05T12:25:01.583
3337
question
linux windows network
UbuntuからWindowsのホスト名を解決したい
`winbindd`(8) は動作していますか? (動いているようだけど念の為)

`wbinfo --WINS-by-name julia` で `winbindd` に `julia`
の名前解決を依頼したとき、どのような応答が得られますか?

IP アドレス `10.10.10.200` のホストがブロードキャスト宛の名前解決要求に応答していますが、応答によると `JULIA<20>` の IP
アドレスは `192.168.222.1` と答えているように見えます。この IP アドレスに心当たりはありませんか?

mDNS でも `resolv.conf`(5) で `search local` とでも書いておけば `.local`
付けずに済むと思うのですが、それでは駄目なのでしょうか?
CC BY-SA 4.0
2019-10-21T14:24:39.630
59853
2019-10-21T14:24:39.630
3061
59808
answer
自己解答です。

結論から言うと、nsswitch用の名前解決ライブラリを自作しました。

コメントで頂いた 「[[SOLVED] winbind does not work after reboot on Mint 19 / Ubuntu
18.04](https://forums.linuxmint.com/viewtopic.php?t=276346)」 ならびに、同内容の
「[winbind does not work after reboot on Mint 19 / Ubuntu
18.04](https://bugs.launchpad.net/ubuntu/+source/samba/+bug/1789097)」
そして、それを参照している日本語の記事「[Ubuntu18.04/Mint19でwinbindが再起動後に起動しない](https://qiita.com/Urushibara01/items/3b55646e228d82c34e48)」といった情報が見つかりました。

これらによると、systemdがサービスを起動する順番の定義に問題があるらしく、解決策としては、Sambaをインストールするか`/lib/systemd/system/winbind.service`を修正するとのことでした。しかし私の環境では、いずれの方法も解決に至りませんでした。やり方が間違っている可能性はあるものの、それ以上追求するのは諦めました。

その後、ソケットを使ったUDP通信で NetBIOS Naming Service
のプロトコルで、[ホスト名を問い合わせるプログラム](https://qiita.com/soramimi_jp/items/041eae2465f3ec985b99)を作りました。

また、GitHubでnsswitchの名前解決ライブラリを作る方法を探して、[自前の名前解決ライブラリ](https://qiita.com/soramimi_jp/items/9282a83664355c563c37)を作ることができました。

この二つを組み合わせて`libnss-winbind`の代替品を作りました。

<https://github.com/soramimi/libnss-winz>

`make`して、`sudo make
install`して、`/etc/nsswitch.conf`内の`hosts:`の定義の最後に`winz`と書くと使えるようになります。
CC BY-SA 4.0
2019-11-05T12:25:01.583
60278
2019-11-05T12:25:01.583
3337
59808
answer