Amazon web services 从NAT实例后面的AWS VPC专用子网进行ftp访问

Amazon web services 从NAT实例后面的AWS VPC专用子网进行ftp访问,amazon-web-services,ftp,nat,vpc,Amazon Web Services,Ftp,Nat,Vpc,我已经在AWS上创建了一个具有公共和私有子网的VPC。所有应用服务器都位于专用子网中,所有出站请求都必须通过面向internet的NAT实例 目前,我们的项目要求应用服务器访问服务提供商提供的ftp服务器 我试过几种方法来解决这个问题,但都没有成功。我所做的是在NAT和应用程序安全组上打开一个端口范围,比如说(40000-60000),以及标准的ftp端口20-21 用户身份验证可以通过,但我无法列出应用服务器的内容 我可以从NAT访问ftp服务器,一点问题也没有 那我该怎么做才能让它工作呢 尝

我已经在AWS上创建了一个具有公共和私有子网的VPC。所有应用服务器都位于专用子网中,所有出站请求都必须通过面向internet的NAT实例

目前,我们的项目要求应用服务器访问服务提供商提供的ftp服务器

我试过几种方法来解决这个问题,但都没有成功。我所做的是在NAT和应用程序安全组上打开一个端口范围,比如说(40000-60000),以及标准的ftp端口20-21

用户身份验证可以通过,但我无法列出应用服务器的内容

我可以从NAT访问ftp服务器,一点问题也没有

那我该怎么做才能让它工作呢

尝试在FTP上使用被动(PASV)模式

从Slacksite::

在主动模式FTP中,客户端从随机的非特权端口(N>1023)连接到FTP服务器的命令端口,端口21。然后,客户端开始侦听端口N+1,并将FTP命令端口N+1发送到FTP服务器。然后,服务器将从其本地数据端口(端口20)连接回客户端的指定数据端口


因此,流量试图在未通过NAT的附加端口上通信。相反,被动模式创建出站连接,然后通过NAT允许出站连接。

@JohnRotenstein完全正确,如果可以,您应该使用被动FTP。如果像我一样,你遇到一个客户,坚持要求你使用活动FTP,因为他们希望你连接的FTP站点自1990年以来一直在运行,现在更改它是完全不合理的,那么请继续阅读

AWS的NAT服务器不支持使用活动FTP连接的专用子网中的计算机。句号。如果你问我,这是一个错误,但如果你问AWS支持,他们说这是一个不受支持的功能

我们最终提出的解决方案(而且有效)是:

  • 将上的公用子网中的弹性网络接口(ENI)添加到专用子网中的EC2实例
    • 因此,现在您的EC2实例有2个网络适配器、2个内部IP等
    • 让我们把这个新的埃尼称为“公共埃尼”
  • 将专用弹性IP连接到新的公共ENI
    • 假设您得到54.54.54.54,新的公共ENI的内部IP地址是10.1.1.10
  • 在操作系统的网络配置中添加路由,以仅使用新的公共ENI

    • 在windows中,将如下所示,假设您尝试连接的邪恶活动ftp服务器位于8.1.1.1:

      route add 8.1.1.1 mask 255.255.255.254 10.1.1.1 metric 2
      
    • 这将使用子网掩码255.255.255.254(即此IP和仅此IP)为8.1.1.1中的FTP服务器添加所有流量的路由。应使用以太网适配器2(您的第二个NIC)将所有流量发送到internet网关10.1.1.1

  • 厌倦了吗?是的,我也是,但现在最难的部分来了。操作系统不知道它是公共EIN的公共IP地址。因此,您需要教您的FTP客户端使用公共IP发送端口命令。例如,如果使用CURL,请使用--ftp port命令,如下所示:

    curl -v --ftp-port 54.54.54.54 ftp://8.1.1.1 --user myusername:mypass
    

瞧!现在,您可以从(几乎完全)位于私有子网中的EC2计算机连接到噩梦般的活动FTP站点。

我能够在没有路由的情况下完成
curl
部分。只要告诉
--ftp端口
分配给实例的公共IP AWS就足够了。请注意,从7.19.5版开始,您可以在IP之后指定一个范围。因此,现在不必打开所有端口,只需打开AWS防火墙中的一个范围。