Skip to content

FTP и NAT

Протокол передачи файлов, впервые стандартизированный в начале 1970-х годов, относится к протоколам прикладного уровня и для передачи данных использует транспортный протокол TCP. FTP был разработан во времена, когда клиенты и серверы взаимодействовали друг с другом напрямую, без посредников и с минимальным количеством препятствий.

Проблемы FTP в современных сетях

В современных сетях (NAT, брандмауэр, балансировщик нагрузки) следующие особенности FTP не позволяют ему нормально работать:

  1. Два отдельных соединения TCP / IP: для передачи данных и для передачи команд;
  2. Соединение для передачи данных может быть установлено на случайном номере порта;
  3. Соединение для передачи данных может исходить как от сервера к клиенту, так и от клиента к серверу;
  4. Адрес назначения соединения для передачи данных (выбор режима работы) согласовывается на лету между клиентом и сервером через соединение для передачи команд;
  5. Соединение для передачи команд находится в режиме ожидания, пока происходит передача данных через соединение для передачи данных.

Проблема 1 вызвана тем, что маршрутизирующее устройство или балансировщик должно поддерживать два соединения между одними и теми же источником и приемником.

Проблема 2 вызвана тем, что FTP не может работать в том случае, если входящие порты жестко ограничены только определенно известными. Т.е. в обычном режиме FTP не может работать только при открытом 21 входящем порте, используемым соединением для передачи команд, ему также необходим набор открытых портов высокого значения (49152-65534) для передачи данных.

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

Проблема 5 вызвана тем, что маршрутизирующие устройства могут прерывать «зависшие» соединения для передачи команд.

Два режима передачи данных в FTP

FTP поддерживает два режима работы: активный и пассивный. Они различаются механизмом установления соединения для передачи данных:

  • В активном режиме сервер подключается со своего 20го порта на оговоренный порт клиента.
  • В пассивном режиме клиент подключается со своего случайного порта на оговоренный порт сервера.

Таким образом, все современные FTP-клиенты обговаривают с сервером то, от кого данные передаются и кто инициирует соединение. Клиент может указать использование активного режима, послав команду "PORT", которая сообщит серверу, что нужно подключиться на определенный IP и порт клиента, и начать отправку данных. Или клиент может использовать пассивный режим, послав команду PASV серверу, которая сообщит серверу, что клиент ожидает IP и порт сервера для начала приема данных.

Поскольку клиент изначально подключается к серверу для установления соединения для передачи команд, было бы логичным, если бы соединение для передачи данных устанавливал так же клиент, т.е. отправлял команду PASV (одновременно устраняя проблему между FTP и брандмауэром). Однако это не так, создатели спецификации FTP почему-то решили, что предпочитаемым режимом должен быть PORT, а поддержка PASV на стороне клиента даже необязательна.

Авторизация в FTP

FTP поддерживает доступ по логину и пароль, но это не безопасно т.к. они передаются открытым текстом. При использовании веб-браузера передать можно прямо в URL.

ftp://<user>:<password>@<host>:<port>/<url-path>

Пример сессий с использованием активного и пассивного режимов передачи данных

Пример активного режима, где клиент подключается анонимно и совершает одну активную передачу данных (просмотр директории).

Сторона Команда Комментарий
Client USER anonymous
Server 331 Guest login ok, send your e-mail address as password
Client PASS NcFTP@
Server 230 Logged in anonymously.
Client PORT 192,168,1,2,7,138 Клиент хочет чтобы сервер подключился на порт 1930 и IP адрес 192.168.1.2.
Server 200 PORT command successful.
Client LIST
Server 150 Opening ASCII mode data connection for /bin/ls. Сервер подключается с порта 21 на порт 1930 и ip адрес 192.168.1.2.
Server 226 Listing completed. Данные переданы успешно.
Client QUIT
Server 221 Goodbye.

Пример пассивного режима

Сторона Команда Комментарий
Client USER anonymous
Server 331 Guest login ok, send your e-mail address as password.
Client PASS NcFTP@
Server 230 Logged in anonymously.
Client PASV Клиент запрашивает у сервера данные для подключения.
Server 227 Entering Passive Mode (172,16,3,4,204,173) Сервер отвечает клиенту, что нужно подключаться на порт 52397 и IP адрес 172.16.3.4.
Client LIST
Server 150 Data connection accepted from 172.16.3.4:52397; transfer starting. Клиент подключился к серверу на порт 52397 и IP адрес 172.16.3.4.
Server 226 Listing completed. Данные переданы успешно.
Client QUIT
Server 221 Goodbye.

