WindowsNTのサービスを使ったeWnn、翻訳魂サーバへのTCPトンネル  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ver 0.1 2001/01/01 ver 0.0 2000/11/07 江端智一 E-mail:See http://www.kobore.net/mailAddress.gif http://www.kobore.net/  言うまでもありませんが、本文章は 無保証です。この文章の影響によりどの ような事が起ころうとも当方は一切の責任を持ちません。  本文章は、「WindowsNTで、eWnnサーバと翻訳魂サーバを立ち上げよう」の 後に読まれる事をお勧めします。 0.変更履歴  ̄ ̄ ̄ ̄ ̄ ver 0.1 2001/01/01 TCPTunnel for NT Serviceを使った方法を追加 ver 0.0 2000/11/07  初版 1.目的  ̄ ̄ ̄ 本文章は、WindowsNTのサービスを利用して、eWnn、翻訳魂サーバが起動し ているLinuxへTCPのトンネリングをする方法について述べます。 なんで、そんな訳の分からんことをしなければならないかについては、 「WindowsNTで、eWnnサーバと翻訳魂サーバを立ち上げよう」を御一読下さい。 2.WindowsNTの「サービス」とは  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ マイクロソフト社というところは、既に実現している機能に、別の名前に付 けかえて、技術者達を混乱させることにおいては、右に出るもののない会社で す。 マイクロソフト社の発明した「言葉」で、どれほど私が無駄な時間を使わさ れたことか知れません。 WindowsNTの「サービス」とは、要するに「デーモン」です。 システムが起動したときに、自動的にスタートし、その後も誰がログインし ていようとバックグランド処理として動作を続けるプロセスのことです。 UNIXなら、適当な実行ファイルを、システム起動時に、適当な権限で実行さ せて、放っておけばデーモンとして動きますが、NTは「デーモン」、いや、も とい、「サービス」専用のプログラミングをしないと動かないんです。 面倒くさいです。 3.背景  ̄ ̄ ̄ 「WindowsNTで、eWnnサーバと翻訳魂サーバを立ち上げよう」の、補遺「IP アドレスを一つしか貰えない貴方の為に」で述べているように、WindowsNT用 のIPアドレス1つだけで、「翻訳魂」や「eWnn」のサービスを提供できるよう にはなったのですが、問題が一つありました。 ----- 私がNTにログインしていない時には、誰も「翻訳魂」や「eWnn」を使 えない ----- まさか、プロジェクトメンバー全員が出社する前に出社し、プロジェクトメ ンバー全員が退社してから退社するなんて生活を、毎日続けられる訳ありませ ん。 そういう訳で、Windows NTの「デーモン」、いや、もとい、「サービス」を 検討し始めた訳です。 4.VMwareをNTのサービスにできたらなあ・・・  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ VMwareは、WindowsNTの中で、複数のOSを同時に使える仮想マシン(Virtual Machine)です。 詳しくは、 http://www.kobore.net/VMware.txt を御一読下さい。 VMwareは、NTにログインしてから、NTのアプリケーションの一つとして起動 しますので、ログインしていない時は、VMwareのLinuxのサービスを使うこと はできません。 もし、VMwareをNTのサービスにできたら、NTマシンそれ自身を終日運転の本 物のLinux Boxとすることが可能になります。 後で詳しく述べますが、exeをNTサービスとして常駐させるプログラムを作っ て、vmware.exeをNTサービスとして常駐させることまでは成功したのですが、 いざ、VMwareにpingを打ってみても、全く返事が帰ってきません。 # この実験に成功した人がいたら、*是非とも*御連絡下さい。 と言う訳で、VMwareの常駐は諦めて、別の方法を考えることにしました。 5.システム構成  ̄ ̄ ̄ ̄ ̄ ̄ ̄ 「掟破り」もいいとこなんですが、私は会社から供与されているNTマシンに、 BEST BUYで買ってきた $24のイーサネットのNICを差し込み、その先に日本か ら持ちこんだLinux Boxを繋ぎました。 要するに、NTマシンでNIC2枚差しを行います。 192.168.1.2 10BASE-T 192.168.1.1 +-----------+ クロスケーブル +--------+ | ===== ---------------------- ===== | eWnn | NT | | Linux | 翻訳魂 | (zen2) ===== ---+ |(erukan)|Installed +-----------+ | +--------+ 133.144.10.10| | 社内ネットワークへ NTマシン(zen2)の2枚目のカードの認識が完了したら、NTマシン(zen2)と Linux Box(erukan)の間は、クロスケーブルで繋ぎ、相互にpingを放って、接 続を確認して下さい。勿論、Hubを介してストレートケーブルを使っても構い ません。 なお、2枚目のNICとLinux BoxのIPアドレスは、適当なプライベートアドレ スを使うと良いでしょう。(ここでは、192.168.1.1, 192.168.1.2を利用) 6.TCPトンネルのテスト  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ このシステムでは、zen2の社内ネットワーク用のNIC(133.144.10.10)に届い たeWnn、翻訳魂のパケットを、erukanにTCPトンネルで送り込むことで、いか にもNTマシンであるzen2自身が、eWnn、翻訳魂のサービスをしているように見 せます。 このTCPトンネルをNTサービスにする前に、TCPトンネルで実際にeWnn、翻訳 魂のサービスが稼働できるかどうかを確かめます。 zen2に届いた「翻訳魂」や「eWnn」のTCPのパケットを、erukanに渡す(トン ネルさせて)手段の一つとして、Rubyを使ってTCPのトンネルを実現する、 "tcptunnel"(立石さん(Takaaki Tateishi)作) を使わせて頂くことにします。 テストした環境は以下のとおり - 英語版WindowsNT4.0 SP5 - Ruby 1.4.2 NT側のPort(2744,2674)が、未使用であることを確認した後、コマンドプロ ンプトから、 (翻訳魂の場合) tcptunnel -P 2744 -h "192.168.1.1" -p 2744 -a "*.*.*.*" ^ ^ ^ | | | 翻訳魂の Linux(VMware上) 翻訳魂の ポート番号 のIPアドレス ポート番号 (NT側) (Linux側) (eWnnの場合) tcptunnel -P 2674 -h "192.168.1.1" -p 2674 -a "*.*.*.*" と入力して下さい。 これで、zen2のポート番号2744,2674のTCPのコネクションは、erukanポート 番号2744,2674にトンネルされるようになります。 翻訳魂クライアントWinHon,及びeWnnクライアントWineWnnなどで、zen2をサー バ名として入力して、TCPトンネルが成功しているかどうかを確認して下さい。 (Rubyの実行速度の関係上、コネクション確立までには、1分程度かかるようで すが、その後の実行速度には問題ありません。) 7.TCPトンネルをNTサービスに  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ さて、上記の実験環境では、ユーザがNTからログアウトしてしまうと、 tcptunnelも使えなくなってしまいます。 そこで、このtcptunnnelをNTサービスにしてしまいます。 (Step.0) 準備するもの ここまで読んで頂いた挙句、申し訳ないのですが、この"NTサービス"用のプ ログラムは、 「Win32システムサービスプログラミング」 プレンティスホール出版 ISBNコード: 4-88735-030-9 のサンプルプログラムを、一部変更、あるいはそのまま使うことにします。 しかし、サンプルプログラムをそのまま掲載するのは、まずいような気がす るので、手順だけ公開することにします。 でも、この本、本当に良い本なんです。 Win32のプログラミングは、この一冊だけで十分事足りるという名著中の名 著です。騙されたと思って購入してください。 それと、オブジェクト指向スクリプト言語Ruby http://www.ruby-lang.org/ja/ "tcptunnel"(立石さん(Takaaki Tateishi)作) http://kt-www.jaist.ac.jp:8000/~ttate/ftp/tcptunnel-990413.tar.gz が必要になります。 (Step.1) サービスプログラムの成作 さて、最初にNTサービスのプログラムを作成します。 ここでは、「翻訳魂」のサービスのプログラムの作成手順を説明し、eWnnの 手順は省略します。 「Win32システムサービスプログラミング」の付録CD-ROMのCH9のホルダに入っ ている"Beepserv.cpp"の一部を変更します。 (1)インクルードファイルの削除(特に必要ないですが) //#include (2)SERVICE_NAMEの変更 char *SERVICE_NAME = "honyakuTunnelService"; (3)ServiceThreadファンクションの変更 そっくり、下記のコードと入れ換えて下さい。 DWORD ServiceThread(LPDWORD param) { STARTUPINFO si; GetStartupInfo(&si); CreateProcess(NULL, "c:\\ruby\\ruby c:\\bin\\tcptunnel\\tcptunnel -P 2674 -h 192.168.0.1 -p 2674 -a *.*.*.*", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si,&pi); return 0; } "c:\\ruby\\ruby c:\\bin\\tcptunnel\\tcptunnel -P 2674 -h 192.168.0.1 -p 2674 -a *.*.*.*", の部分は、Rubyのパスやtcptunnelのパス位置に合せて変更して下さい。 本当は、もっと変更(主にコメントアウト)するところもあるのでしょうが、 とりあえずこれでO.K.です。 このファイルを、"HonyakuTunnel.cpp"などの名前に変更して、VC++でコンパ イル&リンクします。Project名は"HonyakuTunnel"など。Projectの種類は "Win32 Console Application"でいいと思います。 次に、付録CD-ROMのCH9のホルダに入っている"install.cpp","remove.cpp" を全く変更しないで、VC++でコンパイル&リンクします。 できあがった、EXEファイル(HonyakuTunnel.exe, Install.exe, Remove.exe) を適当なディレクトリに放り込みます。 (Step.2) サービスのインストールと起動 最初に、上記のInstall.exeを使って、サービスをインストールします。 コマンドプロンプトから、 install "Honyaku_Tunnel_srv" "HonyakuTunnel" c:\bin\HonyakuTunnel.exe" と入力します。 コントロールパネル -> サービスの中に、"HonyakuTunnel"なるサービスが 登録されているはずです。これを選択して、開始ボタンを押して下さい。 (Step.3) サービスのテスト 例えば、 http://www.kobore.net/omron/omron.html#WinHon から、適当なローカルマシンに"WinHon.exe"をダウンロードして、WinHonを 起動した後、サーバとして上記のサービスが起動しているNTマシン(Linux Box ではなくて)のマシン名(ここでは、zen2)か、あるいはIPアドレス(ここでは、 133.144.10.10)を入力してください。 これで、ダイアログが開いたら、テストは成功です。 但し、tcptunnelの最初のコネクション確立に時間がかかります(1分程度)の で、ゆっくり待ってください。 (Step.4) (必要なら)サービスのアンインストール サービスのアンインストールの方法は以下の通りです。 コマンドプロンプトから、 remove "Honyaku_Tunnel_srv" と入力した後、コントロールパネル -> サービスの中から、 "HonyakuTunnel"が消えていることを確認して下さい。 8."TCPTunnel for NT Service" を使う  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ Rubyのインストールが面倒だ、という方の為に、 "TCPTunnel for NT Service" http://www.kobore.net/soft/soft.html#TCPTunnel なるものを作りました。 使用方法は、 「TCPTunnel for Win32 の使い方」 http://www.kobore.net/tcptunnel2.txt を御参照下さい。 9. 最後に  ̄ ̄ ̄ ̄ ̄ この文章は、単に、WindowsNTのサービスを使ったeWnn、翻訳魂サーバへの TCPトンネルを実現する方法を述べただけでなく、 - NTのバックエンドとしてLinuxを使う方法 - スクリプト言語をNTのサービスとして使う方法 について説明することができたと思います。 色々な環境で試してみてください。 立石さん(Takaaki Tateishi)の"tcptunnel"が非常に安 定しており、大変満足しております。 また、「TCPTunnel for Win32」の方も、ご愛用頂きたく、宜しくお願いします。