最近,Windows Azure对虚拟机服务进行了定期维护。
我让我的机器不再启动,所以我重新从我的磁盘映像重新创build新的,这应该工作得很好迄今为止工作得很好。
我使用vsftpd在虚拟服务器上运行FTP服务。 主动和被动。 对于被动FTP,我select端口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数据包永远不会到达服务器 我还注意到另一个有趣的事情。 当我从SSH控制台启动vsftpd ,大概需要一分钟的时间才能上线。 实际上这个过程开始,并在netstat列出, 但它需要一段时间来接受来自我的客户端的传入连接 。
我试图检查防火墙是否被禁用。 我运行yast firewall但发现机器上另一个防火墙是活动的 :我没有configuration它们!
通过将PASV端口的范围缩小到只有一个,我发现经过几次尝试,最终连接到PASV端口并显示目录列表
如何使vsftpd按预期再次运行? 请注意,我从来没有改变configuration。
上面的分析表明,FTP服务器的accept()系统调用和Azure将TCP SYN数据包从公共IP /端口路由到专用IP /端口的可能性相当大,从而导致超时。
所以我试图运行Webmin的一个实例,并立即尝试与我的浏览器连接:守护进程需要十几秒钟才能启动,但启动之后,它看起来像是立即响应,所以似乎不一定是原因
最近我有一个非常类似的问题,我可以用这个论坛post的答案来解决(Credit发给Craig Landis提供解决scheme)
文章中的一些背景文字:
我们认为这可能与最近对门户创build端点的改变有关。 现在,默认情况下,它将在探测端口与端点端口相同的端点上configuration探测端口。 负载均衡器将数据包发送到探针端口以确定端点的健康状况,如果在重试几次后没有得到响应,它将停止将stream量转发到端点端口。
示例场景:
端口21在VM中的Windows防火墙中对所有用户开放,因此探测成功,端点健康,远程IP可以连接到它。
(例如)端口60005可能只在VM的Windows防火墙中打开到那些协商被动模式ftp的远程IP。 它不对负载平衡器开放,因此负载平衡器无法探测此端口。 因此,端点不健康,并停止向端点端口发送stream量。
您在VM中看到的10.xxx地址是负载平衡器用作源IP来检测端口的主机服务器的IP地址。
解决方法:
删除端点,然后使用Add-AzureEndpoint使用Azure PowerShell创build端点,仅指定名称,协议,本地端口和公用端口参数。 这将创build没有探测端口的端点(直到最近才是门户行为)。
如果您不知道如何添加端点,那么在这篇文章中还有一些额外的说明。 此外,这个资源帮助我起床并运行在PowerShell中: http : //blogs.msdn.com/b/windows_azure_technical_support_wats_team/archive/2013/02/18/windows-azure-powershell-getting-started.aspx
希望这可以帮助,
Yabbi