最近的 Windows Azure VM 维护后无法使用 FTP 被动模式

最近的 Windows Azure VM 维护后无法使用 FTP 被动模式

最近,Windows Azure 对虚拟机服务进行了定期维护。

我的机器无法再启动了,所以我从磁盘映像重新创建了它,到目前为止它应该可以正常工作。

在 Windows Azure 上运行被动 FTP

我在虚拟服务器上使用 运行 FTP 服务vsftpd。既有主动的也有被动的。对于被动 FTP,我选择端口 25003-25014 作为范围。我已在我的vsftpd.conf文件中设置它们,并且已在 Azure 控制面板中映射所有端点。

我的vsftpd.conf

write_enable=YES
dirmessage_enable=YES
nopriv_user=ftpsecure
local_enable=YES
anonymous_enable=NO
anon_world_readable_only=YES
syslog_enable=NO
xferlog_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log
connect_from_port_20=YES
ascii_upload_enable=YES
pam_service_name=vsftpd
ssl_enable=NO
pasv_min_port=25003
pasv_max_port=25014
anon_mkdir_write_enable=NO
anon_root=/srv/ftp
anon_upload_enable=NO
chroot_local_user=YES
ftpd_banner=WELCOME
idle_session_timeout=900
listen=YES
log_ftp_protocol=YES
max_clients=30
max_per_ip=8
pasv_enable=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=YES
pasv_addr_resolve=YES
pasv_address=<myhost>.cloudapp.net

端口映射(端口 21 位于列表顶部,未在屏幕截图中显示)

Azure 端口映射的屏幕截图

问题

当客户端连接到 FTP 时,它会尝试进入被动模式,但无法成功。使用 tcpdump 进行进一步分析。几项分析

Xftp 客户端报告以下活动日志:

STATUS:>    Session started...
STATUS:>    Resolving the host 'XXXXXXXXXXXX'...
STATUS:>    Connecting to the server 'XXXXXXXXXXX'...
        220 WELCOME
STATUS:>    Authenticating for 'YYYYYYYY'...
COMMAND:>   USER YYYYYYYYY
        331 Please specify the password.
COMMAND:>   PASS ****
        230 Login successful.
COMMAND:>   PWD
        257 "/"
STATUS:>    Listing folder '/'...
COMMAND:>   CWD /
        250 Directory successfully changed.
COMMAND:>   PWD
        257 "/"
COMMAND:>   TYPE A
        200 Switching to ASCII mode.
COMMAND:>   PASV
        227 Entering Passive Mode (XXX,XXX,XXX,XXX,97,174).

97,174应该是97*256+174=25006。然后我超时了。

# netstat -oanp | grep vsftpd
tcp        1      0 100.89.XXX.X:25013      0.0.0.0:*               LISTEN      26084/vsftpd        off (0.00/0/0)
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      25500/vsftpd        off (0.00/0/0)
tcp        0      0 100.89.XXX.X:21         100.89.XXX.YYY:57307    ESTABLISHED 26155/vsftpd        keepalive (7212,10/0/0)
tcp        0      0 100.89.XXX.X:21         MY.IP.ADDR.!!:57255       ESTABLISHED 26084/vsftpd        keepalive (7081,01/0/0)

我在服务器上运行了 tcpdump 并发现了两件事:

  • 100.89.XXX.YYY,它不属于我的任何集群(它不是我拥有的云服务,但与虚拟机位于同一子网中),它收到大量 RST 数据包。但是谁告诉那台机器连接到我的 FTP 的?
  • SYN来自我的 IP 的数据包永远无法到达服务器

我还注意到另一件有趣的事情。当我vsftpd从 SSH 控制台启动时,大约需要一分钟才能上线。实际上,该过程已启动并列在netstat但它需要一段时间才能接受来自我的客户端的传入连接

我尝试检查防火墙是否已禁用。我运行了yast firewall后发现计算机上有另一个防火墙处于活动状态:我一个都没配置!

奇怪的解决方法

通过将 PASV 端口范围缩小到只有一个,我发现经过几次尝试后,它最终连接到 PASV 端口并显示目录列表

问题

我该如何让 vsftpd 再次按预期工作?请注意,我从未更改过配置。

可能的相关问题(尚未确认)

上述分析表明,FTP 服务器执行的系统调用与 Azure 将 TCP SYN 数据包从公共 IP/端口路由到私有 IP/端口的具体可能性delay之间存在相当大的差异,从而导致超时。accept()

因此,我尝试运行 Webmin 实例,并立即尝试连接我的浏览器:守护进程花了十几秒才启动,但启动后它似乎立即响应,所以这似乎不一定是原因

答案1

我最近遇到了一个非常类似的问题,我能够使用此论坛帖子的答案来解决(感谢 Craig Landis 提供的解决方案)

http://social.msdn.microsoft.com/Forums/windowsazure/en-US/8f697f17-72b7-46f7-8c97-398b91190a2f/server-2012-vm-on-azure-passive-ftp-wont-work

文章中的一些背景文字:

我们认为这可能与门户最近对创建端点的方式的更改有关。现在,默认情况下,它会在端点上配置一个探测端口,该探测端口与端点端口相同。负载均衡器会将数据包发送到探测端口以确定端点的健康状况,如果在几次重试后仍未收到响应,它将停止将流量转发到端点端口。

示例场景:

端口 21 对虚拟机中 Windows 防火墙中的所有内容开放,因此探测成功,端点健康且远程 IP 可以连接到它。

例如,端口 60005 可能仅在虚拟机的 Windows 防火墙中对协商了被动模式 ftp 的远程 IP 开放。它不对负载均衡器开放,因此负载均衡器无法探测此端口。因此,端点不健康并停止向端点端口发送流量。

您在虚拟机中看到的 10.xxx 地址是负载均衡器用作探测端口的源 IP 的主机服务器 IP 地址。

解决方法:

删除端点,然后使用 Add-AzureEndpoint 使用 Azure PowerShell 创建它们,仅指定名称、协议、localport 和 publicport 参数。这将创建没有探测端口的端点(直到最近这都是门户行为)。

如果您不知道如何使用 powershell 添加端点,本文中还有其他说明。此外,此资源帮助我在 powershell 中启动并运行:http://blogs.msdn.com/b/windows_azure_technical_support_wats_team/archive/2013/02/18/windows-azure-powershell-getting-started.aspx

希望这可以帮助,

雅比

相关内容