доступ по ftp из частной подсети AWS VPC за экземпляром NAT

Я создал VPC с общедоступными и частными подсетями на AWS. Все серверы приложений находятся в частных подсетях, и все исходящие запросы должны проходить через подключенный к Интернету экземпляр NAT.

На данный момент наш проект требует, чтобы серверы приложений имели доступ к ftp-серверу, предоставленному поставщиком услуг.

Я пробовал несколько способов справиться с этим, но все безуспешно. Я открыл диапазон портов, скажем, (40000–60000) в группах безопасности NAT и APP, а также стандартные порты ftp 20–21.

Аутентификация пользователя может быть передана, но мне не удалось вывести список содержимого с серверов приложений.

Я могу получить доступ к ftp-серверу через NAT, это вообще не проблема.

Итак, что мне делать, чтобы это работало?


person Sebastien Liu    schedule 26.11.2014    source источник


Ответы (2)


@JohnRotenstein абсолютно прав, что вы должны использовать пассивный FTP, если можете. Если, как и я, вы застряли с клиентом, который настаивает на том, чтобы вы использовали Active FTP, потому что его FTP-сайт, к которому они хотят, чтобы вы подключились, работает с 1990 года, и менять его сейчас совершенно неразумно, тогда читайте дальше.

Серверы NAT AWS не поддерживают подключение компьютера в частной подсети с использованием активного FTP. Полная остановка. Если вы спросите меня, это ошибка, но если вы спросите службу поддержки AWS, они скажут, что это неподдерживаемая функция.

Наконец, мы пришли к следующему решению (и оно работает):

  • Add an Elastic Network Interface (ENI) in a public subnet on to your EC2 instance in the private subnet
    • So now your EC2 instance has 2 network adapters, 2 internal IPs, etc.
    • Давайте назовем этот новый ENI своим «публичным ENI».
  • Attach a dedicated elastic IP to your new public ENI
    • Let's assume you get 54.54.54.54 and the new public ENI's internal IP address is 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
      
    • Это добавляет маршрут для всего трафика к FTP-серверу в 8.1.1.1 с использованием маски подсети 255.255.255.254 (т.е. этот IP-адрес и только этот IP-адрес) должен идти к интернет-шлюзу 10.1.1.1 с использованием адаптера Ethernet 2 (вашего второго сетевого адаптера).

  • Еще не надоело? Да, я тоже, но теперь самое сложное. ОС не знает своего публичного IP-адреса для публичного EIN. Поэтому вам нужно научить свой FTP-клиент отправлять команду PORT с общедоступным IP-адресом. Например, если вы используете CURL, используйте команду --ftp-port следующим образом:

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

И вуаля! Теперь вы можете подключиться к кошмарному активному FTP-сайту с компьютера EC2, который (почти полностью) находится в частной подсети.

person Ryan Shillington    schedule 20.10.2015
comment
Я смог проделать curl часть без маршрутизации. Достаточно было просто сообщить --ftp-port публичный IP-адрес AWS, назначенный экземпляру. Обратите внимание, что начиная с версии 7.19.5 вы можете указывать диапазон после IP. Таким образом, теперь необязательно открывать все порты, а только диапазон в брандмауэре AWS. - person jgomo3; 24.04.2017

Попробуйте использовать пассивный (PASV) режим на FTP.

Из Slacksite: Активный FTP против пассивного FTP, окончательное объяснение:

В активном режиме FTP клиент подключается со случайного непривилегированного порта (N> 1023) к командному порту FTP-сервера, порту 21. Затем клиент начинает прослушивать порт N + 1 и отправляет FTP-команду PORT N + 1 FTP. сервер. Затем сервер снова подключится к указанному клиентом порту данных из своего локального порта данных, то есть порта 20.

Таким образом, трафик пытается связаться с дополнительным портом, который не проходит через NAT. В пассивном режиме вместо этого создается исходящее соединение, которое затем будет разрешено через NAT.

person John Rotenstein    schedule 27.11.2014