Частные проблемы:

  • PORT режим — FTP клиент за NAT или брандмауэром

    Наибольшая проблема, с которой сталкиваются клиенты FTP, использующие активный режим – сервер должен сам подключаться на клиентский ip адрес. Если на его пути будет стоять брандмауэр, отсекающий все входящие подключения, сессия FTP не состоится. Другая проблема — если клиент находится за NAT и использует внутренний ip адрес. Сообщив свой внутренний адрес серверу, клиент обрекает его на невозможность подключения.

    • Решение 1. Клиент FTP должен быть настроен на использование пассивного режима.

    • Решение 2. Настройка NAT за слежением соединений FTP. Когда клиент использует активный режим, NAT устройство должно переписывать внутренний адрес клиента и заменять его внешним адресом устройства. Тогда соединение, для передачи данных с FTP сервера поступив на внешний адрес NAT устройства, будет проброшено им на внутренний адрес FTP клиента за NAT.

  • PASV режим — FTP сервер за брандмауэром

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

    • Решение 1. Администратор может открыть группу портов на брандмауэре, через которые может происходить соединение с FTP сервером.

    • Решение 2. Если есть поддержка со стороны брандмауэра, администратор может настроить так, чтобы порты автоматически открывались для установления пассивного соединения с FTP сервером. Эта настройка схоже с той, что была описана для активного клиента, находящегося за NAT. Таким образом, когда брандмауэр отслеживает ответ FTP сервера на пассивный запрос клиента, он временно открывает порт, указанный в ответе, и только для того IP, с которого исходил пассивный запрос.

  • PASV режим — FTP сервер за NAT

    В режиме PASV FTP сервер отвечает клиенту своим внутренним ip адресом и портом, чем обрекает клиента на невозможность подключения.

    • Решение 1. Настройка NAT за слежением соединений FTP для передачи данных. Когда сервер отправляет ответ в пассивном режиме, NAT устройство должно переписывать внутренний адрес сервера и заменять его внешним адресом устройства. Тогда соединение для передачи данных с FTP клиента, поступив на внешний адрес NAT устройства, будет проброшено им на внутренний адрес FTP сервера за NAT.
  • PASV режим — FTP сервер за балансировщиком нагрузки

    Балансировщик представляет собой один ip адрес, подключение к которому будет перенаправляться на один из балансируемых серверов. Балансировщик представляет две проблемы для FTP. Первая происходит из-за того, что между FTP сервером и клиентом устанавливается несколько соединений: одно для передачи команд и одно или несколько для передачи данных. При пассивном режиме балансировщик должен перенаправлять соединение для передачи данных на тот же сервер, что и соединение для передачи команд. Вторая проблема является следствием первой: когда FTP сервер отвечает пассивным ответом, этот ответ будет содержать внутренний адрес FTP сервера, а не внешний адрес балансировщика.

    • Решение 1. Каждому FTP серверу за балансировщиком присвоить легитимный ip адрес, доступный извне. В этом случае FTP сервер будет способен самостоятельно обслуживать FTP клиентов в пассивном режиме, минуя балансировщик.

    • Решение 2. Настройка балансировщика за слежением соединений FTP для передачи данных. Когда сервер отправляет ответ в пассивном режиме, балансировщик должен переписывать внутренний адрес сервера и заменять его внешним адресом балансировщика. Тогда соединение для передачи данных с FTP клиента, поступив на внешний адрес балансировщика, будет проброшено им на внутренний адрес FTP сервера за балансировщиком.

    • Решение 3. Настроить FTP сервер так, чтобы его ответы в пассивном режиме содержали внешний адрес балансировщика, а не сервера и надеется, что балансировщик перенаправит соединение на ожидающий сервер.

  • Неразрешимая проблема — брандмауэры на обоих концах

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

  • FTP сервер на нестандартном порте

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

    Но даже в этом случае брандмауэр на стороне клиента может помешать. Это может произойти, если брандмауэр на стороне клиента жестко требует, чтобы FTP соединение для передачи данных от FTP сервера исходило с 20 порта (в активном режиме). Если же сервер FTP работает на порту N, то по спецификации FTP его соединения для передачи данных будут исходить с порта N – 1 и блокироваться брандмауэром клиента.

  • Проблемы, вызванные брандмауэрами преждевременно завершающими FTP сессию

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

    Решением данной проблемы является устройство, поддерживающее соединение для передачи команд в активном состоянии даже не смотря на то, что по нему долго не передавались пакеты. Другой вариант — включение функции Keep Alive в стеке протокола TCP/IP на стороне клиента или сервера, которая отправляет пакет проверки доступности через определенные интервалы времени, и если сторона назначения не отвечает — закрывает нормально соединение. Если же принимающая сторона ответит, то соединение со стороны брандмауэра будет считаться активным.

Общие рекомендации

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

Источник 1

Источник 2