
问题描述
我在尝试从外部网络连接家中的FTP服务时,遇到了以下错误提示,导致无法正常访问文件列表:
- “无法获得目录列表”
- “Can't open data connection for transfer of "/"”
排查过程:分析FTP客户端日志
为了定位问题,我开启了FTP客户端的详细日志功能。以下是两次尝试连接的日志及我的分析:
尝试一:被动模式(PASV)连接失败
当我最初尝试使用FTP客户端的被动模式连接时,日志显示如下:
状态: 正在解析 domain 的地址
状态: 正在连接 ip
状态: 连接建立,等待欢迎消息...
状态: 不安全的服务器,不支持 FTP over TLS。
状态: 已登录
状态: 读取目录列表...
命令: PWD
响应: 257 "/" is current directory.
命令: TYPE I
响应: 200 Type set to I
命令: PASV
响应: 227 Entering Passive Mode (123,149,100,44,4,187)
命令: MLSD
响应: 425 Can't open data connection for transfer of "/"
错误: 读取目录列表失败
日志分析:
已登录
:这表示控制连接(端口21)成功建立,FTP用户名和密码验证通过。命令: PASV
和响应: 227 Entering Passive Mode (123,149,100,44,4,187)
:这是关键。在被动模式下,FTP服务器告知客户端它应该连接的IP地址和端口号,以便进行数据传输。这里服务器报告的IP地址是123.149.100.44
,端口号是(4 * 256) + 187 = 1211
。响应: 425 Can't open data connection
:这表示客户端尝试连接服务器提供的123.149.100.44:1211
端口失败。
初步判断: 问题在于FTP服务器在被动模式下,报告给客户端的IP地址并不是我家庭网络的公网IP。123.149.100.44
很可能是我家里FTP服务器的内部局域网IP,或者是一个运营商内部的NAT IP,导致外部网络无法访问。
尝试二:主动模式(PORT)连接失败
为了进一步排查,我将FTP客户端的连接模式切换到主动模式再次尝试。日志如下:
状态: 正在解析 domain 的地址
状态: 正在连接 198.18.1.134:21...
状态: 连接建立,等待欢迎消息...
状态: 不安全的服务器,不支持 FTP over TLS。
状态: 已登录
状态: 读取目录列表...
命令: PWD
响应: 257 "/" is current directory.
命令: TYPE I
响应: 200 Type set to I
命令: PORT 198,18,0,1,135,100
响应: 200 Port command successful
命令: MLSD
响应: 150 Opening data channel for directory listing of "/"
响应: 425 Can't open data connection for transfer of "/"
错误: 读取目录列表失败
日志分析:
命令: PORT 198,18,0,1,135,100
:在主动模式下,FTP客户端会告诉服务器,它将监听198.18.0.1
这个IP地址的34660
端口((135 * 256) + 100 = 34660
),等待服务器回连。响应: 425 Can't open data connection
:服务器尝试连接198.18.0.1:34660
失败。
关键发现: 198.18.0.1
这个IP地址引起了我的注意。它属于 TEST-NET-1 (198.18.0.0/15) 范围,这是一个为测试和文档保留的私有IP地址,不会在公共互联网上路由。
问题根源定位
结合两次尝试,问题逐渐清晰:
- 被动模式失败:家庭FTP服务器在被动模式下,向客户端报告了错误的、不可从外部路由的内部IP。
- 主动模式失败:我的FTP客户端在外部,本身也处于NAT(网络地址转换)后面,且由于本地代理软件的干预,向FTP服务器报告了错误的、不可从外部路由的本地虚拟IP (
198.18.0.1
)。
这个 198.18.0.1
让我联想到了最近的软件更新。我回想起,我最近将本地的代理软件从 Clash 切换到了 Clash Verge。这个IP正是Clash Verge在**虚拟网卡模式(TUN Mode)**下可能创建的虚拟网卡IP。
结论: 问题的根本原因在于本地客户端的代理软件(Clash Verge)以虚拟网卡模式运行时,干扰了FTP客户端获取并报告自身正确IP的能力,导致无论主动模式还是被动模式,数据连接都因IP地址不匹配而无法建立。
解决方案
既然问题出在本地代理软件对FTP流量的干预,那么解决方案就是让FTP客户端的流量不经过代理软件的虚拟网卡模式。
我采取的步骤是:
- 打开 Clash Verge 设置。
- 找到**“代理模式”**选项。
- 将其从**“虚拟网卡模式”切换为“系统代理模式”**。
- 同时,确认**“启用PAC模式”**已勾选。
操作原理:
- 虚拟网卡模式会劫持所有流量,强制通过代理,这使得FTP客户端报告了虚拟IP。
- 系统代理模式 + PAC模式则更为灵活。它通过操作系统级别的代理设置和PAC脚本,决定哪些流量走代理,哪些直接连接。通常,PAC模式会默认允许内网或特定流量直连,或者FTP客户端本身不遵循系统代理,这使得FTP流量能够绕过代理软件的虚拟网卡劫持,直接发出正确的连接请求,从而FTP客户端可以报告其真实可路由的IP地址。
完成设置切换后,我再次尝试连接家中的FTP服务。这一次,FTP连接立即成功,目录列表也顺利显示!