本文へ移動

インフラ転職コンパスわからないところから、ひとつずつ。

メニュー

FTPとは?TCP・ポート20/21・アクティブとパッシブを図解

FTPの説明では、「TCP」「20番と21番」「アクティブとパッシブ」が一度に出てきます。先に番号だけ覚えると、誰が何のために接続するのか分からなくなります。

まず、PCでサーバーのファイルを取得する操作を考えます。PCから取得を依頼し、サーバーがファイルを返す。このやり取りを、接続とポート番号まで含めて順に説明します。最後に、get・putなどの操作と、FTPS・SFTP・TFTPの違いを扱います。

FTPとは?ファイルを取得・保存するための通信

FTP(File Transfer Protocol)は、クライアントとサーバーの間でファイルを転送するためのプロトコルです。読み方は「エフティーピー」です。プロトコルとは、通信相手と共通で使う手順やデータ形式の決まりです。

たとえば、PCからサーバーへファイルを保存する、サーバーにあるファイルをPCへ取得する、といった操作に使います。ファイル転送のほかに、サーバー内のファイル一覧の取得、フォルダーの作成、ファイル名の変更などもできます。

クライアントは操作を依頼し、サーバーは依頼を処理する

FTPクライアントは、サーバーへ接続して操作を依頼するソフトです。自分のPCで使うFTPソフトが該当します。FTPサーバーは、その接続を受け付け、ユーザーを認証し、ファイルの取得や保存などを処理します。

クライアントとサーバーは、ファイルを送る側・受け取る側で決まる名前ではありません。ダウンロードではサーバーが送り、アップロードではクライアントが送ります。どちらの操作でも、依頼する側がクライアントです。

操作 ファイルが流れる向き PCで行うこと
ダウンロード サーバー → クライアント サーバーのファイルを取得する
アップロード クライアント → サーバー PCのファイルをサーバーへ保存する

FTPがTCPを使う理由

FTPはUDPではなく、TCPを使います。FTPはファイルの取得・保存などを扱うアプリケーション層のプロトコルで、TCPはそのデータを運ぶトランスポート層のプロトコルです。OSI参照モデルでは、FTPは第7層、TCPは第4層に相当します。

ファイルは、通信するときに複数のデータに分かれて送られます。途中のデータが欠けたままでは、ファイルを正しく復元できません。TCPには、届いたデータを確認する応答、届かないデータの再送、順番をそろえる仕組みがあります。FTPはこれらを使ってファイルを転送します。

TCPの3ウェイハンドシェイクは、通信を始める前に接続を確立する手順です。再送や順序の管理とは役割が異なります。接続を作った後、TCPがデータの到達や順序を管理します。

制御接続とデータ接続は、別のTCP接続

FTPでは、操作を指示する接続と、ファイル本体を転送する接続を分けます。それぞれを「制御接続」「データ接続」と呼びます。同じPCとサーバーの間でも、別々のTCP接続です。

FTPクライアントとサーバー間の論理接続図。制御接続はTCP21で命令と応答、別のデータ接続でgetとputのファイル内容を運ぶ。
接続の役割を示した図です。物理的な配線やパケットの時系列は表していません。 タップすると拡大できます。

制御接続:ログインと、操作の指示・応答

最初にクライアントから、サーバーのTCP/21へ接続します。「TCP/21」は、TCPのポート番号21という意味です。この接続でユーザー名とパスワードを送信し、ファイルの取得や保存を指示します。サーバーからの成功・失敗の応答も、制御接続に返ります。

データ接続:ファイル本体と、ファイル一覧

ファイルの内容は、制御接続とは別のデータ接続で転送します。サーバー内の一覧を表示するときも、一覧のデータをこの接続で受け取ります。

そのため、ログインには成功しても、一覧表示やファイル転送だけ失敗することがあります。ログインで確認できるのは、制御接続で認証まで進めたことです。データ接続まで通るかは、別に確認します。

補足:ここでいうポート番号の意味

ポート番号は、PCやサーバー内で通信を受け付けるサービスや接続を区別する番号です。IPアドレスが相手の機器を示し、ポート番号がその機器内の通信先を示します。スイッチにLANケーブルを挿す物理ポートとは別の意味です。

クライアント側のポート番号もTCP接続に必要です。通常はOSやクライアントソフトが選ぶため、ユーザーが21番のように固定して入力する番号ではありません。

ポート20・21と、アクティブ/パッシブの違い

