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をサポートしてないルータの場合
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が賢ければ、送信したローカルIPをグローバルIPに変換します。且つ、PASVモードになったのを検知すると、ルーティングされていなくても、FTPのやり取りを解釈して勝手にルーティングしてくれるものもあります。

・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」に設定してください。