我正在我的 Windows 2008 服务器(R2)上设置 FTP 服务器。
一切似乎都安装正确,但我无法使用 FTP 客户端登录到我的 FTP 服务器。
我可以远程桌面连接到服务器,并通过 DOS 命令轻松登录。
但是如果我发出“DIR”这样的命令,它会挂起:150 打开 ASCII 模式数据连接。
我所研究和阅读的所有内容都指向防火墙端口和/或被动/主动模式设置。
令我困扰的是...如果我使用 DOS FTP 命令,只有使用“localhost”作为我的地址,我才能登录并使用“DIR”命令。
如果我指定我的完整 FTP URL,我就会收到挂起错误。
如果我指定“localhost”URL,则不会出现错误。
这让我相信这是一个防火墙问题(或者甚至是 IIS7 问题?)但我不确定我需要打开哪些端口?
我的 Windows 防火墙已打开端口 20、21。我还在 AWS (Amazon) 防火墙上打开了这些端口。
我认为我的 FTP 客户端正在使用一些远程端口号,这些端口号可能被我的两个防火墙之一阻止。我使用网络监控工具尝试查看它调用了哪些端口,但我无法弄清楚。
有什么想法、提示、技巧或帮助吗?
答案1
当我尝试使用命令ls
从我的 Ubuntu 命令行列出存储在 UNIX FTP 主机服务器上的文件时,我收到了同样的消息。我能够成功登录,ftp ftp.example.com
并在提示时输入我的用户名和密码。但是,我会收到消息150 Opening ASCII mode data connection
,什么也没发生。然后,我只需使用-p
命令输入选项(将其更改为“被动”模式以处理防火墙),它就可以正常工作了。
ftp -p ftp.example.com
出现提示时输入用户名和密码,然后命令如ls
和cd
将起作用。我相信您也可以输入此命令,它会执行相同的操作,但我还没有测试过。
pftp ftp.example.com
我知道该问题与 Windows 有关;但是,考虑到产生了同样的错误,我认为这个提示值得发布。
答案2
FTP 服务器和 FTP 客户端使用 FTP 的“控制通道”协商将使用哪些端口来传输数据(包括执行“dir”或“ls”时的目录列表)。因此,如果您的“AWS 防火墙”未在此通道上进行协议检查,则它无法知道必须动态打开哪些端口以允许流量流动(并且一旦不再使用这些端口,就会关闭)。
我认为使用网络监控来发现哪些端口正在被使用是不值得的,因为这些端口会随着每个新的 FTP 会话而改变。
除非您已经这样做了,否则解决此问题的最佳方法是查找保护您的 FTP 服务器的防火墙上的任何调整(如果我正确理解您的问题,这将是“AWS 防火墙”),并查看是否有任何“旋钮”可以启用对 FTP 协议的检查。
答案3
要获取有关连接卡住原因的真实信息,您必须使用记录所有协议命令的客户端来查看实际发生的情况。FTP 上有一个不错的网站,其中有示例日志这里。
但最有可能的是,
- 您的客户端位于(哑防火墙或 SSL 阻止的)防火墙后面,并正在尝试使用主动模式 FTP
- 你的服务器位于(哑防火墙或 SSL 阻止的)防火墙后面,并且正在尝试使用被动模式 FTP
如果您使用的是 SSL,唯一的答案就是在防火墙上打开一系列端口(例如,10000-11000),并将您的 FTP 服务器配置为强制被动模式并使用该端口范围。如果您的服务器使用的是 NAT,您还需要为服务器设置正确的 IP 地址以向客户端通告,大多数服务器都会遵循服务器提供的被动模式连接字符串,如果服务器认为它是 10.1.1.1,它就会告诉客户端。
如果您不使用 SSL,最好的答案是看看您是否可以让防火墙对 FTP 进行协议检查。防火墙将读取端口 21 上的流量并打开服务器想要打开的任何端口。这通常也可以修复 NAT 地址(当防火墙也在处理 NAT 时)。您可能仍想强制使用被动模式,因为有些人不知道如何正确配置他们的 FTP 客户端,而且现在几乎每个人都在宽带路由器/防火墙后面。
如果您无法获得更智能的防火墙,那么您将不得不坚持使用“打开一堆端口”选项(或切换到不需要打开一堆随机端口(如 ssh 的 sftp)的协议)。
答案4
我们使用 Windows 防火墙新入站规则向导解决了这个问题。选择程序,然后选择 C:\Windows\System32\ftp.exe,允许连接,检查选项;域、私有、公共(如果需要,您可以稍后限制),命名规则,然后就完成了。
现在通过 ftp 连接到 ftp 站点并验证 dir 或 ls 是否正确响应。