アクティブモードとパッシブモードで変わるのは、データ用のTCP接続をどちらから始めるかです。制御接続は、どちらのモードでもクライアントからサーバーの21番へ開始します。

以下の図では、クライアントを10.78.44.10、サーバーを10.78.44.20とします。同じプライベートネットワーク内の説明用アドレスです。53120・53121・52440も例として選んだ番号で、FTPに固定された番号ではありません。

アクティブモード:サーバーからデータ接続を始める

クライアントは、データ接続を待ち受けるポートを用意します。そのIPアドレスとポート番号を、制御接続のPORTコマンドでサーバーへ通知します。

図では、クライアントが53121番で待ちます。通知を受けたサーバーは、クライアントの53121番へ新しいTCP接続を始めます。従来の標準的なアクティブFTPでは、このデータ接続のサーバー側送信元ポートが20番です。

アクティブFTPの時系列図。制御はクライアント53120からサーバー21。PORT通知後、サーバー20からクライアント53121へデータ接続のSYNを送る。
アクティブの概略です。PORTへの応答と各TCP接続のハンドシェイクは省略しています。20番は従来の標準的なデータ接続元です。 タップすると拡大できます。

ここでサーバーが最初に送るのは、TCP接続を始めるSYNです。その後、SYN/ACK、ACKを交換してデータ接続を確立します。ファイルの送信は、その接続を使って行います。

クライアント側のファイアウォールが、外から始まる新しいTCP接続を許可していなければ、ここで止まります。クライアントがNATの内側にいる場合も、サーバーから通知先へ到達できるかを確認する必要があります。

パッシブモード:クライアントからデータ接続を始める

パッシブでは、サーバー側がデータ接続を待ち受けます。クライアントが制御接続でPASVを送ると、サーバーは227という応答で、データ用のIPアドレスとポート番号を返します。

図では、サーバーが52440番を通知します。クライアントは、その52440番に向けてSYNを送ります。データ接続もクライアントから始まるため、クライアント側のファイアウォールやNATで扱いやすくなります。ただし、サーバー側で52440番への接続を許可している必要があります。

パッシブFTPの時系列図。TCP21の制御接続でPASVと227応答を交換し、クライアント53121からサーバー52440へデータ接続のSYNを送る。
パッシブの概略です。データ接続の開始方向と、ダウンロードするファイルの方向が逆になる点を確認できます。IP・動的なポート番号は説明用です。 タップすると拡大できます。
項目 アクティブ パッシブ
制御接続の開始 クライアント → サーバー:21 クライアント → サーバー:21
データ接続の開始 サーバー:20 → クライアント:53121
※20番は従来の標準的な例
クライアント:53121 → サーバー:52440
データ接続の待ち受け クライアント サーバー
ダウンロード・アップロード どちらも可能 どちらも可能

21番は、両モードで使う制御用のサーバーポートです。一方、20番は従来のアクティブFTPで使うサーバー側データ接続元です。パッシブのデータ接続には通常20番を使わず、サーバーが通知したポートへ接続します。実際の番号は、サーバーの実装や設定、NATによって変わる場合があります。

ポートと接続の標準的な動作:RFC 959(FTP)

補足:PASVの応答にある数字と、EPSVの違い

PASVの応答では、IPアドレスとポート番号を6個の数字で表します。たとえば、次の応答は10.78.44.20の52440番を示します。

227 Entering Passive Mode (10,78,44,20,204,216)
IPアドレス:10.78.44.20
ポート番号:204 × 256 + 216 = 52440

拡張コマンドのEPSVでは、229応答でポート番号だけを通知します。IPアドレスは制御接続の相手と同じアドレスを使います。たとえば、229 Entering Extended Passive Mode (|||52440|)です。PASVで到達できないIPを通知する問題を避けやすくなりますが、データ用ポートの許可は引き続き必要です。

アクティブにも、PORTを拡張したEPRTがあります。IPv6なども扱えるようにしたコマンドです。

拡張コマンドの仕様:RFC 2428(EPRT・EPSV)

TCP接続の確立から、FTPログインまで

FTPソフトで接続ボタンを押すと、最初にTCP接続を確立します。ここでは、クライアントの53120番から、サーバーの21番へ接続する例で説明します。

  1. SYN:クライアントから、TCP接続の開始を要求する。
  2. SYN/ACK:サーバーが要求を受け取り、接続の開始に応答する。
  3. ACK:クライアントが応答を確認し、制御用のTCP接続が確立する。

