Пассивный режим FTP (PASV) — режим соединения, при котором сервер открывает порт для передачи данных и ждёт подключения клиента. Решает проблему активного режима (PORT), где сервер инициирует обратное соединение к клиенту — это блокируется файерволами и NAT.
Как работает
В активном режиме FTP:
- Клиент подключается к серверу на порт 21 (управляющий канал).
- Клиент командой PORT сообщает серверу свой IP и порт для данных.
- Сервер инициирует соединение к клиенту на указанный порт.
Проблема: файервол клиента блокирует входящее соединение от сервера. NAT не знает, что делать с входящим соединением на случайный порт.
В пассивном режиме (PASV):
- Клиент подключается к серверу на порт 21.
- Клиент отправляет команду PASV.
- Сервер отвечает: «подключись ко мне на порт 40123».
- Клиент открывает новое соединение на указанный порт.
Клиент всегда инициирует оба соединения → NAT и файерволы работают корректно.
История
FTP-протокол разработан в 1971 году, когда NAT и файерволы не существовали — активный режим был единственным. Пассивный режим добавлен в RFC 959 (1985). С распространением NAT в 1990-х и файерволов в 2000-х пассивный режим стал обязательным для большинства сценариев. EPSV (Extended Passive Mode, RFC 2428) — улучшение для IPv6-соединений. Сегодня все современные FTP-клиенты используют PASV по умолчанию.
Настройка пассивного режима на сервере
vsftpd требует указания диапазона портов для пассивного режима:
# /etc/vsftpd.conf
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
pasv_address=1.2.3.4 # внешний IP сервера (важно за NAT)
# Открыть порты в UFW
ufw allow 21/tcp
ufw allow 40000:50000/tcp
Параметр pasv_address критичен: если VPS за NAT, без этого параметра сервер сообщает клиенту внутренний IP — соединение не устанавливается. Указывайте внешний IP сервера.
SFTP как альтернатива
SFTP решает все проблемы FTP одним портом: управление и данные передаются через единый SSH-туннель (порт 22). Нет нужды в пассивном режиме, открытии диапазона портов и разбирательствах с NAT. Современные хостинг-панели (ISPmanager, Plesk) создают SFTP-аккаунты наравне с FTP. Cyberduck, FileZilla и WinSCP поддерживают SFTP без дополнительных настроек.
FTPS и пассивный режим
FTPS (FTP over TLS) шифрует управляющий канал и данные. Пассивный режим в FTPS требует дополнительной настройки: TLS-сессия должна быть одна для обоих каналов или разрешены разные сессии. Параметр vsftpd require_ssl_reuse=NO решает проблему совместимости с некоторыми клиентами. FTPS сложнее SFTP в настройке и устранении неполадок.
На что обращать внимание
Слишком узкий диапазон пассивных портов при большом числе одновременных подключений исчерпывается — клиенты получают ошибку «no data connection». Рекомендуется минимум 100-200 портов для каждых 50 одновременных пользователей. На VPS с несколькими IP убедитесь, что pasv_address указывает на правильный внешний IP. Диапазон портов ufw должен точно совпадать с pasv_min_port-pasv_max_port.
Утилита ftp в командной строке: ftp -p server.example.com — флаг -p принудительно включает пассивный режим. Для скриптов используйте lftp: lftp -e "set ftp:passive-mode on; mirror /remote /local; quit" -u user,pass server.