web-dev-qa-db-ja.com

最近のWindowsAzureの後にFTPパッシブモードを使用できませんVMメンテナンス

最近、WindowsAzureでは仮想マシンサービスの定期メンテナンスが行われました。

マシンが起動しなくなったので、ディスクイメージから新しく再作成しました。これは、これまで正常に機能していたはずです。

WindowsAzureでパッシブFTPを実行する

vsftpdを使用して仮想サーバーでFTPサービスを実行しています。アクティブとパッシブの両方。パッシブ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はリストの一番上にあり、スクリーンショットには表示されていません)

Screenshot of Azure port mappings

問題

クライアントが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を実行したところ、次の2つのことがわかりました。

  • _100.89.XXX.YYY_は、私のクラスターの一部ではありません(私が所有するクラウドサービスではありませんが、仮想マシンと同じサブネットにあります)、大量のRSTパケットを取得します。しかし、誰がそのマシンに私のFTPに接続するように言ったのでしょうか。
  • IPからのSYNパケットがサーバーに到達しない

また、別の興味深いことに気づきました。 SSHコンソールからvsftpdを起動すると、ライブになるまでに約1分かかります。実際にプロセスが開始され、netstatにリストされますただし、クライアントからの着信接続を受け入れるには時間がかかります

ファイアウォールが無効になっているかどうかを確認しようとしました。 _yast firewall_を実行しましたが、別のファイアウォールがマシン上でアクティブになっていることを発見しました:どれも構成していません!

奇妙な回避策

PASVポートの範囲を1つだけに減らすことで、数回試行した後、最終的にPASVポートに接続し、ディレクトリリストを表示することを発見しました。

質問

Vsftpdを期待どおりに再び機能させるにはどうすればよいですか?構成を変更したことはありません。

考えられる関連する問題(未確認)

上記の分析は、FTPサーバーによって実行されるaccept() syscallとAzureがルーティングする具体的な可能性の間にかなりのdelayがあることを示唆していますTCP SYNパブリックIP /ポートからプライベートIP /ポートへのパケット。したがって、タイムアウトが発生します。

そこで、Webminのインスタンスを実行して、すぐにブラウザに接続しようとしました。デーモンが起動するまでに数十秒かかりましたが、起動後はすぐに応答するように見えたので、必ずしも原因ではないようです。

私は最近、このフォーラム投稿への回答を使用して解決できた非常によく似た問題を抱えていました(クレジットは解決のためにCraig Landisに行きます)

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

記事の背景テキスト:

これは、ポータルがエンドポイントを作成する方法に対する最近の変更に関係している可能性があると考えています。これで、デフォルトで、プローブポートがエンドポイントポートと同じエンドポイントにプローブポートが構成されます。ロードバランサーは、エンドポイントの状態を判断するためにパケットをプローブポートに送信し、数回再試行しても応答がない場合は、エンドポイントポートへのトラフィックの転送を停止します。

シナリオ例:

ポート21はVM内のWindowsファイアウォールのすべてに開かれているため、プローブは成功し、エンドポイントは正常であり、リモートIPはそれに接続できます。

ポート60005(たとえば)は、パッシブモードftpをネゴシエートしたリモートIPに対してVM)のWindowsファイアウォールでのみ開かれている可能性があります。ロードバランサーに対して開かれていないため、ロードバランサーはこのポートをプローブできません。その結果、エンドポイントは異常であり、エンドポイントポートへのトラフィックの送信を停止します。

VMに表示される10.x.x.xアドレスは、ロードバランサーがポートをプローブするためのソースIPとして使用するホストサーバーのIPアドレスです。

回避策:

エンドポイントを削除してから、Add-AzureEndpointを使用してAzure PowerShellでエンドポイントを作成し、名前、プロトコル、ローカルポート、およびパブリックポートのパラメーターのみを指定します。これにより、プローブポートなしでエンドポイントが作成されます(これは最近までポータルの動作でした)。

方法がわからない場合は、PowerShellを使用してエンドポイントを追加する方法についての追加の手順が投稿にあります。さらに、このリソースは、PowerShellで起動して実行するのに役立ちました: http://blogs.msdn.com/b/windows_Azure_technical_support_wats_team/archive/2013/02/18/windows-Azure-powershell-getting-started.aspx

お役に立てれば、

ヤビ

1
yabbi