Nekosogiftpd Plugin
PitifulNat Ver0.02
Download!!(Ver0.02)
・FTPとNAT
FTPでは、コマンドをやり取りする接続と、データをやり取りする接続の二つの接続を使用します。
コマンド接続とは、ユーザー認証や、操作ファイルの設定など、実際FTPサーバーにやらせたい操作を示した文字列をサーバーに送信し、FTPサーバーからの返答を受信するための接続です。
データ接続は、実際のファイル自体のデータを送受信するための接続です。
通常、コマンドをやり取りするポートは21と決められています。しかし、データをやり取りする接続は特に決められていません。そのため、ルータを間に入れた場合、ポートのルーティングがやりにくいという問題が発生します。
以下に、例を示します。
FTPをサポートしているルータの場合
PORTコマンド→ → → → クライアント ルータ(クライアント側) ルータ(サーバー側) FTPサーバー PORT 192,168,11,10,223,190 PORT 220,**,**,***,223,190 PORT 220,**,**,***,223,190 PORT 220,**,**,***,223,190 ここではローカルIP ルータがグローバルIPに変換 クライアントのグローバルIPが届く。
FTPをサポートしてないルータの場合
つまり、NATが賢ければ、送信したローカルIPをグローバルIPに変換します。且つ、PASVモードになったのを検知すると、ルーティングされていなくても、FTPのやり取りを解釈して勝手にルーティングしてくれるものもあります。
PORTコマンド→ → → → クライアント ルータ(クライアント側) ルータ(サーバー側) FTPサーバー PORT 192,168,11,10,223,190 PORT 192,168,11,10,223,190 PORT 192,168,11,10,223,190 PORT 192,168,11,10,223,190 ここではローカルIP ルータはローカルIPのまま送る クライアントのローカルIPが届く。当然クライアントに接続できない。
・NATに頼らないにはどうするか。
先に示したように、NATが賢い場合、ローカルIPをグローバルIPに書き換えてくれるので、サーバーとクライアントはルータの中にいることを意識せずにやり取りできます。
しかし、NATがローカルIPをグローバルIPに書き換えてくれない場合、どうすればいいでしょうか?
一番いいのは、いいルータに買い換えることですが、そうしない場合は、アプリケーション側でローカルIPを使用せず、全てグローバルIPでアドレスのやり取りを行えばいい事になります。
以下に、例を示します。
PORTコマンド→ → → → クライアント ルータ(クライアント側) ルータ(サーバー側) FTPサーバー PORT 220,**,**,***,223,190 PORT 220,**,**,***,223,190 PORT 220,**,**,***,223,190 PORT 220,**,**,***,223,190 いきなりグローバルで送る ルータはそのまま送信。 クライアントのグローバルIPが届く。
これをアプリケーションでやろうとすると、以下の条件が必要になります。
1、クライアントのグローバルIPがわかること。
2、サーバーのグローバルIPがわかること。
1は、接続した地点で、ルータ内にいるアプリケーションでも簡単に知ることができます。しかし、2に関して、ルータ内にいながら自分のグローバルIPを取得するのは難しいのです。
pitifulnatでは、2を解決するのに「名前解決」という方法を用います。名前解決とは、Host名からIPアドレスを取得する行為のことを言います。Host名とは、「www.yahoo.co.jp」等の文字列ですが、名前解決することにより「www.yahoo.co.jp」のIPアドレスを取得することができます。
つまり、サーバーがHost名を持っていた場合、ルータ内でもグローバルIPを取得できる事になります。必然的に、名前解決できるHost名が無い場合はこの機能を使えません。
・Pitifulnatの設定
PORTコマンドで、接続されたIPを使用する。
上記した、1の項目を解決します。PORTコマンドのIPアドレスを、接続したクライアントのIPアドレスに書き換えます。
PASVコマンドで、名前解決したIPを使用する。
上記した、2の項目を解決します。名前解決するHOST名で名前解決したIPアドレスを保存して、PASVの応答時のIPアドレスを書き換えます。
名前解決するHOST名
サーバーのIPアドレスを登録したHost名を設定します。
・名前解決できてるかどうかを確認
NekosogiFtpdのユーザー設定→Pluginを開いて、pitifulnat.dllを選択してください。
サーバーIPが出ていれば、OKです。
・その他
上記した、2の項目を使用する場合、ポートを複数サーバー側にルーティングしておく必要があります。例えば、ポート「10000〜10500」位をサーバー側にルーティングして、NekosogiFtpd(Ver1.03以降)のシステム→Advance→PASVポート使用制限を「10000〜10500」に設定してください。