ここまでで、FTPのユーザー認証はまだ完了していません。確立したTCP接続の中で、FTPのコマンドと応答を交換します。

FTPログインの時系列図。TCPのSYN、SYN/ACK、ACKの後に、FTPの220、USER、331、PASS、230を交換する。
通常の平文FTPでの代表的な認証例です。認証方式やサーバー設定によって応答は変わります。図ではFTP以外のTCP確認応答を省略しています。 タップすると拡大できます。

図の220は、サービスの準備ができたことを知らせる応答です。クライアントがUSERでユーザー名を送ると、サーバーは331でパスワードを求めます。クライアントがPASSを送信し、認証に成功すると230が返ります。これは、一般的なユーザー名・パスワード認証の例です。

数字はFTPの応答コードです。TCPのACKとは別に、FTPの処理結果を伝えます。TCP接続の成功、FTPログインの成功、ファイル転送の成功を、それぞれ分けて確認できます。

データ接続を作るときにも、別の3ウェイハンドシェイクを行います。アクティブならサーバーが最初のSYNを送り、パッシブならクライアントが送ります。

FTPコマンドの使い方:get・put・cd・lcd

対話型のFTPクライアントでは、ftp>という入力欄にコマンドを入力します。まず区別したいのは、ファイルを受け取るgetと、送るputです。

コマンド 操作 入力例
open FTPサーバーへ接続する open 10.78.44.20
get サーバーから1ファイルを取得する get report.csv
put PCから1ファイルを保存する put upload.csv
mget 複数ファイルを取得する mget *.txt
mput 複数ファイルを保存する mput *.txt
ls / dir サーバー内のファイル一覧を表示する ls / dir
pwd サーバー側の作業フォルダーを確認する pwd
cd サーバー側の作業フォルダーを変更する cd data
lcd PC側の作業フォルダーを変更する lcd C:\work
binary バイナリ形式で転送する設定に変える binary
ascii テキスト用のASCII転送形式に変える ascii
bye / quit 接続を終了し、FTPソフトを閉じる bye / quit

cdはサーバー側、lcdは自分のPC側

FTPでは、サーバー側とPC側の両方に作業フォルダーがあります。cd dataは、サーバー側のdataフォルダーへ移動する操作です。lcd C:\workは、自分のPC側のC:\workへ移動する操作です。

その状態でget report.csvを実行すると、サーバー側のdataにあるreport.csvを、PC側のC:\workに保存します。put upload.csvなら、PC側のC:\workにあるupload.csvを、サーバー側のdataへ送ります。

binaryとasciiは、転送形式の指定

binaryは、ファイルのバイト列をそのまま転送する形式です。画像、ZIP、ファームウェアなど、内容が変わると壊れるファイルに使います。テキストでも、改行を含めて同じ内容を保ちたい場合に使えます。

asciiは、テキストを扱う転送形式で、システム間の違いに合わせて改行などを変換する場合があります。画像やZIPをASCII形式で転送すると、内容が変わって正常に開けなくなることがあります。binaryとasciiは暗号化の設定ではありません。

ファイルを取得・保存する操作例

次は、Windowsの対話型FTPクライアントで使うコマンドの例です。ログイン表示は説明用に簡略化しています。C:\workはあらかじめ用意し、サーバーのdataにreport.csv、PCのC:\workにupload.csvがある状態を想定します。

C:\> ftp 10.78.44.20
User: 練習用ユーザー名
Password: (入力した文字は通常表示されない)
ftp> binary
ftp> pwd
ftp> ls
ftp> cd data
ftp> lcd C:\work
ftp> get report.csv
ftp> put upload.csv
ftp> bye

この例は操作コマンドの説明です。Windows標準のftp.exe、LinuxのFTPクライアント、GUIのFTPソフトでは、対応するコマンドやモードの設定方法が異なります。FileZillaなどのGUIでは、ボタンやメニューで同じ操作を行います。

