最近,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 位于列表顶部,未在屏幕截图中显示)
问题
当客户端连接到 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 提供的解决方案)
文章中的一些背景文字:
我们认为这可能与门户最近对创建端点的方式的更改有关。现在,默认情况下,它会在端点上配置一个探测端口,该探测端口与端点端口相同。负载均衡器会将数据包发送到探测端口以确定端点的健康状况,如果在几次重试后仍未收到响应,它将停止将流量转发到端点端口。
示例场景:
端口 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
希望这可以帮助,
雅比