Недавно в Windows Azure было запланировано техническое обслуживание служб виртуальных машин.
Моя машина больше не загружалась, поэтому я воссоздал ее заново из своего образа диска, который должен работать нормально, пока работал нормально.
Я запускаю 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 снова работать должным образом? Учтите, что я никогда не менял конфигурацию.
Приведенный выше анализ подсказывает мне, что существует значительная delay
между accept()
syscall, выполняемый FTP-сервером, и конкретная возможность для Azure маршрутизировать TCP SYN-пакеты с общедоступного IP-адреса / порта на частный IP-адрес / порт, что вызывает тайм-аут.
Поэтому я попытался запустить экземпляр Webmin и сразу же попытался подключиться к моему браузеру: демону потребовалось несколько секунд для запуска, но после запуска он выглядел так, как будто ответил немедленно, так что это не обязательно является причиной
Недавно у меня была очень похожая проблема, которую я смог решить, используя ответ на это сообщение на форуме (за решение спасибо Крейгу Лэндису)
некоторый фоновый текст из статьи:
Мы полагаем, что это может быть связано с недавним изменением того, как портал создает конечные точки. Теперь по умолчанию он настраивает пробный порт на конечной точке, где пробный порт совпадает с портом конечной точки. Балансировщик нагрузки отправляет пакеты на порт проверки, чтобы определить работоспособность конечной точки, и если он не получит ответа после нескольких попыток, он прекратит пересылку трафика на порт конечной точки.
Пример сценария:
Порт 21 открыт для всех в брандмауэре Windows на виртуальной машине, поэтому проверка прошла успешно, конечная точка исправна, и удаленные IP-адреса могут подключаться к ней.
Порт 60005 (например), вероятно, открыт в брандмауэре Windows на виртуальной машине только для тех удаленных IP-адресов, которые согласовали пассивный режим ftp. Он не открыт для балансировщика нагрузки, поэтому балансировщик нагрузки не может проверить этот порт. В результате конечная точка становится неисправной и перестает отправлять трафик на порт конечной точки.
Адрес 10.x.x.x, который вы видите на виртуальной машине, является IP-адресом хост-сервера, который балансировщик нагрузки использует в качестве исходного IP-адреса для проверки порта.
Обходной путь:
Удалите конечные точки, а затем создайте их с помощью Azure PowerShell с помощью Add-AzureEndpoint, указав только параметры name, protocol, 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
Надеюсь это поможет,
Ябби