自宅FTPサーバをインターネットに公開する場合のネットワーク関係の動きについて、おやじなりに整理して見ました。ここでの前提条件は、自宅サーバにはプライベートIPアドレスが付与され、NATルータを介してインターネットに公開されているという極一般的な環境を想定しています。ルータの機種によっては、NATルータ使用時のFTPの問題に対処しているものもあるので、ここでは通信不可となっている通信形態でも通信できることがありますので、まずは、特別な対処をしないで動かしてみることを薦めます。その結果、PASVがうまく動作しない場合は、こちらで述べていることに該当する可能性が大きのでデーモンでの対処が必要になります。勘違い等あるかと思いますので、ご指摘いただければありがたいです。FTPDによっては(おやじが使用しているProFTPDやWarFTPdなど)、ルータの特殊な機能に頼らずPASVモードで動かすことができます。下記およびProFTPD、WarFTPd(NT編)、WarFTPd(9x編)、サーバ公開のための設定、TCP/IP通信の概要の各ページも参照願います。■FTP通信の仕組み一般的に、インターネット上のFTPサイトからのダウンロードやアップロードに失敗するという経験は少ないのではないかと思います。ところが、自宅にFTPサーバを設置すると、設定には問題ないはずなのにインターネット側からうまく使えないということが非常に多く発生します。これは、ルータ(NATルータ)を介してプライベートIPアドレスでFTPサーバが設置されている事と、FTP通信の仕組みが原因になっています。FTPは、WWW(HTTP)やメール(SMTP、POP)とは少し異なった方法で通信しており、これが自宅FTPサーバの公開を難しくしています。FTPの詳しい仕組みについては、RTシリーズのTCP/IPに関するFAQや過去からの贈り物「FTP〜前編・後編」等に詳しく書かれていますので、ここでは省略しますが少し整理しておきます。ポイントは、コネクションの方向とデータコネクションの設定方法です。データコネクションの設定方法とは、待ち受け側(モードにより異なる)が制御コネクションを使用して自分が待ち受けするIPアドレスとポート番号を通知し、それを基に相手がデータコネクションを設定してくるという仕組みです。実際の通信をキャプチャしたデータをもとに、簡単なTCP/IP通信の概要をまとめてみましたので、こちらも参考にしてください。◆FTP通信におけるコネクションFTPは他のプロトコルと異なり、制御コネクションとデータコネクションの2つのコネクションで通信している。制御コネクション制御コネクションは、FTPサーバ側で21番ポート(デフォルト)を使用し待ち受け状態となっているところに、クライアントから任意のポート番号でアクセスしTCPコネクションで張られる。制御コネクションは、セッションが切断されるまで維持され、このコネクションでユーザの認証や各種のコマンドの実行要求やレスポンスがやり取りされる。データコネクションデータコネクションでは、ファイルそのものとファイル一覧がやり取りされる。このコネクションは、データの送受信のたびに設定・開放されるTCPコネクションである。データコネクションの設定方法はFTPの動作モードによって異なり、PORTモードとPASVモードの2通りがある。[PORTモード]PORTモードは、FTPのデフォルト的な転送モードである。このモードでは、データコネクションは制御コネクションとは異なり、FTPサーバ側の20番ポート(デフォルト)からクライアントの任意のポートに向けてTCPコネクションが設定される。従って、FTPサーバがコネクションを設定するためには、クライアントの接続先ポート番号を知らなければならないが、これは制御コネクションを使用してPORTコマンドによりクライアントのIPアドレスと共に、クライアントからFTPサーバに通知される。ここで注意が必要なのは、データコネクションの設定方向であり、ファイルをダウンロードするのかアップロードするのかにかかわらず、サーバ側からコネクションが設定されるということである。ファイルをアップロードする場合は、クライアントから通信が始まるように思えるがこれは誤りである。このデータコネクションの設定方向は、ルータのフィルタリングやポートマッピング(スタティックNAT)の設定に関係してくる。[PASVモード]一方、PASVモードのデータコネクションは、PORTモードとは逆にクライアント側の任意のポートからFTPサーバの待ちうけポートに向けてTCPコネクションが設定される。このモードでは、FTPサーバがクライアントから制御コネクションを使用したPASVコマンドによる転送要求を受けると、サーバは自分のIPアドレスと待ち受けポート番号をレスポンスとしてクライアントに通知し、クライアントからのデータコネクションの接続要求を待ち受ける。クライアントは、サーバから指定されたIPアドレス、ポートに向けてFTPサーバにデータコネクションの接続を行う。PASVモードでは、制御コネクション、データコネクションとも設定が全てクライアントから始まる。これは、クライアントがファイヤウォールやNATルータ配下にいても通信ができるようにするために考えられたモードである。データコネクションで、ファイルそのものとファイル一覧がやり取りされるのはPORTモードと同じである。企業内からPORTモードで外部のFTPサーバへのアクセスができるようにするには、FTPサーバ側から接続されてくるデータコネクションのポートをファイヤウォールで開けなければならない。従って、企業からしてみれば非常にリスクが高くなるので、通常は、PORTモードでの通信は閉められており、企業内からはPORTモードで接続はできないと思ったほうがよい。■通信形態FTP通信の形態としては、下表のように4つの形態がある。[ケース1]家庭内での接続、又はインターネットではクライアント・サーバともグローバルアドレスを持っている場合に相当する。このケースでは、PORTモード、PASVモード共、全く問題は発生しない。[ケース3]自宅FTPサーバに、ダイヤルアップ接続やフレッツ接続ツールによる接続等でグローバルアドレスを持っているクライアント(NATルータなし)がアクセスする場合等に相当する。[ケース2]企業内やユーザやADSLユーザ等のNATルータ配下のクライアントがグローバルアドレスで接続された外部のFTPサイトを利用する等の極一般的なFTP利用環境で、PASVモードでの利用なら問題なく使用できる。[ケース4]自宅FTPサーバに、企業内やユーザやADSLユーザ等のNATルータ配下のクライアントがアクセスする場合等に相当する。ケース1、2については問題は無いので、ここでの本題である自宅FTPサーバ公開時の、ケース3、4でPORT/PASVの各モードでの動作を以下に示す。ここでは、FTPの通信の仕組みとNATルータの基本的な動作からしか考察していない。最近のルータ(家庭向けBBRやADSLルータ)は、FTPのNAT越えの問題に対処している機種もあり(クライアント側の機能は、ほぼ全機種で対応している。)、ここでは通信できないとしているケースでも通信可能な場合もあるので、各人の環境でいろいろ試験してみてください。不特定のクライアント環境の多くに対応できるようにするには、PASVモードでの公開が必須と思います。それには、FTPサーバにグローバルアドレスを付与できる環境を構築するか、NAT越えでのPASVモードに対応しているデーモンを使用するしかないと、おやじは考えます。前者は、ADSL環境ならADSLルータをブリッジモードにし、PPPoEをサーバで終端する方法が一番手っ取り早いと思います。この場合、サーバ機はインターネットに直接接続されるので、サーバのセキュリティ対策を十分に行う必要があり、リスクはかなり高くなるのでおやじは勧めません。そこまでして、FTPサーバを外部公開する必要性があるのか、良く考えて実行したほうが良いでしょう。■ケース3NATルータ配下のFTPサーバに、ダイヤルアップやADSL環境でPPPoEクライアントソフト(フレッツ接続ツールやRASPPPoE等)でインターネット接続しているクライアントからアクセスしてくる場合が相当する。このケースでの通信は、フィルタリングやポートマッピング(スタティックNAT)を正しく設定するだけで、下記のように問題なく通信できる。制御コネクションは、サーバの21番ポートに向けてクライアントから設定されるので、おやじのようにフラグを利用してフィルタリングしている場合は、WANからLANに向かって始まる(SYNフラグがついているパケット)を通過できるように設定が必要。フラグが扱えないルータでは、21番ポートを開ければよい。サーバを含め家庭内端末がクライアント側としても動作するため、21番ポートに向かうパケット(送信元ポートは任意)は、ルータを通過できるように設定する必要がある。おやじの場合、外部向けは成りすましとマイクロソフトネットワーク関係以外は開けてあるので、特に設定は不要。データコネクション用には、自宅がクライアント動作する場合のため、おやじのようにフラグできっちり閉めている場合は送信元が20番となるポートを開放する。フラグを使えない一般的なルータでは、何もしなくてもクライント動作の場合は通過してくれるので特に設定は不要である。制御コネクションは、21番ポートに向けてインターネット側から設定されるので、21番ポートをサーバにマッピングさせる必要がある。データコネクション用の20番ポートは、サーバ側で使用するポート番号のことであり、通信形態としては家庭内からWebアクセスするのと同様の一般的なマスカレード通信なので設定は不要。自宅がクライアント側になったときについては、ケース4を参照ください。論理的にポートマッピングの設定は不要。■ケース4NATルータ配下のFTPサーバに、ADSLユーザや企業内のクライアント等のNATルータ越えクライアントからアクセスしてくる場合に相当する。このケースでの通信は、理論上は下記のようになり通信できない。このケースでは、クライアントからPORTコマンドで通知されるのはプラベートアドレスであり、そのアドレスを基にサーバがデータコネクションを設定しようとしても、NATルータを通過できない。仮に通過したとしても、インターネット内のルータは、プライベートアドレス向けは中継してくれないので通信はできない。本来はNATやIPマスカレードの対象ではないPORTコマンドで通知されるクライアントのアドレスやポート番号を、クライアント側のルータでクライアントのプライベートアドレスをWAN側のグローバルアドレスに、ポート番号はマスカレードした値に変換し、サーバからデータコネクションが張られてきたときに当該クライアント宛のパケットとして中継してくれれば通信可能となる。最近のルータはこのような対処は全てなされている。この場合のルータの設定は、ケース3と同様である。上記対応がなされていても、サーバ側からのデータコネクションはサーバ側のNATルータからすれば単なるマスカレード通信であるため、サーバが20番ポートでデータコネクションを設定しても、ルータがマスカレードしてしまう(下記、青で示した部分)ルータが存在するため、クライアント側には全く異なったポートで接続されてくる。このため、おやじのように、ルータの設定を厳しくしていると(WAN側からの接続は基本的に拒否設定にしており、FTP-DATA用としてはソースが20番ポート以外は開けていない)、通信ができなくなる。自宅サーバ側のNATルータが自宅サーバを考慮し、LAN側からの20番ポート接続をマスカレードしなければ、通信は可能となる。自宅サーバでのFTPサーバの公開は、非常に課題が多いことが分かる。■ケース3NATルータ配下のFTPサーバに、ダイヤルアップやADSL環境でPPPoEクライアントソフト(フレッツ接続ツールやRASPPPoE等)でインターネット接続しているクライアントからアクセスしてくる場合が相当する。このケースでの通信は、下記のようになり通信できない。このケースでは、クライアントからのPASVコマンドに対してサーバは自身のプライベートアドレスを待ち受けアドレスとして返してしまうので、クライアントからは接続しようがない。■ケース4NATルータ配下のFTPサーバに、ADSLユーザや企業内のクライアント等からアクセスしてくる場合に相当するが、ケース3同様に、このケースでは理論上は下記のようになり通信できない。■まとめ上記を整理すると、NATルータ配下に設置されたFTPサーバを使用したFTP通信は以下のようになる。PORTモードでの通信は、クライアントがグローバルアドレス空間にいれば問題なく通信できる。クライアントがNATルータ配下にいる場合、基本的には通信できないが、ルータ側で対処されており通信できる。PASVモードでの通信は、クライアントの条件にかかわらず通信できない。ルータ側で対処されているものがあり、それを使用すれば通信できる。ルータが未対処な場合、ネットワークの設定では困難であるが、FTPDによっては設定で何ら問題なく使用可能となる。(ProFTPDやWarFTPd等)理想的には、FTPサーバをグローバルアドレス空間に置けば、ほとんどのケースで通信は可能となる。サーバがインターネット上にさらされるので、それなりのセキュリティ対策と、リスクは覚悟が必要。■ルータにおけるFTP対策NATルータを介した時の、FTP通信については下記の2点のアドレスが問題になる。クライアントからPORTコマンドで通知されるクライアントのアドレスクライアントからのPASVコマンドの応答としてサーバから通知されるサーバのアドレスこれらのアドレスをルータがWAN側のグローバルアドレスに変換してくれれば、FTP通信が可能となる。最近のルータは、上記1のケースに対応していないものはない。ケース2に対応しているルータは少しづつ増えてきてはいるがまだ少なく、悪いことにこの機能はマニュアル等に明示されているのは極まれ(マイクロ総研ぐらい?)なので、購入後か購入前にインターネット上で情報収集しないとわからないという問題があり、これが自宅サーバでのPASV対応を困難にしている。この機能を有しているものとしては、最近(2005年)のCrega製品やOPTシリーズ、NECのDR202等があり、これらのルータならFTPデーモンでPASV対応していなくても、PASVでのサーバ公開が可能である。本機能は一般的に止められないので、FTPでSSL通信しようと考えている場合はこの機能がないルータでないとできないので注意が必要である。(本問題の対策としては、sftpやSCPを使用する方法もある。)また、標準外ポートではこの機能は働かないので注意が必要である。■ProFTPDによるPASVモードでの運用PASVモードでの問題点は、FTPDがクライアントからのPASVコマンドに対してサーバ自身のプライベートアドレスを待ち受けアドレスとして返してしまう点である。調査した結果、おやじが使用しているProFTPDでは、マスカレード対策ができることが判明し、試験の結果、上記、ケース3、4とも問題なく運用できることが確認できたので、その方法を下記に示す。ProFTPDの設定ファイル(proftpd.conf)に、下記を追加する。追加内容は、クライアントからのPASVコマンドの応答として通知する待ち受けアドレスをルータのWAN側アドレスもしくはドメイン名で返すための設定と、PASVで使用するデータコネクションのポート番号範囲である。ドメイン名で返すための設定とあるが、正確には、ProFTPDがDNSを引いてドメイン名をIPアドレス(ルータのWAN側IPアドレス)に変換して通知する。これが、後述のProFTPDの動作モードに影響する。・MasqueradeAddressMasqueradeAddressでは、ルータのWAN側アドレス又はドメイン名が指定できるが、固定IPの場合はルータのWAN側アドレスでも良いが、動的IPの場合は、必然的にDDNSでのドメイン名になる。動的IPの場合、ProFTPDはstandaloneでは、IPの変化が起きてもDNSを牽き直さないので、必ずinetdで走らせる必要がある。・PassivePortsPassivePortsでは、PASVモードで使用するポート番号(1024以上)の最小と最大で範囲指定する。おやじは、家庭用なのでそれほど多くは必要ないのと使いまわしされるので、MaxInstancesと同じ30ポートとし、他のデーモンで使ってない4000-4029とした。このポートはインターネット側から接続が開始されるので、ルータのスタティックNATでサーバにNATすると同時に、フルタリングも開ける必要がある。運用は、下記のようになる。・家庭内からのアクセスは、PORTモードのみとなる。PASVモードでアクセスすると上記設定で動作するため、ルータのWAN側アドレス(グローバルアドレス)が通知されてしまい、アクセスできなくなる。・一般的には関係ないが、おやじのようにインターネットと同じドメイン名で内向きDNSを建てていると、自宅DNSでは自分のドメイン(おやじの場合なら、example.zive.net)は牽けないため接続できない。exampleftp.zive.net)を登録し、このドメイン名をMasqueradeAddressに記述することで、この問題を回避した。