Sambaでファイル共有サーバを構築する場合、
プロセスsmbdとnmbdの両方のプロセスが起動している必要があると、
どのサイトでも書かれている。

しかし自分の環境ではnmbdを起動しなくても、
Sambaサーバのファイルをダウンロードして更新することが出来る。

何故か。

調べてみると、smbdがsambaの核となるデーモンで、
nmbdはNetBIOSによる名前解決の際に使用されるらしい。
ということは名前解決がNetBIOS以外の何かで行われていれば、
nmbdは必要無いかも知れない。

更に、Sambaが実現するファイル共有はSMBとCIFSという2種類のプロトコルがあり、
SMBはNetBIOSを介してファイル共有を実現するのに対し、CIFSはNetBIOSを介さず、
ダイレクトにTCP/IPを利用してファイル共有を実現する。
ということは、CIFSを使っていた場合、NetBIOSを介さないので、
nmbdが起動していなくてもファイル共有できるのではないか?

ということで、CIFSプロトコルのポートを閉じてみるとどうなるか試してみた。

まずsmbdのポートを確認。

--------------------------------------
[root@localhost ~]# ps -ef | grep -e 'smbd' -e 'nmbd'
root 3347 1 0 18:44 ? 00:00:00 smbd -D
root 3349 3347 0 18:44 ? 00:00:00 smbd -D
root 3364 3295 0 18:45 pts/1 00:00:00 grep -e smbd -e nmbd
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# netstat -anp | grep -e 'smbd' -e 'nmbd'
tcp 0 0 :::139 :::* LISTEN 3347/smbd
tcp 0 0 :::445 :::* LISTEN 3347/smbd
unix 2 [ ] DGRAM 11067 3347/smbd
[root@localhost ~]#
--------------------------------------

smbdが起動しており、nmbdが停止している状態でのnetstat結果。
smbdは139と445の2つのポートを使用している。
このうち139がSMB、445がCIFSなので、iptablesで445を閉じてみる。


--------------------------------------
[root@localhost ~]# iptables -A INPUT -i eth0 -p tcp --dport 445 -j DROP
[root@localhost ~]#
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- anywhere anywhere tcp dpt:microsoft-ds

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]#

--------------------------------------

/etc/servicesにはデフォルトで「microsoft-ds 445/tcp」
と設定されており、上記のiptablesでは445が閉じられた状態。


ここで共有フォルダにアクセスすると・・・

lattelatteのブログ


エラーで返ってきた。
やはりCIFSで通信していたようだ。

ここでnmbdを起動して再度アクセスしてみる
・・・が同じエラーメッセージが出てきた。
プロセス上げただけではだめなのか?


Sambaサーバ、クライアント両方のOSを再起動後サーバのsmbd、nmbdを起動し、
更にiptablesで445番をDROPにしてクライアントからアクセス。
(上記の方法で設定したiptablesはOS再起動すると元に戻ってしまう。)

lattelatteのブログ


無事にログイン画面が出てきた。


netstatを実行するとポート139で接続中(ESTABLISHED)の行があり、
NetBIOS経由でリクエストしていることが判る。

--------------------------------------
[root@localhost ~]# netstat -anp | grep 139
tcp 0 0 :::139 :::* LISTEN 3337/smbd
tcp 0 0 ::ffff:192.168.195.128:139 ::ffff:192.168.195.1:1792 ESTABLISHED 3354/smbd
[root@localhost ~]#

--------------------------------------


では、nmbdが起動して、445番ポートも開いてるとSMB、CIFSのどちらを使うのか?
試してみたところ、CIFSを使用していた。

---------------------------------------
[root@localhost ~]# /etc/rc.d/init.d/smb start
SMB サービスを起動中: [ OK ]
[root@localhost ~]# /etc/rc.d/init.d/nmb start
NMB サービスを起動中: [ OK ]
[root@localhost ~]#
[root@localhost ~]# netstat -anp | grep -e 'smb' -e 'nmb'
tcp 0 0 :::139 :::* LISTEN 3310/smbd
tcp 0 0 :::445 :::* LISTEN 3310/smbd
tcp 0 0 ::ffff:192.168.195.128:445 ::ffff:192.168.195.1:1690 ESTABLISHED 3336/smbd
udp 0 0 192.168.195.255:137 0.0.0.0:* 3320/nmbd
udp 0 0 192.168.195.128:137 0.0.0.0:* 3320/nmbd
udp 0 0 0.0.0.0:137 0.0.0.0:* 3320/nmbd
udp 0 0 192.168.195.255:138 0.0.0.0:* 3320/nmbd
udp 0 0 192.168.195.128:138 0.0.0.0:* 3320/nmbd
udp 0 0 0.0.0.0:138 0.0.0.0:* 3320/nmbd
unix 2 [ ] DGRAM 10391 3320/nmbd
unix 2 [ ] DGRAM 10360 3310/smbd
[root@localhost ~]#
---------------------------------------

nmbが起動していてもCIFSが使われるように見える。
そのロジックは謎だが、また別の機会に調べることに。