タイトル: FTP
SEOタイトル: FTP プロトコル完全ガイド (FTP/FTPS/SFTP)
| この記事の要点 |
|
FTP の概要
FTP (File Transfer Protocol) は 1971 年に策定された RFC 959 ベースのファイル転送プロトコルです。Web 黎明期のサイト公開・ソフトウェア配布の標準でしたが、平文通信ゆえのセキュリティ問題から、現代では SFTP / FTPS / HTTPS API への置き換えが進んでいます。
ポートとコネクション
| プロトコル | 制御 | データ | 暗号化 | 下位プロトコル |
|---|---|---|---|---|
| FTP (Plain) | 21/TCP | 20/TCP (Active) or 動的 (Passive) | なし | — |
| FTPS Explicit | 21/TCP (AUTH TLS で TLS 化) | 動的 | TLS | SSL/TLS |
| FTPS Implicit | 990/TCP (最初から TLS) | 989/TCP | TLS | SSL/TLS |
| SFTP | 22/TCP (SSH と同じ) | 22/TCP (同じ接続内) | SSH | SSH |
SFTP は名前は FTP と似ていますが、まったく別物です。SSH のサブプロトコル (SFTP subsystem) で、SSH のセキュリティ・認証をそのまま継承します。
アクティブモード vs パッシブモード
FTP の特殊性は制御接続とデータ接続が分離していること。データ接続の張り方で 2 モードあります:
| モード | 動作 | NAT/FW 越え |
|---|---|---|
| Active | クライアントが受け側ポートを通知 (PORT) → サーバが 20 番から接続しに行く | クライアント側 FW で塞がれ失敗しやすい |
| Passive (PASV) | サーバが待ち受けポートを通知 (PASV) → クライアントが接続しに行く | ★ 現代では PASV が既定 |
# Active モード (古典)
client(*) --- PORT cmd --- server:21
server:20 ----connect---> client:n
# クライアント側 NAT/FW で 20->n 接続が落ちる
# Passive モード (PASV)
client --- PASV cmd ---> server:21
server: "227 Entering Passive Mode (192,0,2,1,28,123)"
client --- connect ---> server:7291 (= 28*256+123)
# サーバ側のポート開放のみで OK
主要コマンド (FTP プロトコル)
| コマンド | 役割 |
|---|---|
USER / PASS | ログイン (平文) |
PWD / CWD | カレント表示 / 移動 |
LIST / NLST | ファイル一覧 |
RETR / STOR | ダウンロード / アップロード |
DELE / RNFR / RNTO | 削除 / リネーム |
MKD / RMD | ディレクトリ作成 / 削除 |
TYPE A / TYPE I | ASCII / Binary 切替 |
PASV / EPSV | パッシブモード要求 |
QUIT | 切断 |
ASCII モード vs Binary モード
古い設計の名残で、テキストファイル転送時に改行コードを変換するモード (ASCII) と、無変換 (Binary / Image) があります:
# ASCII モード: CR/LF を相手 OS の改行に変換
# Windows -> Unix: CRLF -> LF
# Unix -> Windows: LF -> CRLF
# 利点: テキストファイルの可読性
# 欠点: バイナリを通すと壊れる
# Binary (Image) モード: 無変換
# 現代は基本これ
バイナリファイルを ASCII モードで転送すると確実に壊れます。zip/画像/実行ファイルは必ず Binary に。
ftp コマンドの基本
# 接続
ftp ftp.example.com
# Name: alice
# Password: ********
ftp> ls
ftp> cd /pub
ftp> bin # Binary モード
ftp> passive # パッシブモード切替
ftp> get file.zip # ダウンロード
ftp> put upload.txt # アップロード
ftp> mget *.txt # 複数取得
ftp> bye # 切断
# 非対話的: curl が便利
curl -u user:pass ftp://ftp.example.com/file.zip -o file.zip
curl -u user:pass -T upload.txt ftp://ftp.example.com/
FTPS (FTP over TLS)
従来の FTP に TLS 暗号化を追加した方式。Explicit と Implicit があります:
# Explicit FTPS (推奨): 21 番で接続 -> AUTH TLS コマンドで TLS 化
curl --ftp-ssl -u user:pass ftp://ftp.example.com/file.zip -o file.zip
# Implicit FTPS: 最初から TLS (990 番)
curl --ftp-ssl -u user:pass ftps://ftp.example.com:990/file.zip -o file.zip
# lftp なら自動判別
lftp -e "set ftp:ssl-force true; set ftp:ssl-protect-data true" -u user,pass ftp.example.com
SFTP (SSH File Transfer Protocol)
名前は FTP に似ていますが、FTP と何の関係もなく、SSH のサブプロトコルです。SSH サーバが動いていれば追加設定なしで使えるのが利点。
# 対話的
sftp alice@server.example.com
sftp> put localfile
sftp> get remotefile
sftp> ls
sftp> exit
# 非対話的
scp file.zip alice@server:/upload/ # SCP は SSH 上のファイル転送、SFTP と兄弟
rsync -av ./ alice@server:/path/ # 差分転送に強い
# 鍵認証 (パスワード不要に)
ssh-keygen -t ed25519
ssh-copy-id alice@server
sftp alice@server # パスワード問われない
主なクライアントソフト
| 名称 | OS | 対応 | 特徴 |
|---|---|---|---|
| FileZilla | Win/Mac/Linux | FTP/FTPS/SFTP | 定番 OSS、GUI |
| WinSCP | Windows | FTP/FTPS/SFTP/SCP | エクスプローラ風、PuTTY 連携 |
| Cyberduck | Mac/Win | FTP/FTPS/SFTP + S3 等 | クラウド統合に強い |
| lftp | Unix | FTP/FTPS/SFTP/HTTP(S) | CLI、ミラー機能・自動化に◎ |
| Transmit | Mac | FTP/FTPS/SFTP + クラウド | 商用、高速 |
| curl | 全 OS | FTP/FTPS/SFTP/SCP | シェルスクリプト向き |
Anonymous FTP
ユーザ名 anonymous + パスワードに自分のメールアドレス (慣習) でログインする公開 FTP。Linux ディストリの ISO ミラーや、CRAN/CTAN 等の学術ミラーでまだ稼働しています。
ftp ftp.gnu.org
# Name: anonymous
# Password: your@email.com
ftp> ls /gnu
# 多くのミラーは HTTPS にも対応
curl -O https://ftp.gnu.org/gnu/coreutils/coreutils-9.5.tar.xz
セキュリティ上の問題
- 認証情報が平文: ユーザ名 / パスワードがネットワーク上に丸見え
- データも平文: 転送内容を傍受可能
- パッシブモードのデータポート範囲を広く開ける必要 → FW 攻撃面が広がる
- FXP (server-to-server 転送) を悪用した攻撃
これらの理由で 純粋 FTP はインターネット上で使うべきではないとされ、PCI DSS 等のセキュリティ標準でも禁止対象です。
現代の代替手段
| 用途 | 推奨 |
|---|---|
| サーバへのデプロイ | SFTP / SCP / rsync over SSH / Git |
| 大容量ファイル配布 | HTTPS / S3 / GCS / Azure Blob (署名付き URL) |
| クライアントとのファイル共有 | WebDAV / クラウドストレージ (Box / OneDrive) |
| レガシー連携 | FTPS (TLS 強制) |
| 大量小ファイルバックアップ | rsync / restic / borg |
FAQ
Q: FTP と SFTP のサーバを同居させたい
A: 不要なら入れない方が安全。どうしても必要なら vsftpd (FTP/FTPS) + OpenSSH (SFTP) を別アカウントで管理。
Q: パッシブモードで「227 Entering Passive Mode」後にハングする
A: サーバ側のパッシブポート範囲 (例: pasv_min_port / pasv_max_port) が FW で塞がれているのが定番。ファイアウォール開放が必要。
Q: クラウドの S3 を FTP のように扱いたい
A: s3fs / goofys でマウント、または AWS Transfer Family (マネージド SFTP) を利用。