Samba NetBIOS の名前解決で小ハマリしたのでメモ。
Linux にインストールした Samba の smbclient コマンドで他のサーバにアクセスしようとしたが、アクセスできないという現象に遭遇した。
$ smbclient -U "*****%*****" -L //vm2008
Connection to vm2008 failed (Error NT_STATUS_UNSUCCESSFUL)
$
smbtree では、まったく応答が返ってこない。
$ smbtree-U "*****%*****"
$
IPアドレスや、LAN内DNSのドメインを付けるとアクセスできる。すなわち、ネットワークとしては接続できる状態で、DNSによる名前解決はできている。
どうやら、サーバ名(コンピュータ名)でのアクセス、すなわち、NetBIOS での名前解決がうまくいっていないようだ。
オプション「-d 10」を付けて実行すると、実行時のデバッグ・ダンプを出力してくれるが、どうにも原因がはっきりしない。
WEBを探ってみると、WINSサーバを立ち上げて解決といった事が多く書かれているのだが、WINSサーバを立ち上げないと名前解決ができないとは思えない。
事実、ネットワーク上にWINSサーバは立てていないが、Windows マシンは、Samba サーバを含むマシンの一覧がブラウズでき、アクセスもできる。
違うだろうなぁと思いながら、念のためWINSサーバを立ち上げてみる。
Samba 自身をWINSサーバにして試してみても、アクセスできない。
他のSamba をWINSサーバにし、そのWINSサーバを参照するようにしても、アクセスできない。
他のWindiwsサーバにWINSサーバをインストールし、そのWINSサーバを参照するようにしても、アクセスできない。
/etc/nsswitch.conf で wins を参照するように設定しても、アクセスできない。
NetBIOS の名前解決なんて、Sambaの標準設定で普通にできそうなものなのだが…。
あれこれ Samba の設定を変えて試してみるが、うまくいかない。
ふと気になって、iptablesを止めてみた。
すると…
# service iptables stop
Redirecting to /bin/systemctl stop iptables.service
#
$ smbclient -U "*****%*****" -L //vm2008
Domain=[VM2008] OS=[Windows Server (R) 2008 Standard 6002 Service Pack 2] Server=[Windows Server (R) 2008 Standard 6.0]
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
D$ Disk Default share
:
$
あれ? アクセスできた。
Samba 用には、以下の様に iptables を設定している。
-A INPUT -p udp -s 192.168.0.0/24 --dport 137:138 -j ACCEPT
-A INPUT -p tcp -s 192.168.0.0/24 --dport 139:445 -j ACCEPT
この設定で、これまで不都合があった事はないのだが…。
WEBを検索しても、これとほぼ同様の設定しか出てこない。
どういうことだ?
あれこれ設定を変えてみるが、アクセスできるようにならない。
しかし、iptables を停止すればアクセスでき、起動すればアクセスできなくなるので、iptables の設定に問題があるのは間違いない。
どうにもわからないので、iptables からログを吐き出すようにして、どんなアクセスがあるか確認してみた。
/etc/sysconfig/iptables にログを出力する設定を追加し、iptablesを再起動。
-A INPUT -j LOG --log-prefix "IPTABLES_INPUT_LOG : " --log-level=info
# service iptables restart
Redirecting to /bin/systemctl restart iptables.service
#
/var/log/message の出力を監視した状態で smbclient を動かしてみると…あった!
# tail -f /var/log/message
:
Oct 29 19:06:58 ***** kernel: [26555.146587] IPTABLES_INPUT_LOG : IN=eth0 OUT= MAC=***** DST=192.168.***.*** LEN=78 TOS=0x00 PREC=0x00 TTL=128 ID=16063 PROTO=UDP SPT=137 DPT=137 LEN=58
Oct 29 19:06:59 ***** kernel: [26555.867600] IPTABLES_INPUT_LOG : IN=eth0 OUT= MAC=***** SRC=192.168.***.*** DST=192.168.***.*** LEN=78 TOS=0x00 PREC=0x00 TTL=64 ID=6170 DF PROTO=UDP SPT=57357 DPT=137 LEN=58
Oct 29 19:06:59 ***** kernel: [26555.869151] IPTABLES_INPUT_LOG : IN=eth0 OUT= MAC=***** SRC=192.168.***.*** DST=192.168.***.*** LEN=102 TOS=0x00 PREC=0x00 TTL=128 ID=16066 PROTO=UDP SPT=137 DPT=57357 LEN=82
Oct 29 19:07:10 ***** kernel: [26566.649327] IPTABLES_INPUT_LOG : IN=eth0 OUT= MAC=***** DST=192.168.***.*** LEN=78 TOS=0x00 PREC=0x00 TTL=128 ID=16067 PROTO=UDP SPT=137 DPT=137 LEN=58
:
「SPT」「DPT」が、iptables の設定で言うところの「--sport」「--dport」だろう。
「DPT」の値に、「137」以外に「57357」という値が見える。
これだ!
ポート57357への入力は許可していないので、iptables がアクセスを拒否しているのだ。
「57357」という値はアクセスする度に毎回変動する(FTPで言うところのパッシブ・モードのようなものか?)ようなので、--sport で、ポート137へのアクセスを許可する事にする。
iptables に設定を追加(2行目を追加)して、再起動。
-A INPUT -p udp -s 192.168.0.0/24 --dport 137:138 -j ACCEPT
-A INPUT -p udp -s 192.168.0.0/24 --sport 137 -j ACCEPT
-A INPUT -p tcp -s 192.168.0.0/24 --dport 137 -j ACCEPT
-A INPUT -p tcp -s 192.168.0.0/24 --dport 445 -j ACCEPT
# service iptables restart
Redirecting to /bin/systemctl restart iptables.service
#
smbclient でのアクセスを試してみる。
$ smbclient -U "*****%*****" -L //vm2008
Domain=[VM2008] OS=[Windows Server (R) 2008 Standard 6002 Service Pack 2] Server=[Windows Server (R) 2008 Standard 6.0]
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
C$ Disk Default share
D$ Disk Default share
:
$
おし、アクセスできた。
ふぅ。