異種なるFTPのサーバ公開方法
FTPとは
今さら言わなくてわかるだろうが、FTPとはFile Transfer Protocolの略でファイル転送に使用するTCP/IPのアプリケーション層に属するプロトコルである。主要プロトコルの一つだろう。
異種?なるFTPについて
HTTPやSMTPなど、殆どのプロトコルは1つのコネクションで通信が完了する。だが、FTPは2つのコネクションを使用している。1つは、制御コネクション、もう1つはデータコネクションだぁ。

通常のプロトコルは1つのコネクションで完結

FTPは制御コネクションとデータコネクションの2つを使用する
2つのコネクションについて
- 制御コネクション
制御コネクションとは主に認証や各種コマンド実行を行う
- データコネクション
転送するデータを扱う。PORT/ActiveモードとPASSIVEモードの2種類がある
簡単に言ってしまえば、制御コネクションでputやgetなどのコマンドを制御して、実際のデータその物はデータコネクションに流れるといった感じになる。
データコネクション
PORTとPASSIVEの2つがあるが、単純にどちらから通信を開始するかがポイントになる。
- PORT/Activeモード
2種類の呼び名があるが、通常PORTモードと呼ぶんじゃないかな。。FTPのデフォルトの転送モードになっている。サーバから通信を開始する。デフォルトだとサーバの20番ポートからクライアントの任意のポートにアクセスがくる

- Passiveモード
クライアントから通信を開始する。サーバが指定した任意のポートへクライアントから通信がくる

NAT環境での問題
クライアントもサーバもグローバルで接続されていれば、なんら問題ないのだが、どちらかがNAT環境にあると問題がでるのだ。FTPではデータコネクションを始める時に、このIPとポートで接続してくれと言うわけだが、NAT環境だとプライベートIPを相手に教えてしまうのだ。
- PORTモードの場合

- Passiveモードの場合

最近のルータは優秀だ
しかし、最近のルータは優秀でFTPの通信があるとIPを書き換えてくれるのだ。すばらしい
- PORTモードの場合

- Passiveモードの場合

こんな感じで得にFTPサーバは意識しなくてもルータが変換してくれる為、そのままFTPサーバを作ればOKですね。
FTPに対応していないルータだったらどうすんだよ
たぶん、あまり無いと思うがこういった場合には、FTPサーバで対応が可能だ。特定のサーバデーモンなら可能である。Proftpdだと、Passiveモードの際に、クライアントに教えるアドレスを指定できる。固定グローバルならそのままIPを書けばOKだが、動的IPの場合ならドメインの指定が可能なのでドメインを書けばOKになる。スタンドアローンで起動すると起動時にIPを取得し、そのまま保持する為、inetかxinet形式にすればコネクションがある度にドメインを解決してくれる。Proftpdの設定はproftpでファイル転送のページを見てくれ。それと、ルータのフィルタやNATの設定も忘れないでねー。
第2の解決策としては、PPPoEをルータではなくサーバで実行する。つまり、サーバにグローバルIPを持たせればいいのだ。しかし、FTPの為にグローバルを持たすってのは正直、お勧めできないな。
結局、PORTとPassiveどっちがいいんだよ
ルータが対応してなければ、Passiveにするしかないのだが、ルータが対応していてればPORT,Passiveモードのどちらがいいのか悩むかもしれないだろう。IPマスカレードしている環境からのクライアントが一般的であり、FTPに対応していないルータもあるかもしれない。それを考えるとPassiveモードでもアクセスは最低限可能にしてあげた方がいいだろう。