amazon-ec2 - vsftpd 返回 0,0,0,0 以响应 PASV

标签 amazon-ec2 ftp vsftpd

我在 AWS EC2 (Ubuntu16.04) 上使用被动模式 (PASV) 设置了 FTP 服务器,但它不起作用。但是,它可以与 EPSV 一起使用,不知道为什么。我四处搜寻但没有找到答案,有人可以帮助我吗?

<强>1。 vsftpd 配置

anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
pasv_enable=YES
pasv_min_port=13000
pasv_max_port=13100
port_enable=YES
pasv_address=[public ip address of AWS EC2 instance]
allow_writeable_chroot=YES
seccomp_sandbox=NO

<强>2。 AWS EC2 防火墙

security groups (Inbound) setting

<强>3。通过FireFTP测试

Without IPV6 selected

使用PASV模式,无法连接FTP服务器,日志为:

220 (vsFTPd 3.0.3)
USER sensor
331 Please specify the password.
PASS (password not shown)
230 Login successful.
CWD /
250 Directory successfully changed.
TYPE A
200 Switching to ASCII mode.
PASV
QUIT

但是,它与 EPSV 配合使用(选中 IPV6 复选框),日志如下:

220 (vsFTPd 3.0.3)
USER sensor
331 Please specify the password.
PASS (password not shown)
230 Login successful.
PWD
257 "/" is the current directory
TYPE A
200 Switching to ASCII mode.
EPSV
229 Entering Extended Passive Mode (|||13082|)
LIST
150 Here comes the directory listing.
226 Directory send OK.

<强>4。通过Python ftplib测试

from ftplib import FTP
contents = []
ftp = FTP(host=xxx, timeout=3000)
ftp.login(user=xxx, passwd=xxx)
ftp.set_debuglevel(2)
ftp.retrlines("NLST", contents.append)
ftp.quit()

日志如下:

*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Switching to ASCII mode.\n'
*resp* '200 Switching to ASCII mode.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (0,0,0,0,50,245).\n'
*resp* '227 Entering Passive Mode (0,0,0,0,50,245).'
ConnectionRefusedError: [Errno 111] Connection refused

最佳答案

对我来说,这看起来像是 vsftpd 中的一个错误。

从代码来看,它总是会发送 0,0,0,0 、若公众pasv_address已设置,但服务器有一个(本地)IPv6 地址。

要解决此问题,请确保服务器不监听 IPv6 地址(默认行为是什么,您可以通过设置 listen_ipv6=YES 覆盖它):

listen_ipv6=NO
listen=YES

唯一的其他解决方案是删除私有(private) IPv6 地址(如果在 EC2 中可行的话)。

或者使用另一个 FTP 服务器,例如ProFTPD .

或者让 ftplib 忽略服务器返回的 IP 地址。
请参阅Cannot list FTP directory using ftplib – but FTP client works

<小时/>

为了证明这确实是一个错误,请检查最新 vsftpd 版本(3.0.3)的代码:

handle_pasvpostlogin.c :

int is_ipv6 = vsf_sysutil_sockaddr_is_ipv6(p_sess->p_local_addr);

...

if (tunable_pasv_address != 0)
{
  vsf_sysutil_sockaddr_alloc_ipv4(&s_p_sockaddr);
  /* Report passive address as specified in configuration */
  if (vsf_sysutil_inet_aton(tunable_pasv_address, s_p_sockaddr) == 0)
  {
    die("invalid pasv_address");
  }
}
else
{
  vsf_sysutil_sockaddr_clone(&s_p_sockaddr, p_sess->p_local_addr);
}
str_alloc_text(&s_pasv_res_str, "Entering Passive Mode (");
if (!is_ipv6)
{
  str_append_text(&s_pasv_res_str, vsf_sysutil_inet_ntop(s_p_sockaddr));
}
else
{
  const void* p_v4addr = vsf_sysutil_sockaddr_ipv6_v4(s_p_sockaddr);
  if (p_v4addr)
  {
    str_append_text(&s_pasv_res_str, vsf_sysutil_inet_ntoa(p_v4addr));
  }
  else
  {
    str_append_text(&s_pasv_res_str, "0,0,0,0");
  }
}

其中vsf_sysutil_sockaddr_ipv6_v4如果s_p_sockaddr则返回0当 pasv_address 时,它不是 IPv6,但它从来都不是。已设置。

sysutil.c :

const void*
vsf_sysutil_sockaddr_ipv6_v4(const struct vsf_sysutil_sockaddr* p_addr)
{
  static unsigned char pattern[12] =
      { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF };
  const unsigned char* p_addr_start;
  if (p_addr->u.u_sockaddr.sa_family != AF_INET6)
  {
    return 0;
  }
  if (vsf_sysutil_memcmp(pattern, &p_addr->u.u_sockaddr_in6.sin6_addr, 12))
  {
    return 0;
  }
  p_addr_start = (const unsigned char*)&p_addr->u.u_sockaddr_in6.sin6_addr;
  return &p_addr_start[12];
}

恕我直言,代码错误。当 IP 地址从 p_sess->p_local_addr “自动检测”时,它起作用(并且有意义)。 ,但是失败,当 pasv_address地址已使用。

考虑向 vsftpd 的作者报告此问题。

<小时/>

保留 PASV 的原始解释与 EPSV :

只是为了解释 PASV 之间的区别和 EPSV :PASV在响应中返回 IP 地址。该信息 99.9% 是冗余的。当服务器不知道其外部 IP 地址时,它通常会导致问题。

EPSV晚于 PASV 推出,当很明显响应中的 IP 地址存在问题时。所以用EPSV ,仅包含端口号。并且客户端隐式连接到FTP服务器IP地址。

如果服务器确实返回0,0,0,0回应PASV命令,很清楚为什么客户端无法连接到服务器,当 PASV已使用。

关于amazon-ec2 - vsftpd 返回 0,0,0,0 以响应 PASV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41046707/

相关文章:

c++ - 从 ftp 服务器下载后文件损坏

azure - 有没有办法将文件从 azure 应用程序服务复制到另一个 azure 应用程序服务?

c++ - 分段FTP上传

amazon-s3 - 带 Cloudformation 的非 jar 装 ACL S3 存储桶

amazon-ec2 - EC2 系统重启事件是否会导致 EMR 等待节点或更换节点?

ios - IPV6 崩溃 iOS,无法弄清楚发生了什么

linux - 在 ec2-linux AMI 上安装最新版本的 vsftpd

amazon-ec2 - EC2 Instance Connect(基于浏览器的 SSH 连接)不起作用

c# - 使用ftp上传文件

ssl - vsftpd : Make sure data transfers are encrypted?