Windows QandA

Author : たかはしもとのぶ <monyo@home.monyo.com>

445/tcpポート(Direct Hosting of SMBに対するアクセスを抑止する

質問

現在、ファイアウォールの管理を行なっています。ファイルサーバをUNIX上のSamba 2.2.3aで構築しており、137/udp、138/udp、139/tcpポートを許可することで、問題なくファイル共有などは行なえているのですが、ファイアウォールのログに445/tcpポートへのアクセスが大量に記録されているので、調べたところ、Windows 2000やWindows XPクライアントからは、139/tcpポートに接続する前に、必ず445/tcpポートへのアクセスを試行するようです。

とりあえず、実害はないので現状放置していますが、できればこの通信を抑止したいと考えています。何か方法はあるのでしょうか?

また、調べたところ、445/tcpポートはWindows 2000から実装されているDirect Hosting of SMBという機能のようですが、これは139/tcpとどういった違いがあるのでしょうか?

回答

Windows 2000以降では、ファイル・プリンタ共有を行なう際に、従来から用いられてきた139/tcpポートを使用するNBT(NetBIOS over TCP/IP)の代わりに、デフォルトでは445/tcpを使用するような実装になっています。

実際にネットワークモニタを使って確認すると、Windows 2000以降のマシンがファイル・プリンタサーバに接続を行なう際は、図1のように139/tcpと445/tcpポートの両方に対してTCPコネクションの確立を試行し、両方ともに応答があった場合は、139/tcpの方を強制的に切断して、以降445/tcpのみを使用する実装になっているようです。


図1: Windows 2000のSMBセッション確立時のパケットキャプチャ

フレーム1,3,4で445/tcpに対するTCPセッションが確立され、フレーム5,8およびそれ以降(図には現れていない)で、セッションが継続されています(左側の....S. / .A..S. / .A.... というフラグの流れで確認できます)
一方、フレーム2, 6で139/tcpに対するセッションも確立されようとしますが、すでにフレーム4で445/tcpに対するセッションが確立しているため、フレーム7でセッションの確立を開始したクライアント側からリセット(強制切断)され、139/tcpへのセッション確立の試行は終了しています(左側の ....S. / .A..S. / ...R.. というフラグの流れで確認できます)

質問にあるように139/tcpのみを許可している場合は、445/tcpからの応答がないため、最終的に139/tcpによるTCPコネクションが使用されますが、結果として445/tcpによる接続試行のログが大量に記録されてしまいます。

445/tcpのみを使用したいという場合は、TCP/IPプロトコルのプロパティ(図2)の画面で「NetBIOS over TCP/IP を無効にする」を選択することで簡単に行なえます。


図2: NetBIOS over TCP/IPを無効にする

なお、レジストリを直接変更したい場合は、以下のレジストリを修正してください。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\Tcpip_インタフェース名
REG_DWORD: NetBIOSOptions : 0(既定値), 1(有効にする), 2(無効にする)

しかし、今回のように139/tcpのみを使用したいという場合は、以下のレジストリを修正する必要があります。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters
REG_DWORD: SMBDeviceEnabled : 0

これにより、445/tcpが無効となり、常に139/tcpを用いた通信が行なわれるようになります。なお、この設定を行なった場合、当然ですがNBTを無効にしたマシンとはファイル共有などができなくなります。

Direct Hosting of SMBとは

最後にDirect Hosting of SMBについて説明しましょう。これは、図xxのように従来NetBIOSインタフェース上に実装していたSMBを直接TCP/IP上に実装したプロトコルになります。「Direct Hosting of SMB」とは、NetBIOSを介さず、直接(Direct)TCP/IP上にホスト(Hosting)しているSMBということを意味しています。


図3: NBTとDirect Hosting of SMBのプロトコルスタックの違い

このため、図4のようにセッション確立時のNetBIOS名の名前解決も不要となり、WINSサーバの構築が不要になる他、すでにTCPレイヤで名前解決を行ない、通信先を特定しているにも関わらず、再度NetBIOSレイヤで名前解決を行なうという冗長さも解消されています。


図4: セッション確立時の処理シーケンスの違い

一度SMBセッションが開始された後の処理は従来と変わりません。

なお、実は最新のSamba 3.0系列であれば、Direct Hosting of SMBに対応しています。

またSamba 2.2系列であっても、Sambaをデーモンとして起動せず、inetdやxinetdなどを使って、smbdを445/tcpポートで待ち受けさせる形をとることで、Direct Hosting of SMBを使用することも可能です。inetdから起動することによるデメリットもあるので、単純にこの方式をとることがよいとはいえませんが、対処策の一つとして頭の片隅に入れておくと良いかも知れません。

注記・補足