| 特性 | PORT 主動模式 | PASV 被動模式 |
|---|---|---|
| 指令通道 | 客戶端 → 伺服器:21 | 客戶端 → 伺服器:21 |
| 資料通道發起方 | 伺服器 主動連線客戶端 | 客戶端 主動連線伺服器 |
| 資料通道埠口 | 伺服器:20 → 客戶端:隨機高埠 | 客戶端:隨機高埠 → 伺服器:隨機高埠 |
| 客戶端防火牆 | 需允許入站連線 (常被封鎖) | 僅需出站連線 (通常允許) |
| 伺服器防火牆 | 僅需開放 20,21 | 需開放 21 + 被動埠範圍 |
| NAT 穿透 | 極差 (需 ALG/應用層閘道) | 良好 (客戶端發起) |
伺服器啟用 TCP/IP 篩選,**僅開放特定埠**,導致 PASV 模式所需的隨機高埠被封鎖,客戶端收到 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2) 後嘗試連線失敗。
ftp> open server.ip
ftp> user username
ftp> pass
ftp> passive
Passive mode off.
# 後續操作將使用 PORT 模式
ftp> ls
ftp> get file.txt
# /etc/vsftpd/vsftpd.conf
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50100
pasv_address=203.0.113.10 # 公開 IP (NAT 環境必填)
# 重啟
systemctl restart vsftpd
# firewalld
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=50000-50100/tcp
firewall-cmd --reload
# iptables
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 50000:50100 -j ACCEPT
# vsftpd.conf
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
# 被動模式設定同上
# 測試 PORT 模式
ftp -A server.ip # -A 強制主動模式
# 測試 PASV 模式 (預設)
ftp server.ip
ftp> quote PASV
227 Entering Passive Mode (h1,h2,h3,h4,p1,p2)
# 計算埠號:p1*256 + p2,確認在 50000-50100 範圍內
棄用純文字 FTP。請改用:
1. SFTP (SSH File Transfer Protocol):單一埠 22、強加密、鍵認證、支援斷點續傳
2. FTPS (FTP over TLS):相容 FTP 指令、需開放被動埠範圍
3. rsync over SSH:增量同步、壓縮、保留屬性、自動化首選
4. WebDAV over HTTPS:瀏覽器原生支援、雲端儲存標準
pasv_address 必填公開 IP,否則客戶端收到內網 IP 導致連線失敗reget (下載)、reput (上傳) 需伺服器支援