EC2 не может подключиться через FTPS, но работает локально

Я использую Python 2.6.5 на ec2 и заменил старый ftplib на более новый из Python2.7, который позволяет импортировать FTP_TLS. Но меня напрягает следующее:

from ftplib import FTP_TLS
ftp = FTP_TLS('host', 'username', 'password')
ftp.retrlines('LIST') (Тайм-аут через 15-20 минут)

Я могу успешно запустить эти три строки за считанные секунды на своем локальном компьютере, но на ec2 это не удается. Есть идеи, почему это так?

Спасибо.


person Frank Bi    schedule 25.09.2013    source источник


Ответы (2)


Это определенно похоже на проблему, связанную с тем, находитесь ли вы в режиме PASSIVE на своем FTP-соединении, и могут ли оба конца соединения поддерживать его.

документация ftplib предполагает, что он включен по умолчанию, что очень жаль, потому что Я собирался предложить вам включить его. Вместо этого я предлагаю вам set_debuglevel туда, где вы можете увидеть нижние уровни протокола и посмотреть, в каком режиме вы находитесь. Это должно дать вам информацию о том, как действовать дальше. Либо вы находитесь в пассивном режиме, и другой конец не может справиться с этим должным образом, либо (надеюсь) вы этого не сделаете, но вы должны быть.

FTP и FTPS (но не SFTP) можно настроить так, чтобы сервер выполнял обратное соединение с клиентом для фактической передачи или чтобы клиент выполнял второе прямое соединение с сервером для передачи. Первый особенно подвержен осложнениям всякий раз, когда задействована трансляция сетевых адресов. Без TLS некоторые брандмауэры могут фактически переписать трафик сеанса FTP, чтобы заставить его работать волшебным образом, но с TLS это невозможно из-за шифрования.

Тот факт, что предположительно выполняется аутентификация, а затем время ожидания при попытке передачи данных (LIST требует 2-го соединения в одном или другом направлении), обычно является классическим симптомом установки, которая либо требует пассивного режима, ИЛИ вот это:

Подключитесь, как обычно, к порту 21, неявно защищая* управляющее соединение FTP перед аутентификацией. Для защиты подключения к данным пользователь должен явно запросить его, вызвав метод prot_p().

ftps.prot_p()          # switch to secure data connection
ftps.retrlines('LIST') # list directory content securely

Я не часто работаю с FTPS, так как SFTP гораздо менее проблематичен, но если вы этого не делаете, удаленный сервер может не работать.

* обратите внимание, я подозреваю, что это предложение пытается сказать, что FTP_TLS «неявно защищает управляющее соединение FTP» в отличие от явной защиты соединения для передачи данных.

person Michael - sqlbot    schedule 26.09.2013
comment
Может ли быть так, что сервер блокирует соединение с ec2? Я вызвал prot_p() и set_pasv('true'). Я также успешно вернул приветственное сообщение. Как я уже упоминал, я смог получить список файлов локально — я установил_debuglevel и просмотрел рендеринг — ec2 и local выдали один и тот же результат. - person Frank Bi; 27.09.2013

Если у вас по-прежнему возникают проблемы, попробуйте исключить проблемы с брандмауэром Amazon. (Я предполагаю, что вы не используете брандмауэр на основе хоста.)

Если ваш инстанс EC2 находится в VPC, то в Консоли управления AWS вы можете:

  • убедитесь, что у вас есть интернет-шлюз
  • убедитесь, что подсеть, в которой находится ваш экземпляр EC2, имеет настроенный маршрут по умолчанию (0.0.0.0/0), указывающий на интернет-шлюз
  • в группе безопасности для входящего и исходящего разрешен весь трафик из всех источников (0.0.0.0/0)
  • в сетевых ACL для входящего и исходящего разрешен весь трафик из всех источников (0.0.0.0/0)

Если ваш инстанс EC2 НЕ находится в VPC, то в Консоли управления AWS вы можете:

  • в группе безопасности для входящего разрешить весь трафик из всех источников (0.0.0.0/0)

Выполняйте это только в тестовой среде! (очевидно)

Это откроет ваш экземпляр EC2 для всего трафика из Интернета. Надеюсь, вы обнаружите, что ваш FTPS теперь работает. Затем вы можете постепенно повторно применять правила безопасности, пока не выясните причину проблемы. Если он по-прежнему не работает, значит, проблема не в брандмауэре AWS (или у вас более одной проблемы).

person Community    schedule 29.09.2013