必要なときに使うコマンド:作成・削除・設定・ログ
コマンド 操作 入力例
mkdir サーバー側にフォルダーを作る mkdir backup
rmdir サーバー側の空フォルダーを削除する rmdir backup
delete サーバー側の1ファイルを削除する delete old.txt
mdelete サーバー側の複数ファイルを削除する mdelete *.bak
rename サーバー側のファイル名を変える rename a.txt b.txt
prompt 複数転送などで、各ファイルの確認表示を切り替える prompt
hash 転送の進捗を示す記号の表示を切り替える hash
status クライアントの状態や設定を表示する status
debug コマンド送受信などのデバッグ表示を切り替える debug
quote FTPのプロトコルコマンドを直接送る quote NOOP
close サーバーとの接続を切り、FTPソフトは起動したままにする close
help 対応するコマンドや使い方を表示する help

削除系コマンドの対象はサーバー側です。promptの確認表示は、クライアントの設定や状態によって変わります。また、hashは進捗記号を表示する機能で、SHA-256などでファイルの同一性を調べる「ハッシュ計算」とは別です。

操作の確認:Microsoft Learn:Windowsのftpコマンド

getを実行したときの通信:RETRとファイル転送

ユーザーが入力するgetと、通信上で送るFTPの命令は、名前が異なります。getは通常RETR、putは通常STORに対応します。

PCで入力する操作 制御接続で送る命令 ファイル本体の向き
get report.csv RETR report.csv サーバー → PC
put upload.csv STOR upload.csv PC → サーバー

パケットを取得して確認すると、get report.csvではなくRETR report.csvが見えます。FTPクライアントが、ユーザーの操作をFTPの命令へ変換するためです。通常の平文FTPでは、USERやPASSも通信内容から読み取れます。

パッシブでreport.csvを取得する流れ

ログインを済ませ、binary形式を設定した状態から、getを実行する例です。制御接続はサーバーの21番、データ接続はサーバーが通知した52440番を使います。

パッシブFTPのgetの時系列図。PASVと227で52440番を通知し、データTCP接続、RETR、150応答、ファイル本体、226応答が続く。
パッシブでダウンロードする代表例です。データ接続の確立とRETRの細かな順序はクライアント実装によって変わります。データ接続はファイル転送後に閉じます。 タップすると拡大できます。
  1. PASVを送る。制御接続でデータ用の接続先を要求します。
  2. 227応答を受け取る。サーバーが10.78.44.20の52440番を通知します。
  3. データ用のTCP接続を作る。クライアントからサーバーの52440番へ接続します。
  4. RETR report.csvを送る。21番の制御接続で、ファイルの取得を依頼します。
  5. 150応答とファイル本体を受け取る。転送開始の応答は制御接続、ファイル内容はデータ接続を通ります。
  6. データ接続が閉じ、226応答を受け取る。転送完了の応答は、残っている制御接続に返ります。

これは代表的な順序です。データ接続の確立とRETRの細かな前後関係は、クライアント実装によって変わります。重要なのは、ファイル取得の命令と結果は制御接続、ファイル本体はデータ接続という分担です。

putの場合は、RETRの代わりにSTORを送り、ファイル本体がPCからサーバーへ流れます。パッシブでは、putでもgetでも、データ接続を始める側はクライアントです。

FTP・FTPS・SFTP・TFTPの違い

FTPに似た名前の転送方式には、FTPS、SFTP、TFTPがあります。違いは、TCPかUDPか、暗号化するか、どの仕組みでファイルを転送するかです。

方式 仕組み・暗号化 通信と代表的なポート
FTP 通常は暗号化しない。制御・データが別の接続 TCP。制御21、従来のアクティブのデータ接続元20。パッシブは通知されたポート
FTPS FTPをTLSで保護。制御・データが別の接続 TCP。Explicitは通常21、Implicitは通常990。データ接続のポートも必要
SFTP SSH上でファイルを転送。SSHで暗号化 TCP。通常22。FTPのような別のデータ用TCP接続は作らない
TFTP 簡易ファイル転送。標準では認証・暗号化なし UDP。初回の要求先は69。その後の転送は別のUDPポートも使用

FTP:TCPを使うが、通常は暗号化しない

通常のFTPでは、ユーザー名、パスワード、ファイル内容を暗号化しません。TCPがデータの欠落や順序を管理することと、通信内容を第三者から隠すことは別です。認証情報や機密ファイルを扱うなら、サーバーが対応するFTPSやSFTPなどの暗号化方式を確認します。

FTPS:FTPにTLSの保護を加える

Explicit FTPS(明示的FTPS)は、通常21番へ接続し、AUTH TLSでTLSの利用を要求します。TLSを開始した後、認証などを行います。Implicit FTPS(暗黙的FTPS)は、通常990番へ接続し、接続の最初からTLSを使います。

