Назад | Перейти на главную страницу

Риски использования активного режима FTP вместо пассивного.

На сервере я использую сценарий Perl, который должен регулярно загружать несколько файлов по FTP с другого сервера. К сожалению, в модуле Perl FTP есть некоторая проблема, которая время от времени приводит к сбою и неожиданному завершению сценария. Я обнаружил, что эту проблему можно легко решить, переключившись из пассивного режима в активный.

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

В двух словах:

  • FTP-соединения состоят из двух потоков: командного (управления) и данных.
  • Когда сокет открыт и код явно не привязан к порту, ОС будет использовать порт с высоким номером в своем временном диапазоне портов (sysctl -a | grep ip_local_port_range)
  • Некорневые процессы должны использовать порты> 1024

Активный режим FTP

Клиент подключается к серверу через порт 21 и устанавливает поток команд:

client:32198 -> server:21

Клиент должен отправить или получить некоторые данные, поэтому он сообщает серверу, что нужно подключиться к нему через какой-то порт. Для этого он отправляет команду PORT, подобную этой:

PORT 1,2,3,4,5,6

Это клиент, информирующий сервер, что сервер может подключиться обратно к клиенту (по адресу 1.2.3.4 на порту (5 * 256) + 6 = 1286.

server:20 -> client:1286

Обычно именно здесь умирают сеансы FTP в активном режиме; Что касается брандмауэров и балансировщиков нагрузки, ожидается, что трафик, обычно идущий от клиента к серверу, будет, но соединения, инициированные сервером с клиентом, часто отклоняются (балансировщики нагрузки часто достаточно умны, чтобы связать этот поток данных с существующим командным потоком ).

Ваше понимание необходимости открытия диапазона портов на вашем брандмауэре для облегчения такого поведения является абсолютно правильным.

Пассивный режим FTP

В этом сценарии клиент устанавливает командный сеанс, как и раньше:

client:56221 -> server:21

Но когда данные передаются, клиент отправляет PASV командный примитив. Сервер отвечает комбинацией IP: Port, к которой клиент должен подключиться обратно (в формате, аналогичном PORT запрос раньше. Затем клиент подключается к серверу следующим образом:

client:12347 -> server:4566

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

Обратной стороной пассивного режима является то, что он потребляет больше сокетов на сервере. Выдача часто PASV примитивы в сильно загруженной среде могут в конечном итоге привести к исчерпанию портов. (Розетки будут оставаться в TIME_WAIT состояние в течение некоторого времени, определенного ОС (~ 2 минуты, я думаю, в системах Redhat).

О твоей проблеме

Если вы действительно не страдаете от проблем с нехваткой портов, очень редко бывает, что пассивный режим дает сбой, а активный - чаще бывает успешным. Обычно бывает наоборот. Если у вас есть возможность публиковать дополнительные сведения об ошибках, которые вы иногда получаете, мы можем отладить их дальше.

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

проблема не связана с самим Perl. Более того, решение установить активные FTP-соединения вместо пассивных - как раз тому доказательство.

На самом деле, проблема выше возникает при попытке просмотреть содержимое каталога FTP, а не при подключении или загрузке / скачивании. Следовательно, проблема связана с межсетевым экраном.

Вы должны проверить, разрешает ли ваш брандмауэр проходить пассивные FTP-соединения, прочтите превосходное описание loopforever выше.

При использовании брандмауэра на базе Linux одна загвоздка - выгрузить память nf_conntrack_ftp.

В активном режиме клиент подключается к серверу через порт 21 для канала управления, а затем, когда начинается загрузка, клиент начинает прослушивать сокет со случайным номером порта выше 1024 для подключения сервера.

Чтобы разрешить FTP в активном режиме, брандмауэр клиента должен разрешать весь входящий трафик через порт 1024, который побеждает цель брандмауэра.

Пассивный режим означает, что сервер прослушивает порт 20, а клиент инициирует соединение.

Вы всегда должны использовать пассивный режим с FTP. Или еще лучше не используйте FTP. Если вы загружаете файл, лучше всего использовать HTTP. Если вам нужно загрузить файл, все равно делайте это с помощью HTTP (или другого протокола, например scp).