code up

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

USBプリンタにSSH経由で印刷を行う!

我が家(東京)のQNAP Turbo NAS TS-219P+にはUSBのプリンタ(EPSON PM-A840 マルチフォトカラリオ インクジェット複合機)が接続されている。

遠隔地(大阪)から、年賀状の表紙を印刷したかったのだが、残念ながらネットワークプリンタではないため、素直に9100番ポートでどうこうできない環境である。

同じLANの中にいる時は、Windows共有経由で印刷しているのでSSH経由でも印刷できるんじゃないの?ってことで印刷した結果のまとめ。

環境は

図で表すとこんな感じですが、ルーター等のネットワーク機器は省いてある。

本記事を書くにあたりCIFS-over-SSH for Windows Vista/7の手順を非常に参考にさせて頂いた。

上記記事では、Windowsファイル共有をSSHのポートフォワーディング機能の先にあるPCまで届くようにするための設定が書いてある。QNAPで共有されてるプリンタも同じようにいけるんじゃないの?ってアイデアです。

前提事項

QNAPのSSHポートをルーターで開けておいてDynamic DNSサービスでホスト名を登録後、PuTTYを使って公開鍵暗号による認証を経由してQNAPにアクセスでき、80/8080をポートフォワードしているのでQNAPのWeb管理画面にも入れる状態がスタート地点。

上記全ては必須ではなく、ID+パスワードでも構わないので遠隔地からSSHアクセスできていることが最低限必要な前提事項となる。

まずはLoopbackアダプタのドライバをインストールする

127.0.0.1でポートフォワーディングすれば良いかと最初は考えたが、CIFS-over-SSH for Windows Vista/7によるとうまくいかないそう。

さらにネットワークアダプタのうちひとつは『Microsoft ネットワーク用クライアント』に紐付いていなければならず、またポートフォワーディングするネットワークアダプタは『Microsoft ネットワーク用クライアント』に紐付いていてはいけない

したがって、ネットワークアダプタがふたつ以上ある場合は、どちらかのネットワークアダプタをポートフォワーディング用にすればいいが、そうでない場合はLookbackアダプタ(自分のPCに折り返すだけのダミーのPCネットワークアダプタ)で代用する。

まず、なんとかしてデバイスマネージャーを開く。私はスタート→コンピューター右クリック→管理でいつも開いている。

マシン名を右クリックしてレガシハードウェアの追加→次へ→一覧から選択したハードウェアをインストールする(詳細)→次へ→ネットワークアダプター→Microsoft Loopback Adapter→(省略)

Loopbackドライバのプロパティを開く。タスクトレイのネットワークアイコンを左クリック→ネットワークと共有センターを開く→アダプターの設定の変更→loopbackのネットワーク接続をダブルクリック。とかでたどり着く。

  • インターネット プロトコル バージョン 4(TCP/IPv4)のみにチェック。それ以外をチェックオフ
  • インターネット プロトコル バージョン 4(TCP/IPv4)をダブルクリックなどしてプロパティを開く
  • IPアドレス、サブネットマスクを指定(例: 10.255.255.1, 255.255.255.0)。普段から使用しているネットワークアドレスと異なるサブネットとなるようにした方がいいでしょう
  • 詳細設定を開き、インタフェースメトリックを9999にする
  • WINSで『NETBIOS over TCP/IP を無効にする』

上記設定を行うことにより139番ポート等の余計なポート待受がなくなる。

SMBドライバをどうにかする

Windowsファイル共有を行う場合、Vista以降のPCでは445ポートを利用する。しかしWindowsのシステムドライバによって勝手に全てのネットワークアダプタの445ポートを待受されてしまうため、通常のポートフォワードではうまくローカルポートにバインドできない。

このシステムドライバが、SMBドライバ[メッセージ指向 TCP/IP および TCP/IPv6 プロトコル (SMBセッション)]なので、SMBドライバを自動起動とはせず、portproxyのルール(ローカル内のポート番号のトンネルみたいなもの)で445ポートを握らせた後に、このドライバを起動するよう遅延させる。* 接続する端末にアクセスがあった場合でもそのPCの共有フォルダは表示される。

まずは管理者権限でコマンドプロンプトを実行。

としてSMBドライバの実行を"要求"に変更した後、

としてportproxyのルールを作成する。

として上記で設定したportproxyのルールが表示されればOKだ。

この設定を戻したい場合は

とする。start= demandの時もそうだが、"="の後にスペースが必要なので注意。

この設定により、10:255.255.1:445で待受けるが、接続があった場合には自動的に10.255.255.1:44445に接続をプロキシするようになる。

タスクスケジューラーでsmbドライバを起動する

smbドライバを自動的に起動しなくしてしまったので、タスクスケジューラで管理者権限で起動するように設定する。これはプログラムをスタートアップ時に管理者権限で実行したい場合に行うテクニックと同様である。

  • タスクスケジューラを起動
  • 基本タスクの作成
  • 名前は適当に『Start SMB driver』とか
  • トリガーにログオン時
  • 操作でプログラムの開始
  • プログラム/スクリプトにC:\Windows\System32\net.exe。引数の追加にstart smb
  • [完了]をクリックしたときに、このタスクの[プロパティ]ダイアログを開く。にチェックして完了
  • 全般で、ユーザーがログオンしているかどうかにかかわらず実行する。にチェックを入れ、パスワードを保存しない。にもチェックを入れる。そして最上位の特権で実行する。にチェック
  • トリガーで、ログオン時の部分を編集し、『任意のユーザー』に変える
  • 条件で、すべてのチェックをはずす
  • OKを押して保存する

さてリブート

PCを再起動して、設定がうまくできたか確認する。

コマンドプロンプトを起動して『sc query smb』と入力してSTATEがRUNNINGとなっていればよい。なってなければタスクスケジューラでエラーが出ていないか確認しよう。

次にコマンドプロンプトで『netstat -an | find ":445 "』と入力して、

TCP    10.255.255.1:445       0.0.0.0:0              LISTENING

と出ていればOK。0.0.0.0:445となっている場合はportproxyがうまく適用できていない。私の場合『IP Helper』サービスを最初無効にしていた時は失敗していた。『自動』に戻して再度再起動したらうまくできた。

PuTTYでフォワーディング

源ポートを10.255.255.1:44445、送り先を192.168.2.3:445としてトンネルを作成する。192.168.2.3はQNAPのローカルIPである。

これでWindows共有まで

Windowsファイル共有まではこれでできるようになった。エクスプローラー等で\\10.255.255.1にアクセスすると共有フォルダおよびプリンタが見えるようになった。

じゃプリンタのアイコンをダブルクリックで、、、、と思ったら

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

Google先生に聞くと、ホスト名でアクセスしている場合やプリンタドライバの問題とかが出てくる。でもどれも該当しなそうな感じ。

結局、共有フォルダと同じ考えでプリンタ名をローカルにマッピングすることでうまく印刷ができた。UNC パスでアクセスできないのか、トンネルするポートが足りないのか、QNAP側からの通信があるのか、辺りが原因な気がするがそれ以上は追求せず。

パスワードと/user:adminは不要かも。

これによりLPT1:がSSHの先のUSBプリンタにマッピングされたので、LPT1ポートにあるプリンタとしてプリンタを追加すればよい。

もちろん印刷する時にはPuTTYでトンネルを張っておかなければならない。

接続する端末のファイアウォールをオフにしてあったのと、ポートフォワーディングで631 IPP(Internet Printing Protocol)もトンネルしていたが、いろいろ試しながらやっていたので、これらはなくても大丈夫そう。

関連記事
タグ:Windows SSH QNAP
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。