我正在尝试使用 perl 编写的 FTP 客户端以使用被动模式从 IIS 7.5 FTP 服务器传输文件。
我已按照说明配置了 FTP 服务器,还配置了 Windows 防火墙以允许此类流量。我已通过检查确保日志中没有被阻止的数据包来验证防火墙是否正常运行。我已验证 FTP 控制通道已在端口 21 上打开。
我相信 IIS 会告诉客户端在被动模式下要连接哪个端口,但 IIS 拒绝允许此连接。
perl 日志如下所示:
C:\cygwin\Perl\lib\FMT>perl FTPTest.pl
Net::FTP>>> Net::FTP(2.77)
Net::FTP>>> Exporter(5.64_01)
Net::FTP>>> Net::Cmd(2.29)
Net::FTP>>> IO::Socket::INET(1.31)
Net::FTP>>> IO::Socket(1.31)
Net::FTP>>> IO::Handle(1.28)
Net::FTP=GLOB(0x20abac0)<<< 220 Microsoft FTP Service
Net::FTP=GLOB(0x20abac0)>>> USER ftpuser
Net::FTP=GLOB(0x20abac0)<<< 331 Password required for ftpuser.
Net::FTP=GLOB(0x20abac0)>>> PASS ....
Net::FTP=GLOB(0x20abac0)<<< 230 User logged in.
Net::FTP=GLOB(0x20abac0)>>> CWD /Logs
Net::FTP=GLOB(0x20abac0)<<< 250 CWD command successful.
Net::FTP=GLOB(0x20abac0)>>> PASV
Net::FTP=GLOB(0x20abac0)<<< 227 Entering Passive Mode (xx,xxx,xxx,xxx,160,41).
Net::FTP=GLOB(0x20abac0)>>> RETR filename.txt
Can't use an undefined value as a symbol reference at C:/Utilities/strawberryper
l/perl/lib/Net/FTP/dataconn.pm line 54.
IIS 日志如下:
2010-10-02 17:40:06 xx.xxx.xx.xx - yy.y.yy.yy ControlChannelOpened - - 0 0 27a48c9b-9dce-4770-8bcf-fc89f2569b1a - -
2010-10-02 17:40:06 xx.xxx.xx.xx - yy.y.yy.yy USER ftpuser 331 0 0 27a48c9b-9dce-4770-8bcf-fc89f2569b1a - -
2010-10-02 17:40:06 xx.xxx.xx.xx MACHINENAME\ftpuser yy.y.yy.yy PASS *** 230 0 0 27a48c9b-9dce-4770-8bcf-fc89f2569b1a / -
2010-10-02 17:40:06 xx.xxx.xx.xx MACHINENAME\ftpuser yy.y.yy.yy CWD /Logs 250 0 0 27a48c9b-9dce-4770-8bcf-fc89f2569b1a /Logs -
2010-10-02 17:40:06 xx.xxx.xx.xx MACHINENAME\ftpuser yy.y.yy.yy PASV - 227 0 0 27a48c9b-9dce-4770-8bcf-fc89f2569b1a - -
2010-10-02 17:40:27 - MACHINENAME\ftpuser zz.z.zz.zzz 41001 DataChannelClosed - - 64 0 27a48c9b-9dce-4770-8bcf-fc89f2569b1a - -
2010-10-02 17:40:27 xx.xxx.xx.xx MACHINENAME\ftpuser yy.y.yy.yy ControlChannelClosed - - 64 0 27a48c9b-9dce-4770-8bcf-fc89f2569b1a - -
2010-10-02 17:40:27 xx.xxx.xx.xx MACHINENAME\ftpuser yy.y.yy.yy RETR filename.txt 550 1236 0 27a48c9b-9dce-4770-8bcf-fc89f2569b1a filename.txt -
我们也在其他 FTP 客户端上发现了这个问题,我不认为这是 Perl 中的问题。我被告知这在 IIS 6 FTP 服务器中运行良好。我想知道我们是否遗漏了什么。
答案1
我也遇到过同样的问题。我相信 IIS FTP 7.5 默认配置为仅允许 ACTIVE FTP 而不允许 Passive FTP - 至少在我完成的两次默认安装中都是如此。也许你的脚本因此而挂起了。IIS 网站http://learn.iis.net/page.aspx/309/configuring-ftp-firewall-settings/对我帮助很大——虽然我的问题出在常规 FTP 客户端(filezilla)而不是 PERL,但它应该适用于这种情况。请特别查看步骤 3:配置 Windows 防火墙设置
答案2
我在使用其他 ftp 服务器软件时也遇到过类似的问题。
如果您的 ftp 服务器位于 NAT 后面,您可能需要进行端口映射。您可能还需要检查服务器用于被动模式的端口并对其进行端口映射。还要检查防火墙是否允许这些端口。
答案3
我在使用 Perl 脚本时也遇到了同样的问题。我是从私有 IP 地址连接的。在被动模式下,发出 PASV 命令时会返回公共 IP 地址!解决方案是设置 Passive => 0 以在防火墙内使用主动模式,在防火墙外使用 Passive => 1。
答案4
尝试使用 IIS 配置编辑器导航到 System.applicationHost/sites -> siteDefaults ->ftpServer-> security-> dataChannelSecurity 并禁用 matchClientAddressForPort 和 matchClientAddressForPasv。这是我从 IIS 6 升级到 IIS 7.5 时的解决方案