FTPSでも、制御接続とデータ接続は別です。制御接続を暗号化しただけで、データ接続の暗号化まで決まるとは限りません。PROT Pなどの設定で、ファイル内容を運ぶデータ接続も保護しているかを確認します。

TLSとデータ接続の保護:RFC 4217(FTP over TLS)/ポート登録:IANA:FTPS

SFTP:SSH上で動く、FTPとは別のプロトコル

SFTPは、SSHの暗号化された通信でファイルを転送するプロトコルです。通常はTCP/22へ接続し、SSHのパスワード認証や公開鍵認証などを使います。

FTPSと名前は似ていますが、SFTPはFTPをTLSで保護した方式ではありません。FTPの制御・データ接続を分ける仕組みや、アクティブ/パッシブの設定は使いません。通常のファイル転送では、1本のSSHのTCP接続内で操作とデータを扱います。

SSHによる転送の説明:OpenSSH:SFTPの機能

TFTP:UDPを使う簡易ファイル転送

TFTPは、機能を絞ったファイル転送プロトコルです。ネットワーク機器の設定や起動用ファイルの転送などで使われます。標準ではユーザー認証や暗号化、ファイル一覧の取得機能を持ちません。

初回の取得・保存要求を送る宛先は、通常UDP/69です。その後は、転送のために選ばれた別のUDPポートも使います。転送中の通信がすべて69番を使うわけではありません。

UDP自体にはTCPのような再送管理がありませんが、TFTP自身にはデータを受け取ったことを確認するACKと、再送の仕組みがあります。UDPを使うファイル転送でも、アプリケーション側で欠落を扱えます。

TFTPの仕様:RFC 1350(TFTP)

上のポート番号は標準的な設定です。管理者が別の番号を使う場合もあるため、接続ソフトでは方式とポート番号の両方を、接続先の指定に合わせます。

用語の読み方:FTP・FTPS・SFTP・TFTP

FTPは「エフティーピー」、FTPSは「エフティーピーエス」、SFTPは「エスエフティーピー」、TFTPは「ティーエフティーピー」です。FTPはFile Transfer Protocol、SFTPはSSH File Transfer Protocol、TFTPはTrivial File Transfer Protocolの略です。

ログインできても転送できない理由

FTPで「ログインは成功したが、一覧表示や転送で止まる」という場合は、データ接続を確認します。ログイン時と転送時では、使うTCP接続が異なるためです。

ファイアウォールは、制御用とデータ用を分けて確認する

パッシブでサーバーが52440番を通知しているなら、21番の許可だけでは不足します。クライアントから52440番への新しいTCP接続が通る必要があります。20番を許可しても、52440番への接続を許可したことにはなりません。

実際のサーバーでは、パッシブ用ポートを一定の範囲に制限する設定を使います。その範囲に合わせて、サーバー側のファイアウォールとNATの設定を確認します。必要な送信元・宛先・ポートを特定して許可条件を決めます。

アクティブなら、サーバーからクライアントの通知ポートへ始まる接続が対象です。クライアント側で新しい着信を受け付ける必要があるため、パッシブとは確認する側が変わります。

止まった段階 確認すること
21番へのTCP接続ができない 接続先IP、ポート、経路、ファイアウォール、FTPサーバーの待ち受け
TCP接続はできたがログインできない USER・PASSへの応答、ユーザー名、パスワード、認証設定
ログインできたが一覧・転送で止まる モード、通知されたデータ用IP・ポート、データ接続のSYNと応答
データ接続もできたが転送に失敗する FTP応答コード、ファイルの有無、アクセス権、保存先の容量

NATがある場合は、通知された接続先も確認する

NATは、通信のIPアドレスやポート番号を書き換える機能です。PASVの応答には接続先IPが含まれるため、サーバーがクライアントから到達できないアドレスを通知すると、制御接続にログインできてもデータ接続で失敗します。

ログにある通知IP・ポートと、クライアントが実際に接続した宛先を照合します。EPSVを使う場合は制御接続と同じ相手IPを使いますが、通知ポートの待ち受けと許可条件は確認が必要です。

ファイアウォールにFTPの制御内容を読み取って接続を補助する機能(FTP ALG)がある場合、FTPSで制御接続を暗号化すると内容を読み取れなくなることがあります。FTPSでは、製品の対応状況とデータ用ポート範囲を確認します。

最近の記事
ピックアップ