云服务器部署 vsftpd 后客户端无法连接:由主动/被动工作模式引起的问题分析和解决

一:两个问题现象

现象一:在 windows 的 PowerShell 下,使用 ftp 命令行可以正常登录,但执行 lsget 等操作报错

200 PORT command successful. Consider using PASV.
425 Failed to establish connection.

问题原因:

Windows ftp 命令行默认使用 主动模式(PORT),在主动模式下:

建立数据通道时候,客户端会告诉服务器:“你来连接我这个随机端口”,然后服务器使用自己的 20 端口反向连接客户端。

但是云服务器位于公网,Windows 客户端位于 NAT 后面,服务器无法访问客户端的随机端口


现象二:使用 widonws 的文件资源管理器(Explorer)时提示错误:

200 Switching to ASCII mode.
227 Entering Passive Mode (172,27,165,59,177,213).

问题原因

Windows Explorer 使用 被动模式(PASV),在被动模式下:

建立数据通道的时候,服务器会返回自己的 IP + 数据端口,然后客户端使用高位端口去连接服务器。

但是服务器返回了 内网 IP,客户端无法访问这个私网地址,所以就导致了连正常登录都不行。


二:以上两个问题解决方案:

在 vsftpd 配置文件中,强制让 vsftpd 使用被动模式,这样客户端想要切换到主动模式也不行;

然后指定建立连接的地址,不让 服务端返回网络接口的私有地址给客户端,用指定的公网地址。

# 启用被动模式,禁用主动模式
pasv_enable=YES
port_enable=NO

# 指定一个高位端口范围,然后在防火墙中开放这些端口(如果是全允许策略,就没必要)
pasv_min_port=30000
pasv_max_port=31000

# 在指定建立连接的地址,而非网络接口的私有地址
pasv_address=121.40.206.25

三:FTP 协议知识补充:

FTP 将 指令通道(21端口) 和 数据通道 进行了分离。客户端虽然通过 21 端口登录,但真正传输文件时,会单独建立一个数据连接。所以根据数据通道的建立方式不同,FTP 分为主动和被动工作模式。

所以所谓的主动模式和被动模式都是针对数据传输通道的建立方式而言的。


FTP 主动模式(PORT):

客户端把自己的 IP 地址 + 一个随机端口 告诉服务器,然后服务器通过 20端口作为源端口,反向连接客户端这个随机端口

  • 服务端只需开放 20 和 21 端口,但是客户端必须开放高位端口,否则服务器连不进去。因为服务端会主动连客户端。
  • 客户端若位于 NAT后面,服务器无法访问客户端(有些能自动修复的FTP客户端可以)

FTP 被动模式(PASV):

服务器响应自己的 IP地址 + 随机端口给客户端,然后客户端主动连接这个端口来建立数据通道

  • 因为是客户端主动发起连接,所以即使客户端在 NAT、路由器或防火墙后也能正常使用
  • 但是服务端必须开放被动端口范围,否则客户端连不上,而且服务端必须正确返回公网 IP(pasv_address),否则客户端会连接到服务器的私网地址导致失败

posted on 2025-12-01 18:54  背对背依靠  阅读(1)  评论(0)    收藏  举报