💭

FTPの仕組みとActive/Passiveモードの違い

に公開

1. FTPの基本構造

FTP(File Transfer Protocol)は、
制御チャネル(control channel)データチャネル(data channel)
という 2本のTCP接続 を同時に利用して通信を行うプロトコル。

チャネル名 目的 特徴
制御チャネル ユーザー認証やコマンドの送信など、通信の指示をやり取りする 常に1本確立されたまま維持される
データチャネル ファイル本体やディレクトリ一覧などのデータを実際に転送する 転送のたびに新たに確立される
クライアント(A)                          サーバ(B)
──────────────────────────────────────────────
① 制御チャネル:ログイン、get、ls などのコマンド通信
   A → B : コマンド送信
   B → A : 応答を返す

② データチャネル:ファイル送受信
   A ↔ B : ファイルやディレクトリ一覧を転送
──────────────────────────────────────────────

このように、制御チャネルは常に開いたまま操作命令を送り、
データチャネルは必要なときだけ別に開いてデータを流す
という構造になっている。


制御チャネルは「指示を出す会話用の回線」、
データチャネルは「実際に荷物を送る配送ルート」のような関係。
つまり、「命令」と「実データ」を分離している点がFTPの特徴。


※以降の説明では、A(クライアント) と B(サーバ) という記号を用いて記載する:

記号 役割
A クライアント(FTPコマンドを実行する側) 例: EC2インスタンスからアップロード
B サーバ(vsftpdが動作している側) 例: S3連携用の転送サーバ

この定義に基づいて、後続の章では「A→B」という矢印で通信方向を示す

2. Active/Passiveモードの通信フロー

Activeモード

通信の流れ
──────────────────────────────────────────
(1) A→B 制御接続を確立(21/2121)
(2) A→B PORTコマンド送信:「このポートで待ってる」
(3) A が OS のエフェメラルポートで LISTEN
(4) B→A データ接続を開始
(5) データ転送
──────────────────────────────────────────
方向: サーバ → クライアント(B→A)

特徴

  • クライアントの inbound 開放が必要
  • NAT/AWS では困難(セキュリティ上の制約)

Passiveモード

 通信の流れ
──────────────────────────────────────────
(1) A→B 制御接続を確立(21/2121)
(2) A→B PASVコマンド送信:「どのポートで待ってる?」
(3) B がデータポート(例:60000)を動的にLISTEN
(4) B→A 「60000番で待ってる」と応答
(5) A→B 60000番に接続して転送
──────────────────────────────────────────
方向: クライアント → サーバ(A→B)

特徴

  • クライアント inbound 不要
  • AWS/NAT環境で標準
  • Passiveレンジを明示してセキュリティ制御しやすい

3. 設定方法

サーバBでvsftpdを設定し、AWSのセキュリティグループ(SG)で通信を許可する場合の設定例(Passive構成)**を記載する。

vsftpd.conf(サーバB)

# --- 基本設定 ---
listen=YES
listen_port=2121
anonymous_enable=NO
local_enable=YES
write_enable=YES

# --- Passive設定 ---
pasv_enable=YES
pasv_min_port=60000
pasv_max_port=60100
pasv_address=<サーバPublicIP>

# --- Active設定 (必要な場合のみ) ---
# port_enable=YES
  • listen_port:FTPの制御チャネル(通常21、変更可)
  • pasv_enable:Passiveモードを有効化
  • pasv_min/max_port:データ転送に使うポート範囲を固定化(セキュリティ制御用)
  • pasv_address:NAT環境下では外部から見えるIPを指定

AWS SG(Passive構成例)

※下記のSGは サーバB(vsftpdサーバ) に適用

向き プロトコル ポート範囲 ソース/宛先 用途
Inbound TCP 2121 クライアントA 制御チャネル
Inbound TCP 60000–60100 クライアントA データチャネル
Outbound TCP ALL 0.0.0.0/0 通常許可済み
  • 制御チャネル(2121)は常時通信するため、Inboundで開ける必要あり。
  • Passiveモードではデータ転送もA→B方向のため、サーバ側で 60000–60100 のInboundを許可する。
  • クライアント側はOutbound通信だけでOK(Inbound不要)。

4 疎通確認(通信経路の確認)

FTPは「制御チャネル」と「データチャネル」の2本のTCPコネクションを使用する。
それぞれのポートが通信可能であるかを確認してから接続を行う。


制御チャネル(2121)の疎通

# クライアントAで実行
nc -vz <server-ip> 2121

目的:サーバBのFTP制御ポートがLISTENしているか確認する。
オプション

  • -v:詳細モード
  • -z:データ送信せずポートスキャンのみを実施

Connected to <server-ip>:2121 が表示されれば制御チャネルは正常に開通している。


データチャネル(Passive用60000〜60100)の疎通

# サーバB側
nc -l 60000 &

# クライアントA側
nc -vz <server-ip> 60000

目的:Passiveモード転送で利用されるポート範囲が開通しているかを確認する。
オプション

  • -l:リッスンモードで待機
  • -zv:詳細+送信なし

サーバ側で LISTEN、クライアント側で Connected が出力されれば通信経路は正常。
※Passiveモードでは、サーバーはユーザー側からPASVコマンドを受信した際に、自身のデータ転送プロセス(Server-DTP)に対して、指定されたポートで一時的に「待ち受け("listen")」を開始するよう要求される。このデータコネクションは、制御コネクションとは異なり、常に開いていないため、疎通確認時には、サーバ側(B)でnc -l を実行して待ち受け状態を再現する。


5. ファイル送受信

FTPコマンドを使用したファイル送受信の例を示す

Passiveモード

Passiveモードでは、クライアント → サーバ方向(A→B) に通信が行われる。
AWSなどのNAT環境でも安定して動作する。

ダウンロード

ftp <server-ip> 2121
Name: testuser
Password: *****

ftp> passive        # PassiveモードON(A→B通信)
ftp> ls
ftp> get report.txt
ftp> bye

アップロード

ftp <server-ip> 2121
ftp> passive
ftp> put upload.txt
ftp> bye
  • pasv_enable=YES に設定している場合、サーバ側で pasv_min_portpasv_max_port の範囲を使用する。
  • クライアント側でInbound開放は不要。

Activeモード(参考)

Activeモードでは、サーバ → クライアント方向(B→A) にデータ通信が行われる。
クライアント側でエフェメラルポートがLISTENされる。

ダウンロード

ftp <server-ip> 2121
ftp> passive off    # Activeモードに切り替え
ftp> ls
ftp> get report.txt
ftp> bye

クライアント側のLISTEN確認例:

netstat -an | grep 34721
tcp 0 0 0.0.0.0:34721 0.0.0.0:* LISTEN
  • クライアントがPORTコマンドで接続先ポートをサーバに通知する。
  • サーバBがB→A方向にデータ接続を開始する。

6. 参考文献一覧

  1. RFC 959 – File Transfer Protocol
    https://datatracker.ietf.org/doc/html/rfc959
  2. vsftpd Docs → https://security.appspot.com/vsftpd.html
  3. Baeldung – Active vs Passive FTP Explained
    https://www.baeldung.com/cs/active-vs-passive-ftp
  4. Jscape Blog – Active v/s Passive FTP Simplified
    https://www.jscape.com/blog/active-v-s-passive-ftp-simplified
  5. AWS Docs – VPC Network ACLs for FTP
    https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#vpc-network-acls-ftp

Discussion