大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
FTP 与文件传输协议
FTP(File Transfer Protocol)是经典的文件传输协议,端口 21(控制)+ 20(主动模式数据) 或 被动模式高位端口。现代 DevOps 更推荐 SFTP/SCP(走 SSH),但 FTP 仍在遗留系统、共享主机、IoT 固件分发中存在。本课衔接 networking-essentials 端口与防火墙知识,结合 linux-essentials 服务管理;安全替代方案见上一课 dnm-ssh。
学习目标
- 理解 FTP 主动模式 vs 被动模式 及防火墙影响
- 会用
lftp、ftp客户端上传下载文件 - 知道何时选 FTP、何时必须用 SFTP/SCP
FTP 工作模式
| 模式 | 控制连接 | 数据连接方向 | 防火墙难点 |
|---|---|---|---|
| 主动 (Active) | 客户端 → 服务器:21 | 服务器:20 → 客户端 | 客户端防火墙拦 inbound |
| 被动 (Passive) | 客户端 → 服务器:21 | 客户端 → 服务器:高位端口 | 需开放 passive 端口范围 |
被动模式(常见)
Client ──► Server:21 (控制: USER/PASS/ PASV)
Client ──► Server:50000 (数据: LIST/RETR/STOR)
客户端操作
# 命令行 FTP(不推荐生产,明文密码)
ftp ftp.example.com
# ftp> user anonymous
# ftp> cd pub
# ftp> get readme.txt
# lftp(支持 FTPS、断点续传)
lftp -u username,password ftp.example.com
lftp username@ftp.example.com:~> ls
lftp username@ftp.example.com:~> mirror /remote/dir ./local-dir
lftp username@ftp.example.com:~> put deploy.zip
FTPS vs SFTP
| FTP/FTPS | SFTP | |
|---|---|---|
| 协议栈 | 独立 FTP + TLS | SSH 子系统 |
| 端口 | 21 + 数据端口 | 22 |
| 加密 | FTPS 可选 TLS | 全程加密 |
| DevOps 推荐 | 遗留兼容 | ✅ 默认选择 |
# SFTP(推荐,见 dnm-ssh)
sftp user@server.example.com
sftp> put app.jar /opt/deploy/
Linux 上搭建 vsftpd(了解即可)
/etc/vsftpd/vsftpd.conf 关键项:
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50100
ssl_enable=YES
sudo systemctl enable --now vsftpd
sudo firewall-cmd --add-service=ftp --permanent
sudo firewall-cmd --add-port=50000-50100/tcp --permanent
sudo firewall-cmd --reload
防火墙配置参考 net-firewall。生产新系统优先 SFTP,FTP 仅在与第三方强制要求时使用。
CI/CD 中的文件传输
# GitHub Actions 示例:SFTP 部署(非 FTP)
- name: Deploy via SFTP
run: |
scp -i ~/.ssh/deploy_key ./dist/* deploy@server:/var/www/html/
配置与密钥管理纳入 git-essentials 的 CI 流程;域名指向见 dns-essentials。
练习
- 用
lftp或sftp向测试服务器上传一个文件并下载验证 - 解释被动模式下为何需要在防火墙开放 50000-50100 端口
- 对比 FTP、FTPS、SFTP 三者的端口与加密差异,写 3 条选型建议
小结
FTP 是遗留文件传输协议;DevOps 默认用 SFTP/SCP 走 SSH。 理解主动/被动模式是为排障遗留 FTP 服务。下一课进入邮件协议——SMTP 发信。