nabroux's Obsidian vault, published.

Astro Techbook

語言
中文

File Transfer Protocols FTP SSH

my-notes/system-design-hld/concepts · ZH

translationKey: file-transfer-protocols-ftp-ssh #system design #concept

💡 一、為什麼要了解檔案傳輸協定?

在系統設計裡,常見需求:

  • 上傳 / 下載報表、備份檔、影片素材
  • 服務之間交換檔案(Batch Job、Data Pipeline)
  • 自動部署、同步伺服器資料
  • Cloud Storage / Object Storage(底層也是 File Transfer 概念)

👉 所以「檔案傳輸協定」不只是「傳檔案」, 而是整個「資料流通」機制的基礎。


🧱 二、常見檔案傳輸協定總覽

協定 全名 傳輸層 加密 常見 Port 備註
FTP File Transfer Protocol TCP ❌ 無加密 21 最古老的傳檔協定
FTPS FTP Secure TCP + SSL/TLS ✅ 加密 21 (explicit) / 990 (implicit) 舊系統的安全版 FTP
SFTP SSH File Transfer Protocol SSH (TCP) ✅ 加密 22 最常見安全傳輸
SCP Secure Copy Protocol SSH (TCP) ✅ 加密 22 快速但功能少
HTTP(S) Hypertext Transfer Protocol TCP ✅ 加密(TLS) 80 / 443 REST / CDN / 雲端常用

🧩 三、FTP:File Transfer Protocol

🕰️ 起源:1970 年代,老派但仍常見。 📦 運作方式:Client-Server 模式,分為兩條連線:

  • 控制連線(Port 21):傳命令與回覆
  • 資料連線(Port 20 或動態):傳檔案本體

模式種類:

模式 說明 特點
Active Mode Server 主動開資料連線 容易被防火牆擋
Passive Mode (PASV) Client 主動連線 現代系統普遍使用

指令範例

ftp> open ftp.example.com
ftp> user alice
ftp> get report.csv
ftp> put upload.txt
ftp> bye

缺點

  • ❌ 密碼明文傳輸
  • ❌ 沒有傳輸加密(容易被竊聽)
  • ❌ 防火牆難設定(多 port)

💡 總結:老派但仍在某些企業內網、設備、印表機中使用。

現代系統幾乎全面改用 SFTP


🧰 四、SFTP:SSH File Transfer Protocol

🧠 常被誤認為「Secure FTP」,其實它是 完全不同的協定, SFTP 是 基於 SSH 的「檔案子系統」。

特性 說明
傳輸層 SSH(Port 22)
加密 AES / RSA / Ed25519
驗證方式 密碼 / SSH Key
支援功能 上傳、下載、刪除、目錄操作、續傳
📘 適用場景:
  • 自動化資料交換(B2B, 金融業常用)
  • 系統備份 / 批次同步
  • 部署腳本(CI/CD 自動上傳檔案)

指令範例

sftp user@host
sftp> put local.txt /remote/path/
sftp> get /remote/logs/app.log
sftp> exit

Python 自動化範例

import paramiko

ssh = paramiko.Transport(("example.com", 22))
ssh.connect(username="alice", password="1234")
sftp = paramiko.SFTPClient.from_transport(ssh)
sftp.put("local.txt", "/remote/data.txt")
sftp.close()
ssh.close()

💡 優點:

  • 安全(加密傳輸)
  • 可整合 SSH Key(無密碼自動化)
  • 易於自動化腳本與 CI/CD 整合

⚡ 五、SCP:Secure Copy Protocol

📦 用途:用來「快速複製檔案」的一個簡化版本(同樣走 SSH)。

特性 說明
協定 基於 SSH
Port 22
功能 僅支援 copy,不支援 list / resume
安全性 與 SSH 同等級

範例:

# 上傳
scp file.txt user@server:/data/
# 下載
scp user@server:/data/file.txt .

💡 對比 SFTP

協定 功能 適用
SCP 單純複製(copy) 一次性傳檔
SFTP 支援目錄操作、續傳、權限設定 自動化或批次任務

🧠 六、SSH:Secure Shell(安全殼層)

SFTP、SCP 的老爸,就是 SSH。

它提供了一個「安全通道」,能同時進行:

  • 遠端登入
  • 命令執行
  • 檔案傳輸

✈️ 常見用途:

類型 範例
遠端登入 ssh user@host
傳檔案 scp / sftp
Port Forwarding ssh -L 8080:localhost:80 user@host
金鑰驗證 ~/.ssh/id_rsa.pub

💡 SSH Key 認證比密碼安全得多

  • 不需在伺服器儲存密碼
  • 可限制來源 IP、指令範圍
  • 可整合 CI/CD pipeline(Git、Ansible、Jenkins)

🧩 七、FTPS vs SFTP 對比

項目 FTPS (FTP + TLS) SFTP (SSH)
協定基礎 FTP SSH
Port 21 / 990 22
加密方式 TLS/SSL SSH(AES / RSA)
控制與資料連線 分開(多 Port) 單一連線
防火牆友善度 較差 👍 單一連線
檔案操作 複雜(不支援續傳) 支援全面操作
自動化腳本 較難整合 👍 方便(支援 key login)
現代支援度 ⭐⭐⭐⭐(最主流)

🔒 八、安全實務建議

做法 說明
優先使用 SFTP 或 HTTPS 傳輸加密、單一連線
🔑 使用 SSH Key 而非密碼 避免憑證外洩風險
📁 權限隔離 每個使用者有獨立 chroot 目錄
📊 啟用 Logging 追蹤誰上傳/下載了什麼
🧱 限制來源 IP / VPN 防止暴力破解
🚨 自動封鎖多次失敗登入 Fail2Ban、Cloudflare Access 等

🧮 九、雲端替代方案(現代化 File Transfer)

工具 / 服務 備註
AWS S3 + Pre-signed URL 安全、臨時授權、可控權限
Google Cloud Storage Signed URL 類似 S3
Azure Blob Storage SAS Token 可設定到期時間、權限
rclone / gsutil / aws cli 現代 CLI 傳輸工具
rsync over SSH 檔案差異同步(DevOps 愛用)

💡 這些服務本質上仍是「安全傳輸協定」的延伸, 只是抽象化成雲端 API。


🧱 十、實務架構舉例

Client (Data Producer)
   │
   │  ── SFTP Upload (SSH Key)
   ▼
+------------------+
|  SFTP Server     |
|  ├── Validates SSH Key
|  ├── Stores file under /uploads/{tenant}/
|  └── Logs actions
+------------------+
   │
   ▼
ETL Job (Async) (**Extract · Transform · Load**)
   ├── Picks up file
   ├── Validates format
   ├── Loads to Data Warehouse
   └── Moves to Archive

👉 很多金融、保險、醫療業的資料交換就是這樣設計。


✅ 十一、一句話總結

🧠 FTP 是歷史,SFTP 是主流,SSH 是一切的基礎。

  • 🚫 FTP:老舊、不安全

  • 🔒 SFTP:安全、穩定、可自動化

  • ⚡ SCP:快速傳單一檔

  • 🧰 SSH:遠端控制與傳輸的基礎層

若要讓系統安全又好維護, 能用 HTTPS / SFTP / Signed URL,就不要用 FTP。

尚無其他語言版本