6

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

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

我尝试了几种方法来管理它,但都没有运气。我所做的是在 NAT 和 APP 安全组上打开一个端口范围,比如说 (40000 - 60000),还有标准的 ftp 端口 20 - 21。

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

我可以从 NAT 访问 ftp 服务器,完全没有问题。

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

4

2 回答 2

4

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

AWS 的 NAT 服务器不支持私有子网中的机器使用 Active FTP 进行连接。句号。如果你问我,这是一个错误,但如果你问 AWS 支持,他们会说这是一个不受支持的功能。

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

  • 将公有子网中的弹性网络接口 (ENI) 添加到私有子网中的 EC2 实例
    • 所以现在您的 EC2 实例有 2 个网络适配器、2 个内部 IP 等。
    • 让我们将此新 ENI 称为您的“公共 ENI”
  • 将专用弹性 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 发送 PORT 命令。例如,如果使用 CURL,请使用 --ftp-port 命令,如下所示:

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

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

于 2015-10-20T19:04:44.293 回答
3

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

来自 Slacksite:主动 FTP 与被动 FTP,一个明确的解释

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

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

于 2014-11-27T00:55:13.277 回答