Recentemente, o Windows Azure tinha uma manutenção agendada nos serviços da Máquina Virtual.
Eu não tinha mais inicialização da minha máquina, então recriou-a nova na minha imagem de disco, que deve funcionar bem, até agora.
Executando FTP passivo no Windows Azure
Eu executo serviços FTP no meu servidor virtual com vsftpd
. Ativo e passivo. Para o FTP passivo, escolhi as portas 25003-25014 como intervalo. Eu os defini no meu arquivo vsftpd.conf
e mapeei todos os endpoints no painel de controle do Azure.
Meu 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
Port mapings (a porta 21 está no topo da listagem, não mostrada na captura de tela)
Oproblema
QuandoumclienteseconectaaoFTP,eletentaentrarnomodopassivo,masnãoconsegue.Outrasanálisesrealizadasusandootcpdump.Váriasanálises
OclienteXftpreportaoseguinteregistrodeatividades:
STATUS:>Sessionstarted...STATUS:>Resolvingthehost'XXXXXXXXXXXX'...STATUS:>Connectingtotheserver'XXXXXXXXXXX'...220WELCOMESTATUS:>Authenticatingfor'YYYYYYYY'...COMMAND:>USERYYYYYYYYY331Pleasespecifythepassword.COMMAND:>PASS****230Loginsuccessful.COMMAND:>PWD257"/"
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
deve ser 97*256+174=25006
. Então eu tenho tempo limite.
# 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)
Eu executei o tcpdump no servidor e descobri duas coisas:
-
100.89.XXX.YYY
, que não faz parte de nenhum cluster meu (não é um serviço em nuvem que possuo, mas está na mesma sub-rede que a máquina virtual), obtém muitos pacotes RST. Mas quem diabos disse essa máquina para se conectar ao meu FTP?
-
SYN
pacotes do meu IP nunca chegam ao servidor
Eu também notei outra coisa interessante. Quando inicio vsftpd
do console SSH, demora cerca de um minuto para ser ativado. Na verdade, o processo é iniciado e está listado em netstat
, mas demora um pouco para aceitar conexões de entrada do meu cliente .
Eu tentei verificar se o firewall está desativado. Eu corri yast firewall
mas descobri que outro firewall está ativo na máquina : eu configurei nenhum deles!
A estranha solução alternativa
Ao reduzir o intervalo de portas PASV para apenas um, descobri que, após algumas tentativas, ele eventualmente se conecta à porta PASV e exibe a listagem de diretórios
A questão
Como faço o vsftpd funcionar novamente como esperado? Por favor, note que eu nunca mudei de configuração.
Possível problema relacionado (não confirmado)
A análise acima sugere que há um delay
considerável entre o accept()
syscall feito pelo servidor FTP e a possibilidade concreta de o Azure rotear pacotes SYN do TCP de IP / porta pública para IP / porta privada, causando tempo limite.
Então eu tentei rodar uma instância do Webmin e imediatamente tentei conectar com meu navegador: demorou uma dúzia de segundos para o daemon iniciar, mas depois de iniciado pareceu responder de imediato, então isso não parece necessariamente seja a causa