我在连接到运行 FileZilla v.0.9.41 的客户端 FTP 服务器时遇到了一个奇怪的问题。该服务器在 NAT 路由器后面运行,因此设置为接受被动连接。这似乎适用于某些客户端,但不是全部。例如,使用 Mac 上的 Transmit,我可以正常连接。但使用 Windows 上的 Core FTP,我遇到了以下错误:
PORT command failed
Error loading directory...
它会无限期地停留在那里。使用 Transmit,这不是问题。
我没有在防火墙后面操作,也没有使用软件防火墙服务。连接的每台设备都位于同一子网中,使用同一路由器连接到互联网。凭证相同,基本配置也相同(被动、二进制等)。
我迷失的地方是弄清楚为什么一个客户端可以毫无问题地连接,而大多数其他客户端可以连接,但不允许我遍历目录结构。
以前有人见过这种行为吗?如果见过,有人想到解决办法吗?
注意:我无法访问 FileZilla 服务器,但我有 XML 配置文件的副本以供故障排除。
编辑:请参阅下面的日志。
Welcome to Core FTP, release ver 2.2, build 1798 (x86.U) -- � 2003-2014
WinSock 2.0
Mem -- 2,097,151 KB, Virt -- 2,097,024 KB
Started on Wednesday September 03, 2014 at 15:45:PM
Connect socket #796 to <Server IP Address>, port 21...
220-FileZilla Server version 0.9.41 beta
220-written by Tim Kosse ([email protected])
220-FileZilla Server version 0.9.41 beta
USER <User>
331 Password required for <User>
PASS **********
230 Logged on
SYST
215 UNIX emulated by FileZilla
Keep alive off...
CWD /Inbound/
250 CWD successful. "/Inbound" is current directory.
PASV
PORT command failed
Error loading directory...
以下是 FileZilla 服务器配置:
<FileZillaServer>
<Groups />
<Users>
<User Name="USER">
<Option Name="Pass">pass</Option>
<Option Name="Group" />
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
<Option Name="Comments" />
<Option Name="ForceSsl">0</Option>
<IpFilter>
<Disallowed />
<Allowed />
</IpFilter>
<Permissions>
<Permission Dir="C:\inetpub\FTP">
<Option Name="FileRead">1</Option>
<Option Name="FileWrite">1</Option>
<Option Name="FileDelete">1</Option>
<Option Name="FileAppend">1</Option>
<Option Name="DirCreate">0</Option>
<Option Name="DirDelete">0</Option>
<Option Name="DirList">1</Option>
<Option Name="DirSubdirs">1</Option>
<Option Name="IsHome">1</Option>
<Option Name="AutoCreate">0</Option>
</Permission>
</Permissions>
<SpeedLimits DlType="0" DlLimit="10" ServerDlLimitBypass="0" UlType="0" UlLimit="10" ServerUlLimitBypass="0">
<Download />
<Upload />
</SpeedLimits>
</User>
</Users>
<Settings>
<Item name="Serverports" type="string">21</Item>
<Item name="Number of Threads" type="numeric">2</Item>
<Item name="Maximum user count" type="numeric">0</Item>
<Item name="Timeout" type="numeric">120</Item>
<Item name="No Transfer Timeout" type="numeric">600</Item>
<Item name="Allow Incoming FXP" type="numeric">1</Item>
<Item name="Allow outgoing FXP" type="numeric">1</Item>
<Item name="No Strict In FXP" type="numeric">0</Item>
<Item name="No Strict Out FXP" type="numeric">0</Item>
<Item name="Login Timeout" type="numeric">60</Item>
<Item name="Show Pass in Log" type="numeric">0</Item>
<Item name="Custom PASV IP type" type="numeric">1</Item>
<Item name="Custom PASV IP" type="string">SAME AS OUTWARD FACING SERVER IP</Item>
<Item name="Custom PASV min port" type="numeric">0</Item>
<Item name="Custom PASV max port" type="numeric">0</Item>
<Item name="Initial Welcome Message" type="string">%v
written by Tim Kosse ([email protected])
Please visit http://sourceforge.net/projects/filezilla/</Item>
<Item name="Admin port" type="numeric">14147</Item>
<Item name="Admin Password" type="string"></Item>
<Item name="Admin IP Bindings" type="string"></Item>
<Item name="Admin IP Addresses" type="string"></Item>
<Item name="Enable logging" type="numeric">0</Item>
<Item name="Logsize limit" type="numeric">0</Item>
<Item name="Logfile type" type="numeric">0</Item>
<Item name="Logfile delete time" type="numeric">0</Item>
<Item name="Use GSS Support" type="numeric">0</Item>
<Item name="GSS Prompt for Password" type="numeric">0</Item>
<Item name="Download Speedlimit Type" type="numeric">0</Item>
<Item name="Upload Speedlimit Type" type="numeric">0</Item>
<Item name="Download Speedlimit" type="numeric">10</Item>
<Item name="Upload Speedlimit" type="numeric">10</Item>
<Item name="Buffer Size" type="numeric">32768</Item>
<Item name="Custom PASV IP server" type="string">http://ip.filezilla-project.org/ip.php</Item>
<Item name="Use custom PASV ports" type="numeric">0</Item>
<Item name="Mode Z Use" type="numeric">0</Item>
<Item name="Mode Z min level" type="numeric">1</Item>
<Item name="Mode Z max level" type="numeric">9</Item>
<Item name="Mode Z allow local" type="numeric">0</Item>
<Item name="Mode Z disallowed IPs" type="string"></Item>
<Item name="IP Bindings" type="string">LOCAL IP ADDRESS</Item>
<Item name="IP Filter Allowed" type="string"></Item>
<Item name="IP Filter Disallowed" type="string"></Item>
<Item name="Hide Welcome Message" type="numeric">0</Item>
<Item name="Enable SSL" type="numeric">0</Item>
<Item name="Allow explicit SSL" type="numeric">1</Item>
<Item name="SSL Key file" type="string"></Item>
<Item name="SSL Certificate file" type="string"></Item>
<Item name="Implicit SSL ports" type="string">990</Item>
<Item name="Force explicit SSL" type="numeric">0</Item>
<Item name="Network Buffer Size" type="numeric">65536</Item>
<Item name="Force PROT P" type="numeric">0</Item>
<Item name="SSL Key Password" type="string"></Item>
<Item name="Allow shared write" type="numeric">0</Item>
<Item name="No External IP On Local" type="numeric">1</Item>
<Item name="Active ignore local" type="numeric">1</Item>
<Item name="Autoban enable" type="numeric">0</Item>
<Item name="Autoban attempts" type="numeric">10</Item>
<Item name="Autoban type" type="numeric">0</Item>
<Item name="Autoban time" type="numeric">1</Item>
<Item name="Service name" type="string"></Item>
<Item name="Service display name" type="string"></Item>
<Item name="Enable HASH" type="numeric">0</Item>
<Item name="Disable IPv6" type="numeric">0</Item>
<SpeedLimits>
<Download />
<Upload />
</SpeedLimits>
</Settings>
</FileZillaServer>
编辑:使用 ftptest.net 进行故障排除后,我发现以下情况:
Command: PWD Reply: 257 "/" is current directory.
Status: Current path is /
Command: TYPE I
Reply: 200 Type set to I
Command: PASV
Reply: 227
Entering Passive Mode (172,23,23,130,234,97)
Error: Server returned unroutable private IP address in PASV reply
Make sure the server is configured to allow passive mode connections.
If the server is behind a NAT router, make sure the server knows its external IP address.
The range of ports used for passive mode must be opened in all involved firewalls.
The range of ports used for passive mode must be forwarded by all involved NAT routers.
Try uninstalling all firewalls and plug your computer directly into your modem, thus bypassing the router.
由此我可以推断服务器端存在问题,但是现在我的问题是,为什么我可以毫无问题地连接某些客户端(特别是 Mac 上的 Transmit),而其他客户端却主动断开连接(例如 Windows 上的 Core FTP)?
答案1
解决方案:
客户端需要更改设置
<Item name="Custom PASV IP" type="string">SAME AS OUTWARD FACING SERVER IP</Item>
执行 NAT 的路由器的 IP。
解释:
根据第 4.1.2 节RFC 959,发送 PASV 后:
该命令的响应包括该服务器正在监听的主机和端口地址。
此后,客户端可能会以其想要使用的 IP 地址和端口的另一个列表进行响应。
某些客户端(例如 FileZilla)将验证响应中给出的 IP 地址和端口是否确实可访问。其他客户端将简单地假设它们可以在启动时所在的同一套接字上继续。前者可能更正确,因为协议确实允许更改端口和地址,但在这种情况下它将失败。
编辑
如果 FTP 服务器已经使用了正确的设置,问题可能出在 NATing 路由器/防火墙/等的设置上。它可能正在更改通过它发送的数据。识别此问题的方法是在连接的两端执行 tcpdump 以验证流量的内容是否相同。
答案2
如 ftptest.net 所示,服务器不知道其外部 IP 地址。请确保正确配置它(在 FileZilla 服务器界面中,转到编辑 > 设置 > 被动模式设置)。
请注意,有些客户端会默默忽略响应PASV
而改用服务器的 IP 地址。这就是为什么有些客户端即使在您的配置无效的情况下也能正常工作。
虽然我不确定这是否是 Core FTP 失败的原因。它甚至没有记录来自 的响应PASV
。但也许它在记录响应之前会验证响应。而且错误消息非常普通(我认为错误消息中的“PORT”实际上是拼写错误,应该是“PASV”)。