サブネットを超えたWindowsのプリンタ共有

目的

論理的に離れた場所にあるWindows7マシンのプリンタを、Windowsのプリンタ共有を用いて使用する。

要約

445/tcpを転送し、名前解決を図ることで利用可能になる。

構成

[プリンタ]
  |
 USB
  |
[Win7 A]         [踏み台 B]
  |                   |
--+---+---(LAN)-------+-----
      |
   [ルータ等]
      |
--+---+---(LAN)-------------
  |
[Win7 C]

ゴール

CからAに繋がれたプリンタを使用出来ること。

必要なポート転送

もちろん445/tcpのみである。
マシンCから踏み台Bにsshする時に、マシンAの445/tcp宛のトンネルを作っておけばよい。

名前解決

\\[トンネル元IPアドレス]で接続すれば、ファイル共有は使用でき、プリンタ一覧も見ることができる。
しかし実際に使用しようとすると、

操作を完了できませんでした (エラー 0x00000709)。プリンター名を再度チェックして、プリンターがネットワークに接続されていることを確認してください。

というエラーで困ることになる。これを解決するのは単純で名前を強制的に解決してやればよい。

> emacs -nw C:\Windows\System32\drivers\etc\hosts
[IP] [Win7 Aの名前]

※もちろんadministrator権限が必要

以上で使用可能になる。

補足

結論から言って、今回の記事にこの章は不要な部分であるが、メモのために記す。

Windowsが使用するポート

Windowsにファイルやプリンタ共有などをよしなに行ってもらうためには、少なくとも公式には、次のようなポートが通信可能であることが求められている。
このうちいくつかは``おしゃべりなポート''として知っている方も多いはず。windows.microsoft.com
いくつかのリストが示されているが、Windows7に限定すると必要なのは以下のポート群である。

  • TCP 139, 445, 2869, 3587, 5357, 5358
  • UDP 137, 138, 1900, 3540, 3702, 5355

UDPのトンネリング

SSHのLocalForwardではTCP通信しか扱えないため、UDPの転送は行えない。しかしstoneを用いてUDPTCPでくるめば実現出来る。
つまり全てTCPにすればSSHトンネリング可能になるという算段であった。
stoneはapt等で導入出来る。
UDPからTCPへの変換時は

> stone -n localhost:10137 localhost:137/udp

等で設定する。