この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: FTP
SEOタイトル: FTP プロトコル完全ガイド - ポート 21/20 / Active / Passive / FTPS / SFTP の違い

この記事の要点
  • FTP (File Transfer Protocol) は RFC 959 で 1985 年に標準化されたファイル転送プロトコル
  • 制御チャネル 21 番ポート、データチャネル 20 番ポート(Active モード時)
  • Active モードはサーバからクライアントへ接続。Passive モードはクライアントからサーバへ接続(NAT 環境では Passive 必須)
  • FTP は平文通信 → パスワードもデータも丸見え。現代は SFTP(SSH 上)または FTPS(TLS 上)を使う
  • コマンド: USER / PASS / LIST / RETR / STOR / PASV / PORT

FTP とは

FTP (File Transfer Protocol) は、ホスト間でファイルを送受信するためのアプリケーション層プロトコルです。1985 年に RFC 959 で標準化された TCP/IP の古典的プロトコルで、現在も Web サイトのアップロードや組み込み機器のファーム更新等で使われています。

制御チャネルとデータチャネル

FTP の最大の特徴は2 本の TCP コネクションを使うこと:

チャネルポート用途
制御チャネル (Control)サーバ 21コマンド送受信(ログイン、cd、ls 等)
データチャネル (Data)Active: サーバ 20
Passive: ランダム高ポート
ファイル本体・ディレクトリリスト転送

Active モード(PORT モード)

従来の標準モード。サーバからクライアントへデータチャネルを張る:

クライアント                          サーバ
    |                                  |
    | --- 21 番に接続 (制御) -------->  |
    | <-- 220 Welcome ---------------- |
    | --- USER alice ---------------> |
    | --- PASS xxx -----------------> |
    | --- PORT 192,168,1,10,200,15 -> |
    |     (= 自分のIPと開放ポート通知)
    | --- LIST ---------------------> |
    | <== 20 番から自分の指定ポートへ接続 ==== |  ← サーバ発信!
    | <-- ファイルリスト送信 -------- |

クライアント側で NAT / Firewall がある場合、サーバからクライアントへの接続がブロックされて失敗します。これが Passive モードが生まれた理由。

Passive モード(PASV モード)

現代のデフォルト。クライアントからサーバへデータチャネルを張る:

クライアント                          サーバ
    |                                  |
    | --- 21 番に接続 (制御) -------->  |
    | <-- 220 Welcome ---------------- |
    | --- USER alice ---------------> |
    | --- PASS xxx -----------------> |
    | --- PASV -------------------> |
    | <-- 227 Entering Passive Mode  |
    |     (192,168,1,1,48,123)        |
    |     ↑ サーバが使うIPと開放ポート
    | --- 指定された高ポートに接続 ==> |  ← クライアント発信!
    | <-- ファイルリスト送信 -------- |

NAT 越えで自然に動くため、現代の FTP クライアントは PASV をデフォルトにしています。

FTP コマンド(プロトコルレベル)

コマンド意味
USERユーザ名USER alice
PASSパスワードPASS secret
PWD現在のディレクトリPWD
CWDディレクトリ移動CWD /var/www
LIST / NLST一覧LIST
RETRダウンロードRETR index.html
STORアップロードSTOR upload.zip
DELE削除DELE old.log
MKD / RMDディレクトリ作成 / 削除MKD newdir
TYPE転送タイプTYPE I(バイナリ)
TYPE A(ASCII)
PASV / PORTデータチャネル方式PASV
QUIT切断QUIT

FTP の応答コード

HTTP に似た 3 桁の応答コードを返します:

コード意味
1xx処理開始(継続応答)150 ファイル転送開始
2xx成功220 サーバ準備完了、226 転送完了
3xx追加情報待ち331 ユーザ OK パスワード要求
4xx一時的エラー(再試行可)421 サーバ閉鎖中
5xx恒久的エラー530 ログイン失敗、550 ファイル無し

コマンドライン FTP の使い方

# 接続
ftp example.com
# Connected to example.com.
# 220 (vsFTPd 3.0.5)
# Name (example.com:alice): alice
# 331 Please specify the password.
# Password:
# 230 Login successful.

