2009/10/11(Sun)SMB over The Internet ~遠隔地とWindowsファイル共有~

2009/10/11 9:55 Software::Windows
今回の記事は、ネット越しにWindowsファイル共有を安全にやる方法を紹介する。
Windowsファイル共有のプロトコルは、SMB(Server Message Block)を使っているが、Linuxでもこれに対応するためにSambaというソフトウェアがあり、smbdと、nmbd(NetBIOS用の名前解決サービス)から成る。

基本的にこの手の共有は、LAN内で閉じて使わなければ攻撃に悪用されることが多いので、ほとんどのファイアウォール製品でInboundがブロックされていると思うが、これらにsshのローカルフォワード機能を組み合わせることにより、安全にWindowsファイル共有をインターネット越しに使う事が出来る。

ただし、最初に断っておくが、SMBはChattyなプロトコル*1なので、インターネット越しでは遅いことに注意。

*1 : 頻繁にメッセージをやりとりするおしゃべりなプロトコル

前提環境

接続先のWindowsPC(もしくはSMBプロトコルをしゃべるSambaサーバなど)が、グローバルアドレスを持ったSSHサーバから到達可能なLAN内に居ること。
smb_over_internet1.png


このようにSSHサーバが内側にしか居ない場合でも、ルータからNAPTが設定されていれば利用可能。
smb_over_internet2.png

準備

ポートフォワードを使用する際には、相手側のサービスポートをローカル側の任意の空きポートに割り当てればよいが、あいにくWindowsファイル共有は、137-139,445といった決まったポートでしか通信ができないので、自インタフェースのサービスポートとぶつからない、仮想インターフェースを用意し、そこにフォワードさせる方法をとる。
  1. コントロールパネルから、「ハードウェアの追加」を開く。
  2. 「はい、ハードウェアを接続しています」を選んで次へ。
  3. 一番下の「新しいハードウェア デバイスの追加」を選んで次へ。
  4. 「一覧から選択したハードウェアをインストールする(詳細)」を選んで次へ。
  5. 「ネットワーク アダプタ」を選んで次へ。
  6. 製造元がMicrosoftの「Microsoft Loopback Adapter」を選んで次へ。最後に完了。

仮想NICの設定

先ほど追加したインタフェースが、ネットワーク接続の中に「ローカル エリア接続 2」などとして追加されているはずなので、それのプロパティを開き、設定する。
  1. 「Microsoft ネットワーク用ファイルとプリンタ共有」のチェックを外す
  2. 「インターネット プロトコル (TCP/IP)」のプロパティを開き、リンクローカルアドレスなどのIPアドレス(169.254.0.0/16)を設定。デフォルトゲートウェイとDNSは未設定。
    smb_over_internet3.png
  3. さらに「詳細設定」の「WINS」タブで「NetBIOS over TCP/IP を無効にする」を選択する。*2
  4. あとはOKを選択して全て閉じる。
※TCP/IPの「IP設定」タブで複数のIPアドレスを設定しておくと、複数拠点とSMB通信できる。逆に言うと、一つの接続拠点に対して一つのIPアドレス設定が必要になる。

*2 : ちなみにSMB over The Internetでは、NetBIOSによる名前解決はできない。何故かというと、ブロードキャストが相手側ネットワークに届かないからである。それでも名前でアクセスしたい場合は、ローカルのHOSTSファイルに書いておく。

ポートフォワードの設定

PuTTYやそれに付属しているpfwd等を使って、SSHサーバから見た接続先のファイルサーバーのローカルIPアドレスの139番と、先ほどの仮想NICの139番を連結する。
大切なのは、ローカル側の全てのインターフェースの139番ではなく、仮想NICのみの139番にバインドすることである。(そうしないと、自ネットワークのSMBが使えない)

pfwdを使う場合、例えばこのような記述をpfwd.iniに書く。
[SSH]
Host=SSHサーバを指定
Port=22
Compression=1
ProtocolVersion=2
PrivateKey=鍵ファイル(*.ppk)を設定
User=ユーザ名
Password=

[FORWARD]
01=L169.254.20.1:139:192.168.1.20:139
PuTTYで設定する場合は、このように「源ポート」に「IPアドレス:ポート」と書くことにより、特定IPアドレスに対してのみバインドすることが可能。
smb_over_internet4.png


接続

先ほど作成したSSHの設定を使ってPuTTYなりpfwdなりを起動させ、後は、仮想NICに指定したIPアドレスを開くだけ(\\169.254.20.1\share)で、目的のサーバに接続することができる。認証もバッチリ。
さらにHOSTSファイル(C:\Windows\System32\drivers\etc\hosts)に仮想NICのIPと名前の対応を書いておけば、名前で(\\file-server\shareのような)アクセス可能。

参考文献

SSHポートフォワーディング - BOMBZINE KITTEN
Grid Datafarm: Gfarm over SMB over SSH [Japanese]

メモ:Vista以降~ 2010/06/05

どうやらlocalhost:445のlistenに制限がかかった模様なので以下のような対策を増やす必要があるらしい。(未検証)
Vista で SMB over SSH - 勝川俊雄 公式サイト