NATルータ環境でのPASVモード対応


NATルータ環境でFTPサーバを公開する場合、いろいろな要素が関係し、特にPASVモードでの公開が難しくなります。ここでは、簡単に対応の可否について示して置きます。

■PASV公開可否の判定

以下に、NATルータ配下でFTPサーバをPASVモードで公開できるかの判定フローを示します。各自の条件から判定してみてください。
  1. ルータがFTPサーバのPASVモードに対応しているか否か?

    最近、一部のルータでFTP通信をモニタし、PASVモードの応答メッセージ内のサーバアドレスのアドレスをプライベートからWAN側のグローバルアドレスに変換してくれるものがある。この動作は、ProFTPDでMasqueradeAddressを指定するのと等価の動作であり、対応機種としては、OPT90、DR202、SW-4P HGなどがある。
    そもそもNATルータを介した時にPASVモードで問題が起こるのは、クライアントからのPASVコマンドに対し、サーバから通知される応答メッセージ内のサーバアドレスが、家庭内で使用されているサーバ自身のプライベートアドレスあることに起因する。本件は、FTPサーバの公開に記してあるので参考にしてください。クライアントは、自分がアクセスしているルータのWAN側アドレス以外で、且つプライベーアドレスを通知されるので、通信できなくなるのは自明の理である。ルータの変換機能とは、制御コネクションで使用されるデフォルトの21番ポートをモニタすることにより、FTP通信であることを認識し、その中でやり取りされる、PASVモード時にサーバから通知される応答メッセージ内のサーバアドレスを、プライベートからWAN側のグローバルに書き換えることにより、あたかもサーバがインターネット上に直接存在するかのごとくするものである。
    従って、このような機能があるルータを使用している場合は、デーモンを含めて特に対策を施さなくてもNATルータ配下でFTPサーバをPASVモードで公開できる。(NATルータ対策が可能なデーモンであっても動作がおかしくなるので、この場合は対策しないこと。) 但し、デーモンでデフォルトの21番を使用していないとFTP通信として認識できないので、この機能は動作しない。また、FTPをSSL/TLSで使用する場合は、パケットが暗号化されるので中身が分からなくなり、変換できないため、このようなルータを使用しても駄目である。

  2. デーモンがNATルータ越えの対策に対応しているか否か?

    使用しているルータが上記のようなルータでない、あるいは動作条件があわない場合は、デーモンでの対処が必要になる。対処というのは、前述と同様に、PASVコマンドの応答メッセージ内のサーバアドレスとしてWAN側のグローバルアドレスを指定でき、且つ使用するデータコネクションのポート範囲を指定できるというもの。データコネクションのポート範囲を指定については、このコネクションがインターネット側から開始されるため、ルータでサーバにポートマッピングしないとサーバに繋がらないのと、フィルタ設定ができなくなるからである。
      国内では、TinyFTPが日本製ということでよく使用されているが、残念ながらNATルータ対応はできないので、ルータが対応していなければPASVでの公開はできない。一方、NATルータ対策をしているデーモンとしては、ProFTPDやWarFTPD等がある。Linuxでは、vsftpdもPASVポートを固定できるが、アドレス変換には未対応なのでNATルータ越えでは使用できない。また、Windows系のGuildFTPもアドレス変換やポートの固定が可能だが、外部からの起動制御ができないため後述する動的IP環境下では利用できない。(厳密には、IPアドレス変化時にデーモンを手動で再起動すればいいので、運用に耐えないというのが正解であるが。)

 

■環境依存の問題

上記で、NATルータ越えの対策ができているデーモンを使用する場合、インターネット環境が固定IPか動的IPかが重要な要素になる。

  1. 固定IPの場合

    固定IPであれば、何が起きてもルータのWAN側のグローバルアドレスが変わることはないので、このアドレスをデーモンに設定してあげればよい。(ProFTPDならMasqueradeAddressに書く。)

  2. 動的IPの場合

    多くの方がこのケースに該当するが、動的IPの場合は、何らかの理由(ルータの再起動、ネットワーク側での障害や工事、ノイズによるPPPoEセッション断等)でPPPoEセッションが切れると、多くの場合、WAN側のアドレスが変わってしまうので、変化したときの対策が必要になる。
     
      対策としては、ProFTPDやWarFTPdは、PASVコマンドの応答で返送するアドレスをIPアドレスではなくホスト名で指定でき、動作時にはDNSで変換したアドレスを利用してくれるので、アドレスが変わってもその時のアドレスを利用してくれる。
      しかし、このDNSを検索する動作は、デーモンが起動した時にしか行われないという問題がある。つまり、デーモンを常時動作させていたのでは、この仕組みを活用できないということになる。

      対策としては、例えば、ProFTPDならNATルータ越えの対策をして、動的IP環境下ではスタンドアローンモードで動かさずに、inetdモードで毎回起動する方式を採れば、アクセスがある度に、DNSを牽いてくれるのでアドレス変化にも追従できることになる。
      一方、WarFTPdではこういう起動モードがないので、このままでは運用に耐えないが、Warftpdはコマンドベースで起動制御ができるので、これを利用すれば同等のことが可能になる。その具体例が、おやじの採った、スクリプトでグローバルアドレスの変化を検出し、WarFTPdを強制再起動するという方法である。GuildFTP等もNAT対策ができるようになっているが、残念ながら外部制御ができないので連続運転には不向きである。(自分自身が直接収容しているインタフェースのアドレス変化は検出できるようなので、ルータを使わずにPPPoEをサーバで終端し、グローバルアドレスを自分の中で見えるようにすれば変化にも追従できる。ルータなしでのWindowsの常時動作はかなり危険なので、薦められないが・・・。)


Top Pageへ