# 基本コマンド
ftp> pwd                 # 現在のディレクトリ
ftp> ls                  # 一覧
ftp> cd /var/www         # 移動
ftp> binary              # バイナリモード(画像/動画転送時必須)
ftp> passive             # Passive モード明示
ftp> get index.html      # ダウンロード
ftp> put upload.zip      # アップロード
ftp> mget *.jpg          # 複数ダウンロード
ftp> mput *.log          # 複数アップロード
ftp> delete old.log      # 削除
ftp> mkdir backup        # ディレクトリ作成
ftp> bye                 # 切断

FTP は平文通信 - セキュリティ問題

FTP 最大の問題はすべてが平文であること:

  • ユーザ名・パスワードが通信路で丸見え
  • 転送ファイル自体も平文
  • 中間者攻撃(MITM)でパスワード盗難・ファイル改ざんが容易
  • 公衆 Wi-Fi での FTP 利用は完全に危険

本番運用では FTP の使用を即刻やめて、SFTP または FTPS への移行を強く推奨します。

FTPS と SFTP の違い

項目FTPSSFTP
プロトコルFTP over TLS/SSLSSH の File Transfer Subsystem
RFCRFC 4217RFC(Internet Draft)+ OpenSSH 拡張
ポート暗黙: 990
明示: 21(STARTTLS で昇格)
22(SSH と同じ)
認証パスワード / 証明書パスワード / SSH 鍵
チャネル数2 本(制御 + データ)1 本(SSH 多重化)
NAT/Firewall 越え難しい(データポート問題が残る)★ 容易
推奨度互換性が必要なら★ 推奨

SFTP の使い方(推奨)

# SSH 鍵で接続
sftp -i ~/.ssh/id_rsa alice@example.com

# パスワードで接続
sftp alice@example.com

# 基本コマンド(FTP とほぼ同じ)
sftp> pwd
sftp> ls
sftp> cd /var/www
sftp> get index.html
sftp> put upload.zip
sftp> bye

# 1 コマンドでファイル転送
scp upload.zip alice@example.com:/var/www/
scp alice@example.com:/var/www/index.html .

# 同期は rsync over SSH
rsync -avz ./localdir/ alice@example.com:/var/www/htdocs/

vsftpd / ProFTPD の設定例

# /etc/vsftpd/vsftpd.conf
listen=YES
anonymous_enable=NO            # 匿名ログイン無効
local_enable=YES               # ローカルユーザ許可
write_enable=YES               # 書込み許可
chroot_local_user=YES          # ホームディレクトリに閉じ込め
pasv_min_port=30000            # Passive モードポート範囲
pasv_max_port=30100
ssl_enable=YES                 # FTPS 有効化
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
force_local_data_ssl=YES
force_local_logins_ssl=YES

よくあるトラブル

症状原因対処
接続できるがファイル一覧が出ないActive モードで NAT/FWPassive モードに切替
Passive でも一覧が出ないPassive ポート範囲未開放サーバの pasv_min_port〜max_port を FW で開放
テキストファイルが壊れるASCII モードで転送binary モードに切替
大きなファイルが途中で切れる制御チャネルがタイムアウトkeep-alive 設定
500 OOPSvsftpd のセキュリティチェックchroot 設定確認 / allow_writeable_chroot=YES

FAQ

Q: FTP と HTTP のファイルダウンロード、どちらが速い?
A: HTTP の方が現実的に速い。FTP は接続オーバーヘッドが大きく、CDN 等にも向きません。配布用には HTTP(S) を使うべき。

Q: 古いシステムが FTP しか対応していない
A: FTPS(TLS 付き)への移行が比較的容易。サーバ側で TLS を有効化、クライアントは「明示的 FTPS」を選択。最終手段として VPN 越し FTP も有効。

Q: FTP 21 番ポートを Web サーバと共存させたい
A: 別ポート(例: 2121)で待ち受け可能。vsftpd なら listen_port=2121。クライアントは ftp -p 2121 ...