さまざまなバージョンのPCやデバイスが接続されたネットワークでは、ファイル共有のためにSMBのバージョン(ダイアレクト)のネゴシエーションが行われ、適切なバージョンが自動選択されて、共有リソースへのアクセスが可能になります。今回は、Windows同士のSMBネゴシエーションの様子をちょっとのぞいてみましょう。
前回は、「SMB(Server Message Block)」と「CIFS(Common Internet File System)」の現在の解釈について説明しました。筆者は、Windowsのファイル共有の説明の中で、CIFSをSMBの一般名称として扱うことに反論したいわけではありませんが、Windows 8.1およびWindows Server 2012 R2の「SMB 1.0/CIFSファイル共有のサポート」を説明するには、現在の解釈を踏まえる必要があります。
現在の解釈に従うなら、CIFSはWindowsのファイル共有プロトコルのWindows NTやWindows 95までの古い呼び名で、その後、さらに拡張されたSMB 1.0に置き換えられました。現在ではSMB 1.0とCIFSは“ほぼ同じもの”という認識で問題ありません。プロトコルの大きな分類ではSMB 1.0/CIFSは「MS-SMB」に含まれ、Windows Vista以降のSMB 2.xおよびSMB 3.xを含む「MS-SMB2」とは区別されます。
“MS-SMBのSMB”は、LAN ManagerやWindows for Workgroupsなど、20年以上前の初期のWindows向けに設計されたものです。下位互換性を提供するため、初期の設計のさまざまな制約を引き継いだまま、Windows XPやWindows Server 2003 R2まで、メインのファイル共有プトロコルとして使用されてきました。もっといえば、SMBはもともとIBMで誕生したものであり、マイクロソフトが一から開発したわけではありません。これに対して、“MS-SMB2のSMB”はマイクロソフトが一から開発したものであり、現在のネットワーク環境やファイル共有のニーズに合うように設計されています。
SMBは「MS-SMB」と「MS-SMB2」の大きく二つに分類され、各分類はさらに細かいバージョンを含みます。そのバージョンを識別するのが、“方言”の意味を持つ「ダイアレクト(Dialect)」です。SMB 1.0/CIFSは、MS-SMBの数あるバージョンの中で「NT LM 0.12」のダイアレクトで識別されます。また、MS-SMB2に含まれるSMB 2.0以降のSMBは、それぞれ個別のダイアレクトで識別されます。
以下の表1は、前回も紹介しましたが、Windowsのさまざまなバージョンの組み合わせで使用されるSMBのバージョンを示したものです。SMBのセッションを開始するには、クライアント(Workstationサービス)とサーバー(Serverサービス)がお互いのSMBダイアレクトをネゴシエーションして、両者が利用可能な最上位のSMBバージョンを選択します。
実際のSMBネゴシエーションの様子を、ネットワーク上を流れるパケットをキャプチャしてのぞいてみました。最初に、Windows 8.1を実行する2台のPC間のファイル共有で試してみます。
筆者は今回、ネットワークキャプチャソフトとして「Wireshark」を使用しましたが、マイクロソフトの「Microsoft Message Analyzer」や「Microsoft Network Monitor」、その他のキャプチャソフトを使ってもほぼ同じです。
以下に説明する画面1〜画面3は、キャプチャ結果からプロトコル「SMB」(MS-SMBのこと)と「SMB2」(MS-SMB2のこと)をフィルターし、Windows 8.1のPC同士のSMBネゴシエーションの部分を抜き出したものです。この前に名前解決のためにさまざまな種類のやりとりが行われるのですが、その部分に関しては今回説明しません。
共有フォルダーへのアクセスを開始するSMBクライアント側のコンピューター名は「win81pc」、共有フォルダーを提供するSMBサーバー側のコンピューター名は「win81pro01」です。
画面1は、クライアントからサーバーに対する、MS-SMBプロトコルのSMBネゴシエート要求です。SMBプロトコルのヘッダーの中身を見ると、クライアント側がサポートする全てのSMBダイアレクトを提示していることが分かります。「PC NETWORK PROGRAM 1.0」から「NT LM 0.12」まではMS-SMBのダイアレクト、「SMB 2.002」はMS-SMB2の初めてのバージョンであるSMB 2.0のこと、そして「SMB 2.???」はSMB 2.1以降を示しています。
Windows 8.1はSMB 3.02に対応しているため、MS-SMBプロトコルではネゴシエートは完了しません。SMBネゴシエート応答は、MS-SMB2プロトコルで返され、サーバー側がSMB 2.1以降のダイアレクト(0x02ff)に対応していることが示されます。そこで、画面2のMS-SMB2プロトコルによるSMBネゴシエート要求が行われ、クライアント側は自身がサポートするMS-SMB2の全てのダイアレクトを提示します。Windows 8.1は、MS-SMB2の次の四つのダイアレクトに対応しています。
| ダイアレクト | SMBのバージョン | 
|---|---|
| 0x0202 | SMB 2.0 | 
| 0x0210 | SMB 2.1 | 
| 0x0300 | SMB 3.0 | 
| 0x0302 | SMB 3.02 | 
MS-SMB2のSMBネゴシエート要求を受け取ったサーバー側は、クライアントがサポートするダイアレクトの中から、自身がサポートする最上位のダイアレクトである「0x0302」を選択し、選択したダイアレクトを画面3のSMBネゴシエート応答としてクライアントに返します。これでSMBネゴシエートが完了し、SMB 3.02によるSMBセッションのセットアップへと進みます。
サーバー側がMS-SMB2に対応していないWindows XPまたはWindows Server 2003 R2以前なら、サーバー側からのSMBネゴシエート応答でクライアントとサーバーの両方がサポートする最上位のダイアレクトである「NT LM 0.12」が選択され、SMBネゴシエートは終了となりSMB 1.0/CIFSによるSMBセッションのセットアップへと進みます。「NT LM 0.12」はWindows 95やWindows NTから利用されているものなので、今の時代、「NT LM 0.12」より古いダイアレクトが選択されることはないはずです。
サーバー側がMS-SMB2の最初のバージョンであるSMB 2.0を初めて実装したWindows VistaまたはWindows Server 2008なら、MS-SMBプロトコルのSMBネゴシエート要求に対する、最初のMS-SMB2プロトコルのSMBネゴシエート応答で「0x0202」が選択され、SMBネゴシエーションは完了となり、SMB 2.0によるSMBセッションのセットアップに進みます。
対応するSMBバージョンが古いSMBクライアントから、新しいSMBサーバーへの接続の場合も同じようにSMBネゴシエーションが行われ、SMBクライアント側のダイアレクトが選択されることになります。次の画面4は、SMB 2.0対応のWindows Vistaを実行するPCから、Windows 8.1を実行するPCの共有フォルダーに接続する際のSMBネゴシエート要求です。このように、SMB 2.0までは1回のSMBネゴシエート要求/応答で、SMBネゴシエーションは完了します。
今の時代、「NT LM 0.12」より古いダイアレクトが選択されることはないといいましたが、Windows 3.1+LAN Managerの環境を用意できたので、Windows 8.1のPCに接続を試みました。共有フォルダーへの接続はエラーになりましたが、SMBネゴシエート要求/応答はできたようです。画面5は、そのときのSMBネゴシエート要求です。LAN Managerのダイアレクトである「LANMAN2.1」が選択されました。
このように、WindowsにおけるSMB 1.0/CIFSのサポートは、SMB 1.0/CIFSより前のダイアレクトを含みます。ただし、「NT LM 0.12」より古いSMBバージョンのWindowsやその他のデバイスと、最新のWindows 8.1との間でSMBによるファイル共有が可能かどうかはまた別の話です。認証や署名など、解決するべき互換性問題があるため、難しいかもしれません。
Windows 8.1やWindows Server 2012 R2からは「SMB 1.0/CIFSファイル共有のサポート」を削除できますが、削除するとSMB 1.0/CIFSの「NT LM 0.12」をネゴシエートしないようになります。前出の表1内の赤字で示した部分のサポートがなくなるということです。
次の画面6は、Windows 8.1のPCから、ちょっと古いNAS(Network Attached Storage)デバイスに接続したときの、最初のSMBネゴシエート要求です。Windows XPやWindows Server 2003 R2以前のWindowsのファイル共有に接続しようとした場合でも同じです。
「SMB 1.0/CIFSファイル共有のサポート」を削除すると、MS-SMBプロトコルによるSMBネゴシエート要求はなく、最初からMS-SMB2プロトコルによるSMBネゴシエート要求を送信します。つまり、SMB 1.0/CIFSの「NT LM 0.12」だけでなく、MS-SMBの全てのダイアレクトをネゴシエートしなくなるということです。
逆に、SMB 2.0以降に対応していないWindowsやWindows以外のデバイスから、「SMB 1.0/CIFSファイル共有のサポート」を削除したWindows 8.1のPCのファイル共有に接続しようとした場合、Windows 8.1のPCからはMS-SMBプロトコルのサポートが削除されているため、MS-SMBプロトコルのSMBネゴシエート要求に応答することはなく、接続は「指定されたネットワーク名は利用できません」のエラーで失敗します。
SMB 2.0以降に対応したWindows PC同士では、SMB 1.0/CIFSが使用されることはありません。ネットワーク上にあるWindowsが全てSMB 2.0以降に対応しているのであれば、Windows 8.1やWindows Server 2012 R2から「SMB 1.0/CIFSファイル共有のサポート」を削除しても問題になることはないでしょう。Windows 8.1やWindows Server 2012 R2だけのネットワークなら、ネットワーク上からMS-SMBプロトコルの無駄なトラフィックを排除できます。
ネットワーク上にWindows以外のSMB対応デバイスが存在する場合は、「SMB 1.0/CIFSファイル共有のサポート」を削除するのには慎重になるべきです。例えば、NASデバイス、ネットワーク対応プリンターやスキャナー、LinuxやMacなどが存在する場合は、影響がないかどうかSMB 2.0以降への対応状況を調査する必要があります。LinuxやMacについては、次回以降に詳しく説明します。例えば、古いMac(OS X)とはSMB 1.0/CIFSで通信することになりますが、最新のMacならSMB 3.02までに対応しています。
SMB 2.0以降に対応したWindows PC同士では、SMB 1.0/CIFSが使用されることはありませんと言ったばかりですが、、実は、表1のマトリックスの全ての欄をSMB 1.0/CIFSで埋めることも不可能ではありません。
以下のサポート技術情報では、Windows VistaおよびWindows Server 2008以降でSMB 1.0/CIFSを無効する方法、およびSMB 2.x/3.xを無効にする方法が説明されています。この方法は、SMBのトラブルシューティングのための一時的な手段として用意されているものです。
このサポート技術情報では、SMBサーバーとSMBクライアントのそれぞれで、SMB 1.0/CIFSまたはSMB 2.x/3.xを無効化する方法が説明されています。特に、SMB 2.x/3.xの無効化は別のトラブルを招く原因になりかねないため、具体的な手順は説明しません。
次の画面7は、SMBサーバーのSMB 2.x/3.xを無効化したWindows 8.1 PCの共有フォルダーに対して、通常のWindows 8.1 PCから接続した様子を示しています。SMBクライアントはMS-SMBプロトコルのSMBネゴシエート要求で全てのダイアレクトを提示していますが、「NT LM 0.12」を選択してネゴシエーションが完了しています。
Windows 8およびWindows Server 2012以降は、Windows PowerShellのコマンドレットでSMBセッションで使用中のダイアレクトを確認することが可能です。SMBサーバー側なら「Get-SmbSession」コマンドレット(例:Get-SmbSession | Select ClientComputerName, ClientUserName, Dialect)で、SMBクライアント側からは「Get-SmbConnection」コマンドレットを使用します。なお、SMB 1.0/CIFSのダイアレクト「NT LM 0.12」は、Get-SmbSessionコマンドレットは「1.01」、Get-SmbConnectionコマンドレットは「1.5」と表示されます。
マイクロソフトは現在、Windowsの次期バージョンを開発中であり、プレビュー版としてTechnical Previewを公開しています。Windows 10 Technical Previewに関しては、2014年10月に最初のビルド「9841」が提供され、その後、早いサイクルで新しい更新ビルドが提供され、先日、最新ビルド「9926」が提供されました([参考記事]最新ビルドを詳細レビュー! Windows 10 Technical Preview Build 9926がやってきた)。Windows Server Technical Previewは、2014年10月のビルド「9841」の公開以降、新しいビルドは提供されていません。次のプレビュービルドの提供は2015年春に予定されています。
SMBの次期バージョンの名称や機能については、今のところ公表されていませんが、次の画面8を見てください。画面8の左側はWindows 10 Technical Previewのビルド9841から送信されたSMBネゴシエート要求、右側はビルド9926から送信されたSMBネゴシエート要求です。MS-SMB2の新しいダイアレクトとして、ビルド9841では「0x0310」、ビルド9926では「0x0311」が追加されています。
ここで問題です。Windows Server Technical Previewビルド9841の共有フォルダーに、Windows 10 Technical Previewビルド9926から接続した場合、使用されるSMBのバージョンは何になるでしょうか。
答えは次の画面9にあります。画面9はWindows 10 Technical Previewビルド9926から、三つの異なるバージョンのWindowsの共有フォルダーに接続したものです。共有フォルダーを提供する「win81pro01」はWindows 8.1、「win10x86tg」はWindows 10 Technical Previewビルド9926、「dc」はWindows Server Technical Previewビルド9841です。Windows 10 Technical Previewの最新ビルド9926のPC間ではダイアレクト「0x311」が使用され、Windows Server Technical Previewビルド9841の共有フォルダーへの接続には、Windows 8.1と同じダイアレクト「0x302」(SMB 3.02)が使用されています。
 画面9 最新のダイアレクトが同じではないため、Windows 10 Technical Previewビルド9926とWindows Server Technical Previewビルド9841のSMB接続には、現行バージョンのSMB 3.02が選択された
画面9 最新のダイアレクトが同じではないため、Windows 10 Technical Previewビルド9926とWindows Server Technical Previewビルド9841のSMB接続には、現行バージョンのSMB 3.02が選択された現在のSMB 3.1x(3.1.x)に新機能が実装されているのかどうか分かりませんが、Windowsの次期バージョンをクライアント/サーバーで評価する場合は、同じビルドで評価するのが良さそうですね。
次回からは、LinuxやMacとWindowsが混在する環境で、ネットワーク上のSMBトラフィックをのぞいてみたいと思います。さて、何が見えてくるでしょうか。
山市 良(やまいち りょう)
岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2015)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。
 ファイル共有プロトコルSMB/CIFS(その1)
ファイル共有プロトコルSMB/CIFS(その1) ファイル共有プロトコルSMB/CIFS(その2)
ファイル共有プロトコルSMB/CIFS(その2) ファイル共有プロトコルSMB/CIFS(その3
ファイル共有プロトコルSMB/CIFS(その3 強化されたファイル共有プロトコルSMB 3.0の概要
強化されたファイル共有プロトコルSMB 3.0の概要Copyright © ITmedia, Inc. All Rights Reserved.