2015年11月24日火曜日

NetBios と nssswitch の設定

自宅内の Linux ホストのネットワーク設定 (NetBios) の備忘録

2 台の Linux ホストは、DHCP から IP を取っているが、IP アドレスが変わることは滅多にないので、各 Linux ホスト+windows 機の hosts ファイルに全て IP アドレスを書いていた。 年に 1, 2回程度の作業だったが、なにか方法があるはずだと思うようになった。

最初に考えたのは、サブネットに片っ端から ping を打って、arp テーブルで MAC アドレスとホストファイルの対応を取り、結果をhosts ファイルに書き込む方法。しかし時間がかかるのと、 Windowsで、例えば ruby のスクリプトを定期的に自動実行するやり方もよくわからない。そもそも Windows 同士では DNS に登録してなくても相互の名前が見えている。なにかブロードキャストを 使う仕組みとかありそう。Windows の Netなんちゃら。それを調べてみた。

Netbiosは同じサブネット内のマシンの名前解決のための仕組みで、UDP/137 でブロードキャストして、返事をしたマシンからホスト名 (netbios名) と IP アドレスを教えてもらうもののようだ。 Linux でその仕組みを使うには Samba 関連のパッケージがインストールされていることが必要。 1 台の linux ホスト (hoge1) では samba を動かしてるので、もう 1 台の linux ホスト(hoge2)も samba 関連のパッケージを入れてみる。smbd と nmbd が起動するが、一旦止める。そして、手始めに hoge2 にて nmblookup というsamba付属のコマンドを使いhoge1 の IP アドレスを調べてみる:

user1@hoge2:~$ nmblookup hoge1
querying hoge1 on xxx.xxx.xxx.255
yyy.yyy.yyy.yyy hoge1<00>

host2 では、 samba 関連のパッケージを入れたが、smbd も nmbd もまだ起動していない。この状態で nmblookup でhoge1 の IP アドレスを知ることができたのだから、 起っていることは、hoge2 からブロードキャストに対して hoge1 が返事をしていると考えて良さそう。試しに hoge1 で hoge2 の IP アドレスを調べようとしても、

user1@hoge1:~$ nmblookup hoge2
querying hoge1 on xxx.xxx.xxx.255
name_query failed to find name hoge2

となる。そもそも samba には smbd と nmbd の 2 種類のデーモンが動いているのは何故かあまり考えなかったが、 smbd はファイルシステムで、 nmbd がNetBiosサービスだったようだ。 hoge1 から hoge2 の IP アドレスを調べることができるためには、hoge2 で nmbd が動いていればよい。nmbd の設定は /etc/samba/smb.conf にする。ネットを見ていると、ここで wins support = yes と書けばよいとあたっが、上記の目的(ブロードキャストに対して IP アドレスを答えさせる)だけなら no のままでよい。もし wins support を yes にすると、 その nmbd は NetBios 名のネームサーバ Wins サーバになるそうだ。そうすると、ブロードキャストする代わりに、そのサーバにIP アドレスを問い合わせることになる(はず)。 また、smb.conf では wins server = xxx.xxx.xxx.xxx として、他の Wins サーバの IP アドレスを指定することもできるようだ。しかし今回はブロードキャストベースの名前解決をすることに したので、Wins サーバは立てないことに。そして、hoge2 で nmbd だけを起動させるには、ubuntu 12.04lts だと /etc/default/samba で、 RUN_MODE を daemons 以外にすればよい:

# Defaults for samba initscript
# sourced by /etc/init.d/samba
# installed at /etc/default/samba by the maintainer scripts
#

#
# This is a POSIX shell fragment
#

# How should Samba (smbd) run? Possible values are "daemons"
#       or "inetd".
#RUN_MODE="daemons"
RUN_MODE="inetd"

と書いておけばよい。 /etc/init/smbd.conf はこのファイルを見て、smbd を起動するかどうかを判断している。ちなみに ubuntu 12.04lts の /etc/init/nmbd.conf では smb.conf に disable netbios = yes と書いてあると、nmbd を起動しない。

ここまできたら、あとは /etc/nsswitch.conf にホスト名解決を以下にした:

hosts:          files dns wins
これで hosts ファイルになにも書かなくても、 NetBios名で接続ができるようになった。 Windows マシンは nsswitch.conf 的なものはよくわからないが、とくになにもしなくても nmbd の 動いている linux ホストへ NetBios 名で接続できるようになった。

蛇足

さらに OSX でも nsswitch 的なことをしたかったのだが、やり方がわからない。しかたなく、スクリプトを書き、 hosts ファイルを定期的に更新するようにした。 ちなみに OSX には nmblookup というコマンドは見当たらず、 代わりに smbutil lookup でブロードキャストできるようだ:

smbutil lookup hoge1

0 件のコメント:

コメントを投稿