前回は、ネットワーク上を流れるパケットをキャプチャすることで、同じまたは異なるバージョンのWindows間のSMBネゴシエーションの様子を明らかにしました。今回は、同じ方法でWindowsとLinux間のSMBファイル共有の様子をのぞいてみましょう。
前回(ファイル共有プロトコル、SMBとCIFSの違いを正しく理解できていますか?)までの話で「Server Message Block(SMB)」と「Common Internet File System(CIFS)」の関係については、理解していただけたと思います。
おさらいしておくと、CIFSはWindows NTやWindows 95までの古い呼び名で、その後、さらに拡張されたSMB 1.0に置き換えられました。現在ではSMB 1.0とCIFSは“ほぼ同じもの”という認識で問題ありません。どちらも、SMBのダイアレクト「NT LM 0.12」を使用します。
プロトコルの大きな分類ではSMB 1.0/CIFSは「MS-SMB」に含まれ、Windows Vista以降のSMB 2.xおよびSMB 3.xを含む「MS-SMB2」と区別されます。そして、20年以上前の設計の制約を引き継いだMS-SMBに対して、MS-SMB2は現在のネットワーク環境やファイル共有のニーズに合うように設計されており、MS-SMBと比べて効率的で高速なプロトコルです。
前回は、Windowsを実行するコンピューター間のSMBネゴシエーションの様子を、ネットワーク上を流れるパケットをキャプチャしてのぞいてみました。今回は、WindowsとLinuxのコンピューター間のSMBネゴシエーションをのぞいてみます。今回もまた、ネットワークキャプチャソフトとして「Wireshark」を使用しました。マルチプラットフォームのWiresharkなら、同じ方法でWindowsとLinuxのどちらからでもパケットをキャプチャできます。
実際のキャプチャデータを見てもらう前に、Linuxにおける現在のSMBの対応状況について触れておきましょう。
LinuxとWindowsの相互運用性といえば、多くの読者がオープンソースの「Samba」をまず思い浮かべると思います。
Sambaの最初のバージョンは1992年のリリースであり、非常に歴史のあるオープンソースプロジェクトです。もし、“CIFSはSMBの公開された標準化仕様であり、マイクロソフトによる実装がSMBで、CIFSのオープンソース実装の代表例がSambaである”という誤った認識をまだお持ちの場合は話がかみ合わないと思いますので、本連載の前々回から読み直してください。
マイクロソフトがインターネット標準を目指して、CIFSをインターネットドラフトとして公開したのは1997年のことです(ちなみに、このドラフトはすでに無効です)。それ以前から存在するSambaがCIFSを具現化したものであるというのは、そもそもおかしな話です。
Sambaは、主にSMBクライアント/サーバー機能、およびドメインコントローラー機能を提供します。長く、SMB 1.0/CIFSおよびそれ以前のSMBクライアント/サーバー、Windows NT 4.0互換のドメインコントローラーとしての機能を提供してきましたが、2011年8月リリースのSamba 3.6でSMB 2.0への対応が実験的に追加されました。
また、2012年12月にリリースされたSamba 4からはSMB 2.1やSMB 3.0に正式に対応し、Windows Server 2008 R2互換のActive Directoryドメインサービスの提供が可能になるなど、Windows Vista以降のWindowsとの相互運用性が強化されています。本稿執筆時点(2015年2月12日)における、Sambaの安定版の最新バージョンは「4.1.16」です。
SambaはSMBクライアント機能(smbclientなど)も提供しますが、LinuxにはSMBクライアントのサポートがカーネルモジュール「cifs.ko」としてビルトインされています(「modinfo cifs」コマンドでバージョン情報を確認できます)。
「cifs.ko」という名称からはCIFSの実装が連想されますが、現在の「cifs.ko」はSMB 1.0/CIFSだけに対応したものではありません。Linuxのkernel 3.11までにSMB 2.1やSMB 3.0が実装されており、SMB 3.02についても最低限の実装が行われています。
LinuxやSambaのSMB対応の実装状況は、以下のドキュメント(英語)で確認できます。このドキュメントは、SMBの実装に新たな進捗があれば更新されるようです。
今回は「Ubuntu 14.10 Desktop」とWindows 8.1のコンピューター間で、SMBネゴシエーションの様子を調べてみます。Ubuntu 14.10は、Linux kernel 3.16(cifs.ko 2.03)がベースであり、Samba 4.1.11を搭載しています。いずれも、SMB 2.1およびSMB 3.0に対応したバージョンです。
まずは、UbuntuのSMBクライアント機能を使って、Windowsの共有フォルダーに接続してみます。
Ubuntu Desktop標準のファイルブラウザーである「ファイル」(Nautilus:Gnome File Manager)は「サーバーへ接続」ダイアログボックスを使用して、SMB、AFP(Apple Filing Protocol)、FTP(File Transfer Protocol)、WebDAV(Web-based Distributed Authoring and Versioning)など、さまざまな共有リソースに接続することができます。
Windowsの共有フォルダーへのSMB接続には「smb://<コンピューター名またはFQDN>/<共有名>」のアドレス指定による接続や、Windowsネットワークのブラウジングによる接続が可能です(画面1)。
以下の画面2は、Ubuntuの「サーバーへ接続」に「smb://<コンピューター名またはFQDN>/<共有名>」のアドレスを指定して、Windows 8.1のファイル共有に接続した際のSMBネゴシエート要求の最初のパケットです。
UbuntuのSMBクライアントは、MS-SMBのダイアレクトのみをサーバーに提示しています。次のSMBネゴシエート応答ではダイアレクト「NT LM 0.12」が選択され、SMB 1.0/CIFSによるSMBセッションのセットアップへ進んでいます。Windows PowerShellの「Get-SmbSession」コマンドレットも、SMBセッションがSMB 1.0/CIFSで接続されていることを示しています。
MS-SMBのダイアレクトとしては、Windows 8.1のSMBクライアントよりも多くのダイアレクトに対応しているのが分かります。「NT LM 0.12」以外は現在では使われることがない、非常に古いダイアレクトなので説明しませんが、興味のある方は以下の記事をご覧ください。
UbuntuのNautilusは、LinuxのカーネルモジュールのSMBクライアント機能(cifs.ko)ではなく、SambaのSMBクライアント機能(libsmbclient)を使用します。
実は、SMB 2.1やSMB 3.0に対応した最新のSamba 4.1でも、SMBクライアント機能に関しては既定でSMB 1.0/CIFS以前のプロトコルで動作します。SMB 2.1やSMB 3.0を利用できればWindowsとのファイルのやりとりがもっと高速になるはずなので、既定の動作のまま使用するのはもったいないですね。
SambaのSMBクライアント機能をSMB 2.1やSMB 3.0に対応させるには、「/etc/samba/smb.conf」ファイルの[global]セクションに「client max protocol =」の行を追加します。「client max protocol =」には「SMB3」「SMB2」「NT1」のいずれかを指定します。これらを指定することで、次のダイアレクトをネゴシエートするようになります。
NT LM 0.12までのMS-SMB | |
0x0202:SMB 2.0 | |
0x0210:SMB 2.1 | |
0x0222:SMB 2.2 (Windows 8ベータ版) |
|
0x0224:SMB 2.2 (Windows 8ベータ版) |
|
0x0300:SMB 3.0 | |
NT LM 0.12までのMS-SMB | |
0x0202:SMB 2.0 | |
0x0210:SMB 2.1 | |
NT LM 0.12までのMS-SMB | |
「SMB3」を指定したときにサポートされる「0x0222」および「0x0224」は、Windows 8の開発中に存在したダイアレクトです。SMB 3.0は途中までSMB 2.2として開発が行われていました。
「client max protocol = SMB3」を指定すれば、「サーバーへの接続」によるWindows 8.1の共有フォルダーへの接続は、MS-SMB2のネゴシエートにより、SMB 3.0を使用するようになります(画面3)。Samba 4.1はWindows 8.1のSMB 3.02に対応していないため、クライアントとサーバーで最上位のSMB 3.0が選択されます(画面4)。ちなみに、接続相手がWindows 7の共有フォルダーなら、SMB 2.1で接続されます。
「/etc/samba/smb.conf」ファイルの[global]セクションに追加された「client max protocol =」行は、Samba標準のSMBクライアントプログラムである「smbclient」を使用する場合にも有効です。「smbclinet」はUbuntuに既定ではインストールされませんが、「sudo apt-get install smbclient」のコマンドラインを実行することで簡単に追加できます。
なお、「smbclinet」を使用する場合は、「/etc/samba/smb.conf」ファイルに追記する代わりに、次のコマンドラインのように「-m」オプションに「client max protocol =」の値を指定することができます。「/etc/samba/smb.conf」ファイルと「-m」オプションのどちらも使用しない場合は、「NT1」が指定されたのと同じです。
smbclient //コンピューター名/共有名 -U ユーザー名 -m SMB3
Copyright © ITmedia, Inc. All Rights Reserved.