FTP и NAT
Протокол передачи файлов, впервые стандартизированный в начале 1970-х годов, относится к протоколам прикладного уровня и для передачи данных использует транспортный протокол TCP. FTP был разработан во времена, когда клиенты и серверы взаимодействовали друг с другом напрямую, без посредников и с минимальным количеством препятствий.
Проблемы FTP в современных сетях
В современных сетях (NAT, брандмауэр, балансировщик нагрузки) следующие особенности FTP не позволяют ему нормально работать:
- Два отдельных соединения TCP / IP: для передачи данных и для передачи команд;
- Соединение для передачи данных может быть установлено на случайном номере порта;
- Соединение для передачи данных может исходить как от сервера к клиенту, так и от клиента к серверу;
- Адрес назначения соединения для передачи данных (выбор режима работы) согласовывается на лету между клиентом и сервером через соединение для передачи команд;
- Соединение для передачи команд находится в режиме ожидания, пока происходит передача данных через соединение для передачи данных.
Проблема 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