FTP 的双连接模型
FTP 用两条 TCP 连接工作:一条是控制连接,长期保持,用来传命令与应答;另一条是数据连接,由控制连接协商后临时建立,用来传文件内容与目录列表。这种「命令与数据分离」的设计是大量防火墙与 NAT 问题的根源,也是排查 FTP 时必须同时看两条连接的原因。现在敏感场景基本改用 SFTP 或 FTPS,但存量系统里 FTP 仍然常见。
基本信息
| 控制连接 | 21 端口,全程保持,传输命令与应答 |
|---|---|
| 数据连接 | 每次传输时新建,传文件内容与目录列表 |
| 应答格式 | 三位状态码加说明文字,如 220、230、150、226 |
| 传输模式 | 主动(PORT)由服务端发起数据连接,被动(PASV)由客户端发起 |
| 安全现状 | 明文传输,敏感场景应改用 SFTP 或 FTPS |
| 相关规范 | RFC 959 定义基本协议,RFC 2428 增加 IPv6 与扩展被动模式 |
手看一次完整会话
手看一次完整会话
nc ftp.example.com 21 # 用文本方式连控制连接,逐条输入命令
220 (vsFTPd 3.0.5) # 服务端就绪
USER alice
331 Please specify the password. # 需要密码
PASS 密码
230 Login successful. # 登录成功
PASV
227 Entering Passive Mode (10,0,0,5,195,80) # 服务端给出数据连接地址与端口
LIST
150 Here comes the directory listing. # 数据连接已建立
226 Directory send OK. # 传输完成
QUIT
221 Goodbye.应答码读法
| 应答码 | 含义 | 说明 |
|---|---|---|
| 220 | 服务就绪 | 连接控制连接后的第一条应答 |
| 331 | 需要密码 | 输入 USER 之后的常见应答 |
| 230 | 登录成功 | 认证通过 |
| 227 | 进入被动模式 | 携带数据连接的地址与端口 |
| 150 | 即将开始传输 | 数据连接已打开 |
| 226 | 传输完成 | 本次数据连接正常关闭 |
| 530 | 未登录 | 权限不足或凭据错误 |
主动与被动模式
| 模式 | 连接方向 | 适用场景 |
|---|---|---|
| 主动 PORT | 服务端从 20 端口主动连接客户端指定端口 | 客户端无 NAT 且允许入站连接时 |
| 被动 PASV | 客户端连接服务端给出的临时端口 | 客户端在内网或防火墙后,更常用 |
| 扩展被动 EPSV | IPv6 场景下的被动模式 | 双栈与 IPv6 环境 |
被动模式的应答把数据地址与端口按六段十进制编码给出:端口等于第五段乘 256 再加第六段,例如 195 与 80 对应 195 乘 256 加 80 的结果。看懂这一段才能判断客户端连不上到底是因为端口没放行还是地址本身不对。