最近、WindowsAzureでは仮想マシンサービスの定期メンテナンスが行われました。
マシンが起動しなくなったので、ディスクイメージから新しく再作成しました。これは、これまで正常に機能していたはずです。
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はリストの一番上にあり、スクリーンショットには表示されていません)
クライアントが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に接続するように言ったのでしょうか。SYN
パケットがサーバーに到達しないまた、別の興味深いことに気づきました。 SSHコンソールからvsftpd
を起動すると、ライブになるまでに約1分かかります。実際にプロセスが開始され、netstat
にリストされますただし、クライアントからの着信接続を受け入れるには時間がかかります。
ファイアウォールが無効になっているかどうかを確認しようとしました。 _yast firewall
_を実行しましたが、別のファイアウォールがマシン上でアクティブになっていることを発見しました:どれも構成していません!
PASVポートの範囲を1つだけに減らすことで、数回試行した後、最終的にPASVポートに接続し、ディレクトリリストを表示することを発見しました。
Vsftpdを期待どおりに再び機能させるにはどうすればよいですか?構成を変更したことはありません。
上記の分析は、FTPサーバーによって実行されるaccept()
syscallとAzureがルーティングする具体的な可能性の間にかなりのdelay
があることを示唆していますTCP SYNパブリックIP /ポートからプライベートIP /ポートへのパケット。したがって、タイムアウトが発生します。
そこで、Webminのインスタンスを実行して、すぐにブラウザに接続しようとしました。デーモンが起動するまでに数十秒かかりましたが、起動後はすぐに応答するように見えたので、必ずしも原因ではないようです。
私は最近、このフォーラム投稿への回答を使用して解決できた非常によく似た問題を抱えていました(クレジットは解決のためにCraig Landisに行きます)
記事の背景テキスト:
これは、ポータルがエンドポイントを作成する方法に対する最近の変更に関係している可能性があると考えています。これで、デフォルトで、プローブポートがエンドポイントポートと同じエンドポイントにプローブポートが構成されます。ロードバランサーは、エンドポイントの状態を判断するためにパケットをプローブポートに送信し、数回再試行しても応答がない場合は、エンドポイントポートへのトラフィックの転送を停止します。
シナリオ例:
ポート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
お役に立てれば、
ヤビ