FTP パッシブモードのポート範囲チェッカー
FTP サーバーのパッシブモード用ポート範囲が開いていて、ファイアウォール越しに到達できるかを確認します。「unable to open data connection」のようなエラーの切り分けに欠かせません。
パッシブモードとは
FTP のパッシブモード(PASV)では、サーバーがデータ転送用にランダムな高番号ポートを開き、どのポートに接続すればよいかをクライアントに伝えます。これらのポートがファイアウォールで遮断されていると、ポート 21 の制御接続が正常に動いていても、ファイル転送は失敗します。
よく使われるパッシブポート範囲
| 範囲 | 使用例 |
|---|---|
| 49152–65535 | IANA の動的/エフェメラルポート範囲(多くのサーバーの既定値) |
| 40000–40100 | よく使われる独自範囲(cPanel、Plesk) |
| 30000–31000 | よく使われる独自範囲(FileZilla Server の既定値) |
アクティブモードとパッシブモードの違い
FTP は 2 本の接続を使います。コマンドをやり取りするポート 21 の制御接続と、ファイル転送やディレクトリ一覧のたびに張られる別のデータ接続です。モードによって、この 2 本目の接続をどちら側が開くかが決まります。
| アクティブモード(PORT) | パッシブモード(PASV) | |
|---|---|---|
| データ接続を開く側 | サーバー(クライアントへ接続し返す) | クライアント(サーバーへ接続する) |
| クライアントが送るコマンド | 自分のアドレスとポートを付けた PORT(または EPRT) | PASV(または EPSV) |
| 到達できる必要があるもの | クライアント側のポート(家庭用ルーターや企業のファイアウォールが遮断する) | サーバーのパッシブポート範囲 |
| 使っているもの | Windows 標準の ftp.exe、古いスクリプト | ほぼすべての最新クライアント(既定) |
パッシブモードはクライアントからの外向きの接続だけで済むため、NAT の内側でも動作し、最新のクライアントは既定でこちらを使います。その分の負担はサーバー側に移ります。サーバーのファイアウォールは、ポート 21 だけでなくパッシブ範囲全体でクライアントを受け入れなければなりません。
227 応答の読み方
サーバーは PASV に対して 6 つの数字で応答します。たとえば 227 Entering Passive Mode (203,0,113,10,195,80) です。最初の 4 つは接続先の IP アドレス、最後の 2 つはポートで、195 x 256 + 80 = 50000 となります。よくある失敗は次の 2 つです。
- ポートがファイアウォールで許可した範囲の外にある。サーバーのパッシブ範囲を開けた範囲に合わせるか、サーバーが実際に使っている範囲を開けてください。
- アドレスがプライベートアドレスになっている(たとえば 192.168.1.10)。サーバーが NAT の内側にあり、内部アドレスを通知しているためです。この場合、クライアントはディレクトリ一覧のたびに止まってしまいます。下の設定でサーバーに公開アドレスを教えてください。サーバーのアドレスを使い回して回避するクライアントもありますが、直すべきはサーバー側です。
EPSV の場合、応答は 229 Entering Extended Passive Mode (|||50000|) となり、ポートだけでアドレスは含まれないため、プライベートアドレスの問題は起きません。ただし、ポートが開いている必要があるのは同じです。
主なサーバーでのパッシブ範囲の設定
- vsftpd:vsftpd.conf で
pasv_min_port=40000、pasv_max_port=40100を指定し、サーバーが NAT の内側にあるときはpasv_addressに公開 IP を設定します。 - ProFTPD:
PassivePorts 40000 40100に加え、公開アドレス用にMasqueradeAddressを指定します。 - Pure-FTPd:
PassivePortRange 40000 40100とForcePassiveIPを指定します。 - FileZilla Server:パッシブモードの設定で、独自のポート範囲と通知する公開 IP を指定できます。
- IIS:サーバー レベルの「FTP ファイアウォールのサポート」(FTP Firewall Support)で、データ チャネルのポート範囲とファイアウォールの外部 IP アドレスを設定します。新しい範囲を有効にするには、FTP サービスの再起動が必要な場合があります。
そのうえで、サーバーの手前にあるすべての場所(OS のファイアウォール、クラウドのセキュリティグループ、ルーターのポート転送)で同じ範囲の TCP を開け、上のチェッカーで範囲内のポートをいくつか確認してください。
結果の読み方
開いているは、インターネットからそのポートへの TCP 接続が受け付けられたことを意味し、経路上で遮断しているものはありません。応答なしは、たいていファイアウォールが接続の試みを黙って破棄したことを示します。閉じているは、何かが拒否で応答したことを意味します。多くの場合はサーバー自身で、多くの FTP サーバーはクライアントが PASV を送った直後の一瞬しかパッシブポートで待ち受けないためです。
つまり、転送をしていないサーバーでは、範囲内のポートが閉じていても正常です。本当に警戒すべきなのは、範囲全体が応答なしになる場合です。最終的な確認は、実際のクライアントからパッシブモードでディレクトリ一覧を取ることです。ログインできたのに一覧で止まるなら、遮断されているのはデータ接続です。FTP 接続テスターでは前半、つまりサーバーが応答してログインを受け付けるかを確認できます。