連載
» 2015年02月13日 18時00分 UPDATE

その知識、ホントに正しい? Windowsにまつわる都市伝説(25):Linuxはサンバ(Samba)で踊る――WindowsとLinuxのファイル共有のいま (1/2)

前回は、ネットワーク上を流れるパケットをキャプチャすることで、同じまたは異なるバージョンのWindows間のSMBネゴシエーションの様子を明らかにしました。今回は、同じ方法でWindowsとLinux間のSMBファイル共有の様子をのぞいてみましょう。

[山市良,テクニカルライター]
「Windowsにまつわる都市伝説」のインデックス

連載目次

LinuxにおけるMS-SMB2(SMB2/SMB3)への対応は着々と

 前回(ファイル共有プロトコル、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プロジェクト

 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」です。

LinuxカーネルのSMB対応

 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標準の「ファイル」でWindowsに接続

 今回は「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)。

画面1 画面1 Ubuntu標準の「ファイル」(Nautilus)の「サーバーへ接続」を使用して、Windowsの共有フォルダーに接続する

 以下の画面2は、Ubuntuの「サーバーへ接続」に「smb://<コンピューター名またはFQDN>/<共有名>」のアドレスを指定して、Windows 8.1のファイル共有に接続した際のSMBネゴシエート要求の最初のパケットです。

画面2 画面2 Ubuntu標準の「サーバーへ接続」を使用したSMB接続は、既定の状態ではSMB 2.0(0x0202)以降のダイアレクトはネゴシエートせず、SMB 1.0/CIFS(NT LM 0.12)が選択される

 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」のいずれかを指定します。これらを指定することで、次のダイアレクトをネゴシエートするようになります。

・「SMB3」を指定した場合
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

・「SMB2」を指定した場合
NT LM 0.12までのMS-SMB
0x0202:SMB 2.0
0x0210:SMB 2.1

・「NT1」を指定した場合
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で接続されます。

画面3 画面3 「/etc/samba/smb.conf」ファイルの[global]セクションに「client max protocol = SMB3」を追加すると、MS-SMB2のダイアレクトSMB 2.0(0x0202)〜SMB 3.0(0x0300)をネゴシエートするようになる
画面4 画面4 MS-SMBのSMBネゴシエート要求でSMB 2.0以降への対応(SMB 2.002およびSMB 2.???)が提示されるため、MS-SMB2のSMBネゴシエートに切り替わり、最終的にSMB 3.0(0x0300)が選択される

 「/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


       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。