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_port〜pasv_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. 参考文献一覧
- RFC 959 – File Transfer Protocol
→ https://datatracker.ietf.org/doc/html/rfc959 - vsftpd Docs → https://security.appspot.com/vsftpd.html
- Baeldung – Active vs Passive FTP Explained
→ https://www.baeldung.com/cs/active-vs-passive-ftp - Jscape Blog – Active v/s Passive FTP Simplified
→ https://www.jscape.com/blog/active-v-s-passive-ftp-simplified - AWS Docs – VPC Network ACLs for FTP
→ https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#vpc-network-acls-ftp
Discussion