2015/01/20

cURL と SMB/CIFS

@IT さんの連載で SMB と CIFS の違いについて説明を試みています。今後の連載では、Windows で SMB 2/3 を無効にする方法や、SMB/CIFS と Linux、SMB/CIFS と Mac について説明していくつもりです。

ファイル共有プロトコル、SMBとCIFSの違いを正しく理解できていますか?(前編)
[URL] http://www.atmarkit.co.jp/ait/articles/1501/19/news092.html

以下の MS さんのブログを見ると、“CIFS-The ancient version of SMB that was part of Microsoft Windows NT 4.0 in 1996. SMB1 supersedes this version. ” “SMB 1.0 (or SMB1)-The version used in Windows 2000, Windows XP, Windows Server 2003 and Windows Server 2003 R2 ” と書いあります。これを見て ??? と感じた方は、@IT さんの私の記事を見てみてください。

Windows Server 2012 R2: Which version of the SMB protocol (SMB 1.0, SMB 2.0, SMB 2.1, SMB 3.0 or SMB 3.02) are you using?
[URL] http://blogs.technet.com/b/josebda/archive/2013/10/02/windows-server-2012-r2-which-version-of-the-smb-protocol-smb-1-0-smb-2-0-smb-2-1-smb-3-0-or-smb-3-02-you-are-using.aspx

ところで、今月、cURL の新バージョン 7.40.0 がリリースされました。cURL (カール)は、HTTP や HTTPS、FTP などのプロトコルでファイル転送を行うための、Linux や BSD ではお馴染みのコマンドライン ツールです。新バージョン 7.40.0 では、SMB/CIFS プロトコルのサポートが追加されたそうです。

cURL
[URL] http://curl.haxx.se/

openSUSE 13.2 で cURL 7.40.0 の smb:// への対応を確認しました。(Windows 版の cURL 7.40.0 だと、smb:// を使えないかも)


この cURL の SMB/CIFS プロトコルのサポートが言っている SMB/CIFS は何かというと、SMB ダイレクト NT LM 0.12 の SMB 1.0/CIFS のことでした。現在の SMB/CIFS の解釈に従った正しい表現です。以下のキャプチャを見るとわかるように、NT LM 0.12 より古いダイアレクトと、SMB 2.0 以降の新しいダイアレクトには対応していません。使用する TCP ポートは、Microsoft-DS (445/TCP) でした。


ソースコード (smb.c) を見ても、現時点では「NT LM 0.12」だけに対応していることがわかります。

static CURLcode smb_send_negotiate(struct connectdata *conn)
 {
   const char *msg = "\x00\x0c\x00\x02NT LM 0.12";
   return smb_send_message(conn, SMB_COM_NEGOTIATE, msg, 15);
 }


ソースコード (urldata.h) を見ると、NetBIOS Session (139/TCP) にも対応していないのがわかります。

#define PORT_SMB 445

cURL の TODO リスト を見ると、現在は、NTLMv1 にのみ対応し、NTLMv2 への対応は今後の予定だそうな。

追記)
Windows 版 (Win64 - Generic) の cURL 7.40.0 では smb:// を使えないようですが、Windows だと普通に SMB (SMB 1.0/CIFS より速い SMB 2.x 以降を含む) が使えるので、意図的に無効化されているのかもです。


2 件のコメント:

  1. 手前味噌ですが、記事に関連して Linux 用の LLMNR レスポンダーとして xllmnrd というものを作って公開しております。現在は AD 設定を有効にしていない Samba サーバーへの Windows からのアクセスが IPv4 から IPv6 になる程度の効果しかありませんが、もし機会があれば紹介していただけるとありがたいです。

    返信削除
  2. cURL の現時点での実装だとMicrosoft-DS(445/TCP) オンリーなので、NbNSは使えず、DNSによる名前解決またはIPアドレスの直接指定でないと smb:// は使えないということ。LLMNR が使えれるなら、ローカルのネットワーク内なら名前指定で接続 (IPv6) できそうですね。

    返信削除

注: コメントを投稿できるのは、このブログのメンバーだけです。