タイトル: FTP
SEOタイトル: FTP プロトコル完全ガイド - ポート 21/20 / Active / Passive / FTPS / SFTP の違い
| この記事の要点 |
|
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 の違い
| 項目 | FTPS | SFTP |
|---|---|---|
| プロトコル | FTP over TLS/SSL | SSH の File Transfer Subsystem |
| RFC | RFC 4217 | RFC(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/FW | Passive モードに切替 |
| Passive でも一覧が出ない | Passive ポート範囲未開放 | サーバの pasv_min_port〜max_port を FW で開放 |
| テキストファイルが壊れる | ASCII モードで転送 | binary モードに切替 |
| 大きなファイルが途中で切れる | 制御チャネルがタイムアウト | keep-alive 設定 |
| 500 OOPS | vsftpd のセキュリティチェック | 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 ...。