はじめに
ファイアウォールやその他のインターネット接続の問題に対処する際に最もよく見られる質問の 1 つは、アクティブ FTP (ファイル転送プロトコル) とパッシブ FTP (ファイル転送プロトコル) の違いと、それらのいずれかまたは両方をサポートする最善の方法です。願わくば、次のテキストが、ファイアウォール環境で FTP をサポートする方法に関する混乱の一部を解消するのに役立つことを願っています.
この投稿には、アクティブおよびパッシブの両方のコマンド ライン FTP セッションの例が含まれています。これらのセッションの例は、物事を少し明確にするのに役立つはずです.また、FTP セッション中に舞台裏で何が起こっているかについての素晴らしい図も提供します。さて、情報に…
基本
FTP は、TCP ベースのサービスのみです。 FTP には UDP コンポーネントはありません。 FTP は、「データ」ポートと「コマンド」ポート (制御ポートとも呼ばれます) の 2 つのポートを利用するという点で、珍しいサービスです。従来、これらはコマンド ポート用のポート 21 とデータ ポート用のポート 20 です。しかし、モードによっては、データ ポートが常にポート 20 にあるとは限らないことがわかったときに、混乱が始まります。
アクティブ FTP
アクティブ モードの FTP では、クライアントはランダムな非特権ポート (N> 1024) から FTP サーバーのコマンド ポートであるポート 21 に接続します。次に、クライアントはポート N+1 のリッスンを開始し、FTP コマンド PORT N+1 を FTP に送信します。サーバ。その後、サーバーはローカル データ ポート (ポート 20) からクライアントの指定されたデータ ポートに接続し直します。
サーバー側のファイアウォールの観点から、アクティブ モードの FTP をサポートするには、次の通信チャネルを開く必要があります:
- どこからでも FTP サーバーのポート 21 (クライアントが接続を開始)
- FTP サーバーのポート 21 からポート> 1024 へ (サーバーはクライアントの制御ポートに応答します)
- FTP サーバーのポート 20 からポート> 1024 へ (サーバーはクライアントのデータ ポートへのデータ接続を開始します)
- ポート> 1024 からの FTP サーバーのポート 20 (クライアントはサーバーのデータ ポートに ACK を送信します)
引き出すと、接続は次のようになります。
- クライアント ポート 1026 (Cmd) からサーバー ポート 21 (Cmd) へ
- サーバー ポート 21 (Cmd) からクライアント ポート 1026 (Cmd) へ
- サーバー ポート 20 (データ) からクライアント ポート 1027 (データ) へ
- クライアント ポート 1027 (データ) からサーバー ポート 20 (データ) へ
ステップ 1 で、クライアントのコマンド ポートはサーバーのコマンド ポートに接続し、コマンド PORT 1027 を送信します。次に、ステップ 2 でサーバーがクライアントのコマンド ポートに ACK を返します。ステップ 3 で、サーバーはローカル データ ポートで接続を開始します。クライアントが以前に指定したデータ ポート。最後に、ステップ 4 に示すように、クライアントは ACK を返します。
アクティブ モード FTP の主な問題は、実際にはクライアント側にあります。 FTP クライアントは、サーバーのデータ ポートに実際に接続するわけではありません。サーバーがリッスンしているポートをサーバーに伝えるだけで、サーバーはクライアントの指定されたポートに接続し直します。クライアント側のファイアウォールからは、外部システムが内部クライアントへの接続を開始しているように見えますが、通常はブロックされています。
アクティブな FTP の例
以下は、アクティブな FTP セッションの実際の例です。変更されたのは、サーバー名、IP アドレス、およびユーザー名だけです。この例では、FTP セッションは、標準の FTP コマンド行クライアントを実行する solaris ボックスである user01 (192.0.0.1) から、solaris[TM] 9 ftpd を実行する solaris ボックスである dest_serv (192.0.0.2) へ開始されます。デバッグ (-d) フラグは、FTP クライアントで使用され、舞台裏で何が起こっているかを示します。イタリック体のすべては、サーバーに送信された実際の FTP コマンドと、それらのコマンドから生成された応答を示すデバッグ出力です。
このダイアログについて考慮すべき興味深い点がいくつかあります。 PORT コマンドが発行されると、サーバーではなくクライアント (192.0.0.1) システムのポートが指定されることに注意してください。パッシブ FTP を使用すると、逆の動作が見られます。本題に入る前に、PORT コマンドのフォーマットについて簡単に説明します。以下の例でわかるように、コンマで区切られた一連の 6 つの数字としてフォーマットされています。最初の 4 オクテットは IP アドレスで、次の 2 オクテットはデータ接続に使用されるポートを構成します。実際のポートを見つけるには、5 番目のオクテットに 256 を掛けてから、合計に 6 番目のオクテットを追加します。したがって、以下の例では、ポート番号は ( (256*188) + 231)、つまり 48359 です。netstat で簡単にチェックすると、この情報を確認できます。
$ ftp -d dest_serv Connected to dest_serv. 220 dest_serv FTP server ready. Name (dest_serv:boqueron): root ---> USER root 331 Password required for root. Password: ---> PASS XXXX 230 User root logged in. ---> SYST 215 UNIX Type: L8 Version: SUNOS Remote system type is UNIX. ---> TYPE I 200 Type set to I. Using binary mode to transfer files. ftp> ls ---> PORT 192,0,0,1,188,231 200 PORT command successful. ---> TYPE A 200 Type set to A. ---> NLST 150 Opening ASCII mode data connection for file list. TT_DB bin (...) var vol xfn 226 Transfer complete. 191 bytes received in 0.03 seconds (6.16 Kbytes/s) ---> TYPE I 200 Type set to I. ftp> quit ---> QUIT 221-You have transferred 0 bytes in 0 files. 221-Total traffic for this session was 599 bytes in 1 transfers. 221-Thank you for using the FTP service on dest_serv. 221 Goodbye. # netstat -a | grep 48359 dest_serv.ftp-data user01.48359 33580 0 49640 0 TIME_WAIT
パッシブ FTP
クライアントへの接続を開始するサーバーの問題を解決するために、別の FTP 接続方法が開発されました。これは、クライアントがサーバーにパッシブ モードであることを伝えるために使用するコマンドにちなんで、パッシブ モード (PASV) として知られていました。
パッシブ モードの FTP では、クライアントがサーバーへの両方の接続を開始し、ファイアウォールがサーバーからクライアントへの着信データ ポート接続をフィルタリングする問題を解決します。 FTP 接続を開くと、クライアントは 2 つのランダムな非特権ポートをローカルで開きます (N> 1024 および N+1)。最初のポートはポート 21 でサーバーに接続しますが、PORT コマンドを発行してサーバーがデータ ポートに接続できるようにする代わりに、クライアントは PASV コマンドを発行します。この結果、サーバーはランダムな非特権ポート (P> 1024) を開き、PORT P コマンドをクライアントに送り返します。次に、クライアントはポート N+1 からサーバーのポート P への接続を開始して、データを転送します。
サーバー側のファイアウォールの観点から、パッシブ モードの FTP をサポートするには、次の通信チャネルを開く必要があります:
- どこからでも FTP サーバーのポート 21 (クライアントが接続を開始)
- FTP サーバーのポート 21 からポート> 1024 へ (サーバーはクライアントの制御ポートに応答します)
- FTP サーバーのポート> どこからでも 1024 (クライアントは、サーバーによって指定されたランダムなポートへのデータ接続を開始します)
- FTP サーバーのポート> 1024 からリモート ポート> 1024 (サーバーはクライアントのデータ ポートに ACK (およびデータ) を送信します)
描画すると、パッシブ モードの FTP 接続は次のようになります。
- クライアント ポート 1026 (Cmd) からサーバー ポート 21 (Cmd) へ
- サーバー ポート 21 (Cmd) からクライアント ポート 1026 (Cmd) へ
- クライアント ポート 1027 (データ) からサーバー ポート 2024 へ
- サーバー ポート 2024 (Cmd) からクライアント ポート 1027 (データ) へ
ステップ 1 で、クライアントはコマンド ポートでサーバーに接続し、PASV コマンドを発行します。次に、サーバーは手順 2 で PORT 2024 を使用して応答し、データ接続をリッスンしているポートをクライアントに伝えます。ステップ 3 で、クライアントはデータ ポートから指定されたサーバー データ ポートへのデータ接続を開始します。最後に、サーバーはステップ 4 で ACK をクライアントのデータ ポートに送り返します。
パッシブ モードの FTP は、クライアント側の問題の多くを解決しますが、サーバー側ではさまざまな問題を引き起こします。最大の問題は、サーバー上の多数のポートへのリモート接続を許可する必要があることです。幸いなことに、solaris in.ftpd デーモンを含む多くの FTP デーモンでは、FTP サーバーが使用するポートの範囲を管理者が指定できます。詳細については、付録 1 を参照してください。
2 番目の問題には、パッシブ モードをサポートする (またはサポートしない) クライアントのサポートとトラブルシューティングが含まれます。たとえば、Solaris ftp デーモンで提供されるコマンド ライン FTP ユーティリティは、Solaris 9 (sccs v1.20 以降) 以降のパッシブ モードをサポートしています。 man ページ (.ftpd 内)、オプション -p を参照してください。
World Wide Web の普及により、多くの人が Web ブラウザを FTP クライアントとして使用することを好みます。ほとんどのブラウザーは、ftp:// URL にアクセスするときにパッシブ モードのみをサポートします。これは、サーバーとファイアウォールが何をサポートするように構成されているかによって、良い場合も悪い場合もあります。
パッシブ FTP の例
以下は、パッシブ FTP セッションの実際の例です。変更されたのは、サーバー名、IP アドレス、およびユーザー名だけです。この例では、FTP セッションは、標準の FTP コマンド行クライアントを実行する solaris ボックスである user01 (192.0.0.1) から、solaris 9 ftpd を実行する solaris ボックスである dest_serv (192.0.0.2) に対して開始されます。デバッグ (-d) フラグは、FTP クライアントで使用され、舞台裏で何が起こっているかを示します。イタリック体のすべては、サーバーに送信された実際の FTP コマンドと、それらのコマンドから生成された応答を示すデバッグ出力です。通常のサーバー出力は黒で表示され、ユーザー入力は太字で表示されます。
アクティブな FTP の例とは対照的に、この例の PORT コマンドの違いに注意してください。ここでは、クライアントではなく、サーバー (192.0.0.2) システムでポートが開かれていることがわかります。上記の PORT コマンドの形式に関する説明は、アクティブな FTP の例 セクションを参照してください。
$ ftp -d dest_serv Connected to dest_serv. 220 dest_serv FTP server ready. Name (dest_serv:boqueron): root ---> USER root 331 Password required for root. Password: ---> PASS XXXX 230 User root logged in. ---> SYST 215 UNIX Type: L8 Version: SUNOS Remote system type is UNIX. ---> TYPE I 200 Type set to I. Using binary mode to transfer files. ftp> passive Passive mode on. ftp> ls ---> PASV 227 Entering Passive Mode (192,0,0,2,7,176) ---> TYPE A 200 Type set to A. ---> NLST 150 Opening ASCII mode data connection for file list. TT_DB bin cdrom (...) vol xfn 226 Transfer complete. 191 bytes received in 0.027 seconds (7.04 Kbytes/s) ---> TYPE I 200 Type set to I. ftp> quit ---> QUIT 221-You have transferred 0 bytes in 0 files. 221-Total traffic for this session was 599 bytes in 1 transfers. 221-Thank you for using the FTP service on dest_serv. 221 Goodbye.
まとめ
次の表は、管理者が各 FTP モードがどのように機能するかを覚えるのに役立ちます:
Active FTP : command : client >1024 -> server 21 data : client >1024 <- server 20 Passive FTP : command : client >1024 -> server 21 data : client >1024 -> server >1024
アクティブ FTP とパッシブ FTP の長所と短所の簡単なまとめも用意されています。
アクティブ FTP は FTP サーバーの管理者にとっては有益ですが、クライアント側の管理者にとっては有害です。 FTP サーバーは、クライアント側のファイアウォールによってほぼ確実にブロックされる、クライアントのランダムな上位ポートへの接続を試みます。パッシブ FTP はクライアントにとって有益ですが、FTP サーバー管理者にとっては有害です。クライアントはサーバーへの両方の接続を確立しますが、そのうちの 1 つはランダムな上位ポートへの接続であり、サーバー側のファイアウォールによってほぼ確実にブロックされます。
幸いなことに、ある程度の妥協点があります。 FTP サーバーを実行している管理者は、多数のクライアントがサーバーにアクセスできるようにする必要があるため、ほぼ確実にパッシブ FTP をサポートする必要があります。 FTP サーバーが使用する限定されたポート範囲を指定することにより、サーバー上の高レベル ポートの公開を最小限に抑えることができます。したがって、この範囲のポートを除くすべてをサーバー側でファイアウォールで保護できます。これにより、サーバーに対するすべてのリスクが排除されるわけではありませんが、大幅に減少します。詳細については、付録 1 を参照してください。