IP マスカレード もどき Pseud IP Masquerade on Win32 http://www.kobore.net/soft/pipmasq/pseud-ip-masquerade-jp.txt ver 0.40 2001/03/23 ver 0.32 2001/12/11 ver 0.31 2001/12/06 ver 0.3 2001/11/21 ver 0.2 2001/11/20 ver 0.0 2001/11/01 江端智一 E-mail:See http://www.kobore.net/mailAddress.gif http://www.kobore.net/ ===================================================================== お願い!! もし、WinSockに、この特定ポート(例えば60000番以上)へのTCPコネクショ ンを、*完全に無視させる* 方法を御存知の方がいらっしゃいましたら、どう か御連絡下さい。 Pseud IP Masquerade on Win32(IPマスカレードもどき) から、"Pseud(もど き)" を 取り除いて、世界中の皆さんのお役に立てるものを、リリースさせて 頂く所存でございます。 ===================================================================== This product includes software developed by the Politecnico di Torino, and its contributors. 本ソフトウェア「Pseud IP Masquerade on Win32」は、 イタリア トリノ工科大学で開発された "WinPcap: the Free Packet Capture Architecture for Windows" http://netgroup-serv.polito.it/winpcap/ を使用しております。 WinPcapの開発に携わった全ての皆様に、心より感謝申しあげます。 変更履歴 ver 0.40 2002/03/23 DHCPでIPアドレスを取得した場合、NICの情報が取得できないと言う 問題に対処 DHCPでPSEUD IPを取得可能とした pipmasq.cfgの内容を変更した ----- ver 0.40 2002/03/23 DHCPでIPアドレスを取得した場合、NICの情報が取得できないと言う 問題に対処 DHCPでPSEUD IPを取得可能とした pipmasq.cfgの内容を変更した ----- ver 0.32 2001/12/11 北脇 淳 氏による、2重起動防止、Windowsの強制終了ボタンの disableパッチの採用 マスカレードポートの再利用ができないバグを修正 ver 0.31 2001/12/07 北脇 淳 氏による、エクスパイア時間順序のテーブルエントリ表示の パッチ(tablemgr.cpp)を採用 ver 0.3 2001/11/21 FTP(active mode)の使用可能 ver 0.2 2001/11/20 不正なMAC Addressがパケットに添付されるバグを修正 ver 0.0 2001/11/01 初版 目次 1. ライセンス 2. 動機と背景 2.1 IPマスカレードとは何か 2.2 TCPTunnelによる対処 2.3 Windowsで動くIP Masqueradeはどこに? 2.4 WinPcapの登場 2.5 次から次への難問直面 2.6 Nimda、TCPTunnelを攻撃! 2.7 黙れ! WinSock!! 2.8 命名 2.9 完成! 3. Pseud IP Masquerade on Win32の内部構成 4. Pseud IP Masquerade on Win32 の想定するネットワーク構成例 4.1 全体構成とコンフィギュレーションファイルの内容 4.2 プライベートネットワーク上のホストのネットワークの設定 5. Pseud IP Masquerade on Win32 の使い方 5.1 NTサービス版 5.2 実行形式(exe)版 5.3 フロッピーディスク版 6. ユーザインターフェース 7. 現在のPIPMasqに「できること」と「(これから)したいこと」 7.1 できること 7.2 (これから)したいこと 8. 謝辞 9. 参考文献 1. ライセンス Copyright (c) 2001,2002,2003,2004,2005 Tomoichi Ebata. All rights reserved. 本ソフトウェア "Pseud IP Masquerade on Win32" はフリーソフトウェアで す。 あなたは、Free Software Foundation が公表した GNU General Public License(GNU 一般公有使用許諾) バージョン 2 (日本語訳) あるいはそれ以降 の各バージョンの中からいずれかを選択し、そのバージョンが定める条項に従っ て本プログラムを 再頒布または変更することができます。 本ソフトウェア "Pseud IP Masquerade on Win32" の頒布にあたっては、 市場性及び特定目的適合性についての暗黙の保証を含めて、いかなる保証も行 ないません。 詳細については GNU General Public License をお読みください。 2. 動機と背景 2.1 IPマスカレードとは何か IPマスカレードは、Linuxにおける、最も優れたネットワーキング機能の一 つで、プライベートネットワークに接続された全部のマシンの通信処理を、IPマ スカレードが塔載されたたった一台のマシンに代表させることによって、その 全てのローカルマシンの全てを、インターネットに接続させることを可能とさ せるものです。 例を上げて説明しますと、ある会社の従業員が1000人いたとします。 この全ての従業員のパソコンに、公式のIPアドレスを付与させると、1000個 のIPアドレスが必要になります。 IPアドレスの枯渇が時間の問題とされている昨今、こんな贅沢なIPアドレス の使い方ができる訳ありません 最近は、公式のIPアドレスを、たった一個貰うのさえ、結構なコストと時間 ががかかります。 しかし、IPマスカレードは、たった1個の公式IPアドレスで、この1000台の パソコンの代りをします。 1000台のパソコンは、プライベートのIPアドレス(あるいは、適当なIPアド レス)を付与して運用します。 プライベートなネットワークの中では、どんなIPアドレスを使おうとも、誰 にも迷惑をかけないからです。 しかし、このままでは、その1000台のパソコンは、一台もインターネットの サービス(Web、メール等)を使うことができません。 そこで、この1000台の中の一台のパソコンからIPパケットが、インターネッ トに出て行く時に、IPマスカレードのホスト(以後、「IPマスカレードホスト」 と称す)を通過させるようにします。 この時、IPマスカレードホストは、プライベートのIPアドレスを、IPマス カレードホストの公式IPアドレスにすり替えます。 そして、IPマスカレードホストは、リプライとして戻ってきたIPアドレスを、 元のプライベートなIPアドレスに戻して、送信元のパソコンに戻します。 このようにすることによって、1000台のパソコンは、たった一つの公式IPア ドレスを使い回すことができ、ローカルなネットワークに繋がるマシンを1000 台から2000台、3000台へと、簡単に増やすことができる訳です。 ・・・と、これは表向きの、IPマスカレードの説明です。 私が、IPマスカレードの機能を欲しかった理由は、別にあります。 2.2 TCPTunnelによる対処 192.168.0.9 +--------+ +----------- ===== | Visual | | WinNT | Studio | |(zenzen)| | +--------+ | 192.168.0.1 | 192.168.0.8 +-----------+ +---+--+ +--------+ | ===== ------| HUB |-------- ===== | eWnn | NT | +------+ | Linux | 翻訳魂 | (zen2) ===== ---+ 10BaseT |(erukan)| +-----------+ | +--------+ 133.144.10.10| | 社内ネットワークへ | 図1 HP社における江端のマシン環境 図1を見て頂くと解るように、私は、3台のマシンを駆使して仕事をしていま すが、実は、HP社より貸与されたマシンは、実はNT(zen2)マシンただ一台で、 Linux Box(erukan)、と ノートPCのNT Box(zenzen)は、日本から持ちこんだマ シンで、 HP社は、その存在を知らない と言うところが、ポイントです。 HP社内で、秘密のサーバ群(eWnnと翻訳魂)を使う為に、 TCPTunnel for Win32 http://www.kobore.net/soft/tcptunnel/tcptunnel2.txt を作成しました。 これによって、江端のローカルネットワークのマシン環境の中で稼働してい るLinux Boxのサービスを、HPのネットワークから利用できるようになりまし た。 ところが、このTCPTunnelでは、ローカルネットにあるホストを、「サーバ」 として使えても、「クライアント」として使うことができませんでした。 「クライアント」として使う為には、Webサーバや、メールサーバの方向を 社内ネットワーク側のサーバに設定しなければならず、おまけに特定のサービ スしか使えないことになりますが、やむを得ませんでした。 2.3 Windows NTで動くIP Masqueradeはどこに? 要するに、私の目的は、図1の私のローカルネットワーク環境のマシン群か ら、社内ネットワークとインターネットにアクセスすることにありましたので、 私は、これらのソフトウェアの調査を始めました。 http://www.linux.or.jp/JF/JFdocs/IP-Masquerade-7.html の「7.41 IP マスカレードが動作してくれません! Windows プラットフォー ム上での選択肢はありますか?」に幾つかの製品の紹介がありましたが、決め 手に欠けていました。 それは、 - 独自プロトコルを採用しているものは使いたくない 障害発生時に、私は直接ネットワークパケットを見て調べる からです。 - ポートフォワード方式のものは使いたくない 特定サービスに限定されたくないからです。 研究所では、適当なポートを使って、さまざまな実験をしま すので、ポート番号が固定されるようなものでは困るのです。 その他、優先度は落ちていきますが - クライアント数が限定されているものでは、実験環境の拡張ができ ず、使いものにならないし、 - NT Serverなんぞを前提としているなど、問題外でした。 無料か有料かは、どうでもよかったのですが、やっぱりソースコードが公開 されているものを使用したかったのです。 それは、IPマスカレードの動作原理を知りたかったことと、可能ならデバッ クや改造をやってみたいと思っていたからです。 これら上記の厳しい条件を通過したソフトウェアは、一つもありませんでし た。 2.4 WinPcapの登場 "WinPcap: the Free Packet Capture Architecture for Windows" http://netgroup-serv.polito.it/winpcap/ は、 「WindowsNTで、フリーのネットワークアナライザ(etherreal)を使おう」 http://www.kobore.net/ethereal.txt の、etherealで使用されている、パケットキャプチャライブラリです。 これが、ただのパケットキャプチャライブラリであったのなら何も起こらな かったと思いますが、WinPcapは、生のパケット(ロウパケット)の発射を可能 とする機能とAPIを実装していました。 つまり、ネットワークレベルで捕まえたパケットの内容を変更して、再びネッ トワークに流し出すことが可能であると言うことです。 これを使えば、Windows のアプリケーションとして、「IPマスカレードもど き」を使えるのではないか、と思い出したのが、数ヶ月前のことでした。 2.5 次から次への難問直面 当初、TCPTunnelの拡張で済むだろう、と言う見通しを持っていたのですが、 実装検討を始めると、これがアメリカのケーキよりも甘い見通しであったこと が判ってきたのです。 『これは、TCP/IPを実装するようなものだ・・・』 WinsockのARPテーブルを使いたくとも、Socket API以外の(IPやARPより下のプ ロトコルの)APIを、マイクロソフトが開示する訳ない。 となれば、ARPのAPIを自分で開発するしかない。 てな理由で、作ってしまったのが、これ。 http://www.kobore.net/soft/soft.html#WinPcapArp WinPcapのAPIの使い方も、英語の使用書と闘いながら、30くらいのサンプル プログラムを作成して、テストを繰り返しました。 コンソールから"ifconfig"と打ち込むだけで得られる自分のイーサネットカー ドのMACアドレスを、プログラムから取得するのが、こんなに難しいとは思い ませんでした。 この後、オブジェクトデザインを始めたのですが、これが非常に大変で、結 局、オブジェクトの変更を3回行い、この出戻りだけで2ヶ月が潰れました。 (しかし、このデザインフェーズの苦労は、後ほど報われることになります) 何より資料がないのが、大問題でした。 ネットワークプログラムと言えば、世の中の99.9999%(多分それ以上)は、ソ ケットを使ったプログラムを指し、ロウソケットを前提としたARPやICMPの実 装方法なんぞ、どこにも書いてありません。 技術的に特に困ったのが、チェックサムの計算方法でした。 基本的な仕組は判ったのですが、UDPやTCPでは、具体的にどうしたら良いの か、全く別りませんでした。 サーチエンジンで、徹底的に探したのですが、ソースコードを探し回ったの ですが、ピッタリくるものがなく、Linuxのカーネルソースを調べ始める頃に なると、そろそろ嫌気がさしてきました。 このプロセスで出逢ったのが、この本でした。 "TCP/IP Illustrated, Volume 2 The Implementation" Gary R. Wright W.Richard Stevens 20行以下のカーネルサンプルプログラム、豊富な図解、明解な英語。 英語の技術書を、涙を流しながら読んだのは、これが初めてかもしれません。 # 翻訳本があれば、間違いなくそっちを読んだと思うが、何故、こんな名著 # の翻訳本がないんでしょうか。 ## どこかの出版社の方、本書の翻訳本の出版予定がありました、お手伝い ## します。 しかし、実装の後も、何度計算仕直しても、チェックサムの値が合わず、 etherealを使ってパケット解析を繰り返しました。 そして、その結果、"Trailer"なる今迄聞いたこともない、イーサーパケッ トの終端バイトの存在を初めて知りました。 仕様的に困ったのは、IP Masqueradeの内部実装でした。 動作の基本原理に関しては、 ちゃんまるNET構築計画〜その基本思想と概要 http://www.ep.sci.hokudai.ac.jp/~epnetfan/zagaku/1999/0317/MARUNET.html の「2-2:IPマスカレード(NAT:Network Address Translator)」でイメージ を把握させて頂きました。 ですが、細かな実装(タイムアウト、利用するポート番号など)については、 全く分からず、どうしようもなくなったのですが、そのうちに開き直り、「私 の仕様が世界の中心だ!」と、自分の都合に基ずく勝手な実装を、どんどん進 めて行くことになります。 2.6 Nimda、TCPTunnelを攻撃! 半年が過ぎ、果てしなく登場する難問に、いい加減疲れて来て、このプログ ラムを諦めかけていた時、悪質コンピュータウイルス"RedCode"と"Nimda"が世 界中のコンピュータ環境を大混乱させました。 ある日のこと、HP社のネットワーク管理セクションから、『私のマシン (Zen2)がウイルスに汚染されている』との警告を受けたのをきっかけとして (結局、それはガセだったのですが)、帰宅前に、etherealで自分のホストに関 連している全パケットのキャプチャを開始して、そのまま帰宅しました。 次の日、ログを見た私は、驚いて腰が抜けそうになりました。 そのログの中には、HP社内の23のホストマシンから、4600回以上の攻撃が記 録されていたからです。 Nimdaに汚染された23のホストマシンは、TCPTunnelをサーバと誤認識して、 さまざまな手口で、私のマシンへの攻撃、侵入を試みていたのでした。 (無論、TCPTunnelは、サーバそのものではありませんので、Nimdaは、私のホ ストマシンへの侵入を果たせませんでしたが) 何れにしても、『TCPTunnelのウェルノンポートを閉じる時が来た』と判断 せざるを得ませんでした。 そして、同時に、このソフトウェアの開発を断念することができなくなった ことも、はっきりとしてきました。 2.7 黙れ! WinSock!! 先月初め、実装の9割が完成し、UDPパケットの実験として、プライベートネッ トワーク側のホストのNTPクライアント「桜時計」を使って、インターネット 側のタイムサーバからネットワーク時刻の取得に成功し、喜こんでいたのも、 つかの間。 なぜ、UDPは成功するのに、TCPは繋がらない? 自宅に帰ってからも、プログラムリストを睨みつけながら、バグを探したの ですが、どうしても見つかりません。 そもそも、telnetを実施すると、TCPコネクションの確立には成功している のですが、その後、サーバ側からコネクションクローズ要求がかかり、ログイ ン認証まで進むことができないのです。 3日かけて、Etherealでパケット解析をしたところ、意外な結果に目を剥き ました。 つまり、こういうことだったのです。 このソフトウェアの仕組を簡単に説明すると、 (Step.1)WinPcapが社内ネット、インターネット用のパケットを生成した後、 これを目的のサーバにリクエストとして発射する。 (Step.2)サーバからリプライ応答が到着し、WinPcapは、このパケットをロー カルネット用のパケットとして、再生成した後、目的のホストに転送 する。 と言うことなのですが、この(Step.2)のプロセスに落し穴がありました。 サーバからTCPのリプライ応答のパケットが到着した時、WinSockは、そのパ ケットが何故、ここに届いたのか理解できません。 なぜなら、リクエストパケットを送ったのは、 WinSockライブラリではなく、WinPcapライブラリだから です。 WinSockは、その訳の分からんパケットを、ただ放棄するだけではなく、頼 みもしないのに、サーバに対して、 「あんた、変なパケット送っているよ」 と、いらん返事をしてしまいます。 当然、サーバは正しい処理をしてやっているのに、こんな文句を言われて、 怒ってしまいます。 TCPコネクションを閉じて、それ以後のクライアント側の処理を無視するこ とに決めてしまいます。 そんなこととは知らない、WinPcapは、プライベートネットワークのホスト にパケットの転送を行い、そのホストの次のリクエストパケットをインターネッ ト側のサーバに送りますが、TCPコネクションを閉じてしまったサーバは、も はやうんともすんとも言いません。 ローカルネットワークのホストは、パケットの再送を試みますが、サーバは 相手にしてくれません。 WinSockが余計な口出しをすることによって、WinPcapはTCPの処理を行えな くなってしまっていたのです。 この時、私は、これまでの数ヶ月の努力が、がらがらと音を立てながら崩れ 落ちていく音を、確かに聞きました。 特定ポート(例えば60000番以上)へのTCPコネクション要求に対して、完全に WinSockのお喋り(応答)を止めさせる方法は無いものか、色々調べてみました。 例えば、TCPWrapperの仕組を、Etherealでパケット解析してみたりもしたの ですが、TCPWrapperは確かに、ポートを塞ぐことはできるのですが、TCPの 3Wayハンドシェークまでは実施しているようで、どうにもできません。 原因が判明したのは、金曜日の深夜でした。 私は自宅に帰って、一言も口が聞けないほど落ち込み、週末は寝こんでしま いました(本当)。 ===================================================================== お願い!! もし、WinSockに、この特定ポート(例えば60000番以上)へのTCPコネクショ ンを、*完全に無視させる* 方法を御存知の方がいらっしゃいましたら、どう か御連絡下さい。 Pseud IP Masquerade on Win32(IPマスカレードもどき) から、"Pseud(もど き)" を 取り除いて、世界中の皆さんのお役に立てるものを、リリースさせて 頂く所存でございます。 ===================================================================== 2.8 命名 私は、これまで、2週間くらいで一本のソフトを作ってきましたが、このソ フトウェアに関しては、「進めばかならず地雷」と言うくらい色々な困難に直 面し、発案からすでに数ヶ月の時間を費やしてきました。 実際のところ、このソフトウェアの中には、ARPサーバ/クライアント、PING サーバ/クライアント、TCP/UDP/IPチェックサム計算アルゴリズム、テーブル 管理、タイマ管理機構、ネットワークインターフェース管理機構まで実装して いるのです。 # と言うか、設計段階の見積もりが甘くて、実装していく途中で、必要な機 # 能に気がつくというのが、本当のところ。 このソフトを放棄するには、あまりにも多くの勉強と開発の時間を費し過ぎ ていました。 週末、布団の中で落ちこみつつも、WinSock問題を解決する方法を、考え続 け、ついに滅茶苦茶とも、無謀とも言うべき最終解決方法を案出しました。 『WinSockが応答しようもない、仮想イーサネットカードを作ってしまえ!』 もう一つだけIPアドレスを用意して、仮想イーサネットカードからパケット の送受信を行わせよう、と言う、なんとなく本末転倒(IPマスカレードの本来 の目的は、IPアドレスの節約)な方法でした。 『ローカルネットワーク側に、2台以上のパソコンがあれば、価値はあるはず だ!』と自分に言い聞かせながら、もはやひっこむことができなくなった江端 の暴走が始まります。 この時点で、このソフトウェアの正式名称、 IP マスカレード もどき Pseud IP Masquerade on Win32 PIPMasq が決定されたのであります。 2.9 完成 この仮想イーサネットカード(以下、Pseud IFと略す)のMACアドレスとして、 本物のイーサーネットカードのMACアドレスを使わなければ、パケットがホス トに戻ってきません。 先ずは、Psued IFにARPサーバを塔載して、社内ネットワークに接続してい るパソコンのイーサーネットカード達を、うまく欺けるかどうかの実験を行い ました。 勿論、実験には、使われていないIPアドレスを探しだして、びくびくしなが ら、使いました。 ARP自身が、バッティングしたMACアドレスを検知してしまわないかどうかを 探るのが、この実験の目的でした。 この実験の結果としては、ARPがMACアドレスのバッティングを検知しないこ とを確認しました。 さて、こうなれば後は実装あるのみ。 やっかいな、スレッド間通信のコーディグを終わらせ、プライベートネット ワークのホストから、インターネットのホストに対して、ホスト名指定の(つ まりDNS稼働下の)telnetの接続を確認した時、私は、拳を天井に向って突き上 げ、勝利の雄叫びを轟かせたのでありました。 3. Pseud IP Masquerade on Win32の内部構成 本章以降、プライベートネットワーク側でない方のネットワーク(社内ネッ トワークや、インターネット等)を総称して、「外部ネット」と呼ぶこととま す。 第2章でも述べた通り、本プログラム PIPMasq は、外側イーサネットカー ドのIPアドレスの他に、Winsockが関与しない仮想イーサネット用のIPアドレ スが必要になります。 従って、外部ネット側NIC用に、2つのIPアドレスを用意して頂く必要があり ます。 あるいは、[スタート]-->[設定]-->[コントロールパネル]-->[ネットワーク] から、外部ネット側イーサネットカードのIPアドレスに、でたらめなIPアドレ スを振って、正しいアドレスを仮想イーサネット用に用いることも可能ですが、 この場合、PIPMasqホストから、Winsockを利用した全アプリケーションが使え なくなります。 あるいは、私のように、pingで未使用のIPアドレスを探して、こっそり使う のも一つの手です。 ちなみにPIPMasqは、裏機能として、こっそり使っているIPアドレスを、そ のIPアドレスのオーナのホストが使い出したら、それを検知して、自力で終了 する機能も持っています(後述)。 下図3-1は、PIPMasqのオブジェクト関連図を示しています。 +------+ |Client| 外部ネット側 +----------->| Arp | プライベートネット側 イーサネットカード | +------+ イーサネットカード || | ^ || || | |(3) || || V V || || (6) +---------+ (5) +---------------+ (1) || ||<----| PseudIF |<-----| COutward |<-------------|| || +---------+ +---------------+ || || ^ ^ ^ ^ || || | | | | || || | +----------+ | +-------+ || || +---+ | |(2) |(4) || || | | V V || || +------+ +------+ +-------+ +------+ || || |Ping | | Arp | | Table | | Port | || || |Server| |Server| | Mgr | | Mgr | || || +------+ +------+ +-------+ +------+ || || ^ ^ ^ ^ ^ || || | | | | | || || | +------+ | | +------+ || || +-----------+ | | +---| Time | || || | | | | Mgr | || || | | | (8) +------+ || || | | V || || (7) +---------------+ (9) || ||---------------------->| CInward |------------>|| || +---------------+ || || || 図3-1 PIPMasqのオブジェクト関連図 PIPMasqは、上記の9つのクラスから構成されており、その内、COutward, CInward, TimeMgrは、スレッド化されたインスタンスとして、自律的に動作し ます(その他、コンソール用スレッドなどもありますが、省略しています)。 (Ftp Mgr, Dhcpcd Mgrも省略)。 動作の概要を以下に示します。 (1) WinPcapのIndirectモードで設定された、プライベートネット側のイーサネッ トカードは、自分宛のパケットを全部受信し、このパケットを、COutwardに送 ります。 (2)(3) COutwardは、TableMgrよりテーブルエントリを参照して、このパケットの送 信先IPアドレスが初出の場合は、ClientArpを使って、そのIPアドレスのMACア ドレスを調べます。 (4) 初出であることが確認された後、PortMgrは、インターネット側イーサネッ トカードで扱うソースポート番号を付与します。 (5) 最後に、COutwardは、CheckSumの再計算、仮想IPアドレスの設定等を行い、 パケットを再構成した後、これを、PseudIFに渡します。 (6) PseudIFは、インターネット側イーサネットカードから、再構成されたパケッ トを送出します。 (7) WinPcapのPromiscusモードで設定されたインターネット側のイーサネットカー ドは、ネットワーク上の全パケットを受信し、このパケットを、CInwardに送 ります。 (8) CInwardは、受信したパケットの内容を使って、TableMgrよりテーブルエン トリを参照して、プライベートネットワーク側で使用するパケットとして再構 成した後、プライベートネット側のイーサネットカードより、パケットを送出 します。 この他、TimeMgrは、TableMgrとPortMgrのエントリを見張り続け、Expireし たエントリーの削除を行います。 また、PingServerは、仮想IPアドレスへのPing要求に応答し、ArpMgrは、仮 想IPアドレスのMACアドレス(インターネット側イーサネットカードのMACアド レスと同じ)を返します。 4. Pseud IP Masquerade on Win32 の想定するネットワーク構成例 4.1 全体構成とコンフィギュレーションファイルの内容 下図のネットワーク構成図を使って、PIPMasqの想定するネットワーク構成 と、コンフィギュレーションファイルの内容について説明します。 ( ) ( ) ( ) ( インターネット ) ( ) ( ) ( ) | +----+-----+ | ルータ | +----+-----+ 133.144.10.254 |(3) | 133.144.10.99 ( ) 133.144.10.10 192.168.0.1 ( ) ( ) +-------+ ( ) ( 外部 ) (2)| |(1) ( プライベート ) ( ) ----=== ===-------- ( ) ( ネットワーク ) | | ( ネットワーク ) ( ) +-------+ ( ) ( ) PIPMasq ( ) 133.144.10.0 ホスト 192.168.0.0 /255.255.255.0 /255.255.255.0 図4-1 PIPMasqの想定するネットワーク構成例 Ethernetカードが2枚差しになったWindowsNT/2000に、PIPMasqがインストー ルされているホストを、「PIPMasqホスト」と呼ぶことにします。 プライベートネットワーク上のホストは、インターネットで公式に割り当て られたアドレスを持つべきではなく、RFC1918で推奨されているプライベート アドレス空間のものを用いるのが普通です。 10.0.0.0 - 10.255.255.255 172.16.0.0 - 172.31.255.255 192.168.0.0 - 192.168.255.255 上記の3つのアドレス空間なら、どこを使っても構いません。 本章の例では、192.168.0.0/255.255.255.0を使っているものとし、上記(1) の「プライベートネット側イーサネットカード」のIPアドレスを、 192.168.0.1とします。 また、外部ネットワークの上記(2)の「外部ネット側イーサネットカード」 のIPアドレスを、133.144.10.10、「外部ネット側仮想イーサネットカード」 のIPアドレスを、133.144.10.99 、外部ネット側ネットマスクは、 255.255.255.0 とします。 この「外部ネットワークのデフォルトゲートウェイ」のIPアドレスを、 133.144.10.254 とします。 しかし、これらの情報はWindowsのレジストリにすでに登録されているので、 これを再度設定する必要はありません。 PIPMasqホストを動作させるには、以下の3つの情報があれば必要十分です。 纏めますと、 外部ネット側仮想イーサネットカードのIPアドレス (PSEUD) 外部ネット側イーサネットカードの名前 (OUTERDEV) プライベートネット側イーサネットカードの名前 (INTRADEV) となります。 PIPMasqホストのコンフィギュレーションファイルである、pipmasq.cfgの内 容は次のようになります。 PSEUD=133.144.10.99 OUTERDEV=\Device\Packet_E100B1 INTRADEV=\Device\Packet_GE2000 あるいは、PSEUD IPをDHCPサーバから取得できる場合は、 PSEUD=dhcp OUTERDEV=\Device\Packet_E100B1 INTRADEV=\Device\Packet_GE2000 となります。 これらのpipmasq.cfgは、pipconfig.exeを使って、簡単に作成することがで きます http://www.kobore.net/soft/pipmasq/pipconfig.exe 4.2 プライベートネットワーク上のホストのネットワークの設定 プライベートネットワーク上のホストのネットワークの設定は、以下の点に 気をつけて設定して下さい。 プライベートネットワークに、DHCPサーバを立てている場合には、以下の点 に気をつけて、サーバを設定して下さい。 (1)IPアドレスは、プライベートネットワークのネットマスクに適合したもの であること(当たり前ですが) (2)デフォルトゲートウェイIPアドレスは、必ず、PIPMasqホストのプライベー トネット側イーサネットカードのIPアドレス(本章の例では、192.168.0.1) とすること。 (3)DNSサーバのIPアドレスが正しく設定されているか確認して下さい。 外部ネットには、DNSサーバがあると思いますので、そのIPアドレスを指定 して下さい。プライベートネット内部に、あればそれを指定することもできま す。 特に、(2)(3)は忘れがちですので、注意して下さい。 5. Pseud IP Masquerade on Win32 の使い方 本章では、PIPMasqの使い方に関して説明します。 5.1 NTサービス版 (Step.1) 前準備(WinPcapのインストール) # http://netgroup-serv.polito.it/winpcap/install/Default.htm から、 # "WinPcap auto-installer (driver+DLLs)" をクリックして、"WinPcap.exe"を # ダウンロードし、実行して下さい。 最新のWinPcapでは動きません(多分). バージョン2.1を使ってください。 パケットキャプチャライブラリが、直ちにインストールされます 。 (Step.2) 前準備(PIPMasqServiceのインストール) ダウンロードした"PIPMasqService.exe"を、適当なディレクトリ(例えば、 "c:\bin\PIPMasq")に配置して下さい。 次に、"pipmasq.cfg"を %SystemRoot%system32(例えば、 "c:\WINNT\system32" ) の下で作成します。 pipmasq.cfgのサンプルを以下に示します。 PSEUD=dhcp OUTERDEV=\Device\Packet_E100B1 INTRADEV=\Device\Packet_GE2000 (Step.3) PIPMasqServiceの起動 コマンドプロンプトから、 PIPMasqService.exe -install と入力して下さい。 インストールが完了し、コントロールパネル -> サービスの中に、 "PIPMasqService"なるサービスが登録されているはずです。 これを選択して、開始ボタンを押して下さい。"PIPMasqService"がNTサービ スとして起動します。 初期状態では、手動起動になっておりますので、ご希望に応じて、自動起動 にして下さい。 なお、PIPMasqServiceのアンインストールは、コマンドプロンプトから、 PIPMasqService.exe -remove と入力して下さい。 コントロールパネル -> サービスの中から、"PIPMasqService" が消えてい るはずです。 5.2 実行形式(exe)版 (Step.1) 前準備(WinPcapのインストール) 5.1の(Step.1) に同じです。 (Step.2) 前準備(PIPMasq) ダウンロードした"PIPMasq.exe"を、適当なディレクトリ(例えば、 "c:\bin\PIPMasq")に配置して下さい。 次に、"pipmasq.cfg"を "PIPMasq.exe"と同じディレクトリに置いて下さい。 "pipmasq.cfg"の作りかたは、5.1(Step.2)を参照して下さい。 (Step.3) PIPMasq.exeの起動 Doc窓から、 PIPMasq.exe と入力して下さい。 (Step.4) PIPMasq.exeの終了 Doc窓から、"exit"を入力して下さい。 5.3 フロッピーディスク版 PIPMasqは、 PIPMasq.exe pipmasq.cfg packet.dll があれば動作します。 packet.dllは、WinPcapをインストールすると、%SystemRoot%system32(例え ば、"c:\WINNT\system32" ) に入りますので、そこから取って来て下さい。 上記の3つのファイルは、フロッピーディスクに入れて持ち運ぶことができ ますので、必要な場所で、アドホックにプライベートネットを作ることができ ます。 6. ユーザインターフェース 実行形式(exe)版である、PIPMasq.exe は、起動後から、コマンド入力用の DOS窓が出てきます。 ">"のプロンプトに対して入力すると、PIPMasqの内部状態を読むことができ ます。 入力コマンドは、大文字、小文字のどちらでも構いませんが、混在して使う ことはできません。 (1)"conf" あるいは、"c" PIPMasqの設定情報が表示されます。 >conf PSEUD 133.144.10.99 OUTER 133.144.10.10 NETWORK 255.255.255.0 GATEWAY 133.144.10.254 INTRA 192.168.0.1 (2)"list" あるいは、"l" PIPMasqのマスカレードのテーブル情報が表示されます。 >list Pseud IP masquerading entries prot expire source destination ports ---------------------------------------------------------------------- tcp 18:29:58 192.168.0.1 15.2.117.218 1027(60001)->23 udp 18:29:55 192.168.0.1 15.2.113.86 1037(60001)->53 udp 18:29:50 192.168.0.1 15.15.88.102 1037(60000)->53 tcp 18:29:46 192.168.0.1 15.2.112.10 1026(60000)->23 (3)"exit" PIPMasqを終了します。 終了処理に10秒ほどかかります。 7. 現在のPIPMasqに「できること」と「(これから)したいこと」 7.1 できること (1)TCP/UDPのマスカレードを実現します まあ、それが目的ですから。 (2)PINGが使えます PINGは、ポートマッピングできないので、普通使えないのですが、 PINGがないと、不便でしたので、無理矢理実装しました。 (3)仮想IPアドレスのバッテングを検知し、速やかに終了させることができます あなたの所属するネットワーク管理者が、仮想イーサネット用のIPア ドレスをくれなかった場合、あなたは、未使用のIPアドレスをこっそ り使うかもしれません。 しかし、IPアドレスがバッテングすると、正式にエントリされている ホストが困ってしまいます。 あるマシンが、仮想イーサネット用のIPアドレスに向けて、確認用の PINGを放った時、PIPMasqはそれを検知して、自動的に終了します。 pipmasq.cfgに PINGDOWN=on を追加して下さい。 (4)DHCPサーバから、2つめのIPアドレスをPSEUD IPとして取得できます。 6.2 (これから)したいこと (1)仮想イーサネットIPの排除(悲願) 現状では、Pseud IPを使わざるを得ません。 本当にしつこいですが、 ===================================================================== お願い!! もし、WinSockに、この特定ポート(例えば60000番以上)へのTCPコネクショ ンを、*完全に無視させる* 方法を御存知の方がいらっしゃいましたら、どう か御連絡下さい。 Pseud IP Masquerade on Win32(IPマスカレードもどき) から、"Pseud(もど き)" を 取り除いて、世界中の皆さんのお役に立てるものを、リリースさせて 頂く所存でございます。 ===================================================================== の件、くれぐれも宣しくお願いします。 (2)FTPのアクティブモード通信の実現 Ver 0.3にて実現しました。 (3)Windows 9Xの対応 私は、NTとLinuxしか使っていないので、特に必要ないのですが、合 計10人以上の方から依頼を受けたら対応させて頂きます。 8. 謝辞 ○本ソフトウェア「Pseud IP Masquerade on Win32」は、イタリア トリノ工 科大学で開発された"WinPcap: the Free Packet Capture Architecture for Windows" http://netgroup-serv.polito.it/winpcap/ を使用しております。 WinPcapの開発に携わった全ての皆様に、心より感謝申しあげます。 ○本ソフトウェアの開発に関して、不可欠であったパケットモニタリングツー ルEtherealの製作者の皆様に、感謝致します。 http://www.ethereal.com/introduction.html#authors ○TCP/IP Illustrated, Volume 2 The Implementation の著者、 Gary R. Wright、 W. Richard Stevens のお二人に感謝致します。 ○OpenDesign No.10 「ネットワーク管理技術のすべて」に掲載されている パソコン・簡易版プロトコル・アナライザー PCSPA.EXE V1.1 Copyright (C) 1992.6.11 M.yamai のソースコードの再使用、変更許可を頂きました、 有限会社トゥワイズ・ラボ http://www.twise.co.jp/index.html の 山居正幸 様に感謝申し上げます。 9. 参考文献 - WinPcap: the Free Packet Capture Architecture for Windows http://netgroup-serv.polito.it/winpcap/ - TCP/IP Illustrated, Volume 2 The Implementation ISBN 0-201-63354-X - Computing the Internet Checksum RFC1071 - Trailer Encapsulations RFC893 - コンピュータネットワーク http://pine.ese.yamanashi.ac.jp/~itoyo/lecture/network/Default.htm - IP,ICMP,UDP のチェックサムの計算方法 http://www.fenix.ne.jp/~thomas/memo/ip/checksum.html - ちゃんまるNET構築計画〜その基本思想と概要 http://www.ep.sci.hokudai.ac.jp/~epnetfan/zagaku/1999/0317/MARUNET.html - ARP(Address Resolution Protocol) http://www12.u-page.so-net.ne.jp/qc4/survive/network/arp.htm - ARPフォーマット http://www12.u-page.so-net.ne.jp/qc4/survive/network/arpheader.htm - 通信プロトコル辞典 アスキー出版局 ISBN4-7561-0269-7 - UNIXネットワークプログラミング 第2版 Vol.1 トッパン ISBN4-8101-8612-1 - NATとIPマスカレード http://www.netsemi.org/report/nat-ipmasq.html - OpenDesign No.10 「ネットワーク管理技術のすべて」 CQ出版社 - Dynamic Host Configuration Protocol RFC2131