4.

FTP プロトコル完全ガイド (FTP/FTPS/SFTP)

編集
この記事の要点
  • FTP (File Transfer Protocol) はファイル転送用の古典プロトコル。制御 21 番 / データ 20 番
  • アクティブモード (サーバ → クライアントへデータ接続) と パッシブモード (PASV) がある。NAT 越え用にパッシブが必須
  • FTP は平文 = 暗号化なし。現代では FTPS (FTP over TLS, 990 番) / SFTP (SSH 経由, 22 番) が必須
  • クライアント: FileZilla / WinSCP / lftp / curl。Anonymous FTP は公開ミラーで使われる
  • 現代の選択肢は HTTPS API / SCP / rsync / クラウドストレージ。新規構築で純粋 FTP は推奨しない

FTP の概要

FTP (File Transfer Protocol) は 1971 年に策定された RFC 959 ベースのファイル転送プロトコルです。Web 黎明期のサイト公開・ソフトウェア配布の標準でしたが、平文通信ゆえのセキュリティ問題から、現代では SFTP / FTPS / HTTPS API への置き換えが進んでいます。

ポートとコネクション

プロトコル制御データ暗号化下位プロトコル
FTP (Plain)21/TCP20/TCP (Active) or 動的 (Passive)なし
FTPS Explicit21/TCP (AUTH TLS で TLS 化)動的TLSSSL/TLS
FTPS Implicit990/TCP (最初から TLS)989/TCPTLSSSL/TLS
SFTP22/TCP (SSH と同じ)22/TCP (同じ接続内)SSHSSH

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 IASCII / 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対応特徴
FileZillaWin/Mac/LinuxFTP/FTPS/SFTP定番 OSS、GUI
WinSCPWindowsFTP/FTPS/SFTP/SCPエクスプローラ風、PuTTY 連携
CyberduckMac/WinFTP/FTPS/SFTP + S3 等クラウド統合に強い
lftpUnixFTP/FTPS/SFTP/HTTP(S)CLI、ミラー機能・自動化に◎
TransmitMacFTP/FTPS/SFTP + クラウド商用、高速
curl全 OSFTP/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) を利用。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. HTTP
  2. HTTPS
  3. DNS
  4. FTP
  5. TFTP
  6. DHCP
  7. SMTP
  8. SNMP
  9. POP3
  10. Telnet
  11. NTP
  12. SSH