Вход по FTP работает, но список каталога зависает: почему
Вход по FTP и списки каталогов используют два разных соединения. Когда список зависает, проверяйте адрес пассивных данных и диапазон портов, а не пароль.
Имя пользователя работает, пароль работает, и клиент сообщает, что подключён. Затем он бесконечно ждёт список каталога или первую передачу файла, и ничто в учётных данных этого не объясняет. FTP открывает второе соединение для каждого списка и каждого файла, и именно это второе соединение отказывает. Вход доказывает только то, что первый разговор работает.
Выполняйте проверки по порядку. Каждая исключает свой уровень, поэтому остановитесь на первой, которая даст аномалию.
Сначала разделите два соединения
Управляющее соединение передаёт команды и ответы на порт прослушивания сервера. Соединение данных передаёт список каталога или тело файла, и в пассивном режиме сервер выбирает свою конечную точку и объявляет её в ответе PASV или EPSV. Разрешение порта 21 ничего не говорит о доступности порта данных, и именно поэтому вход удаётся, а каждый список заканчивается тайм-аутом. Руководство WinSCP по режимам FTP объясняет это разделение и его сетевые требования.
Если клиент находится за VPN, путь данных проходит через тот же туннель, но не обязательно через ту же политику.
Прочитайте адрес в ответе PASV
Запустите подробный клиент и прочитайте ответ вместо догадок. curl -v ftp://user@host/ печатает строку PASV с адресом и портом, которые хочет сервер, и именно к этому адресу клиент подключается дальше. Если это частный адрес, который ничего не значит на стороне клиента в туннеле, соединение данных никуда не идёт, пока управляющий канал остаётся здоровым.
Сравните этот адрес с адресом, до которого клиент действительно дошёл. Расхождение и есть ответ, и обычно оно происходит от NAT или от сервера, настроенного с внутренним адресом.
Проверьте диапазон портов и политику туннеля
Пассивные серверы выделяют порты данных из настроенного диапазона, и этот диапазон должен быть разрешён через VPN и любой межсетевой экран на пути. Политика, разрешающая 21 и ничего больше, — это политика только для входа. Подтвердите диапазон у того, кто администрирует сервер, затем проверьте один порт из него, а не предполагайте, что весь диапазон ведёт себя одинаково.
Зашифрованные управляющие каналы усложняют это, потому что промежуточное устройство больше не может переписать объявленный адрес на лету.
Знайте, когда помогает EPSV или запасной вариант
EPSV возвращает порт без отдельного адреса, что устраняет сбой из-за неверного адреса, когда обе стороны его поддерживают. Некоторым клиентам можно также указать игнорировать объявленный адрес и повторно использовать назначение управляющего соединения. И то и другое — законные инструменты для конкретной топологии, а не универсальное решение.
Не отключайте TLS только ради того, чтобы вспомогательный инструмент осмотрел сеанс. Это меняет работающий протокол на сломанную модель угроз.
Подтвердите списком и передачей
После изменения политики адреса или порта откройте новый сеанс по тому же пути VPN и выведите список каталога. Затем передайте небольшой файл, потому что список и передача на некоторых серверах могут идти разными путями кода. Проверьте в журнале клиента соединение данных с ожидаемым адресом и портом и подтвердите, что байты пришли.
Держите FTP, FTPS и SFTP раздельно в голове, пока это делаете. Изменение пассивного порта — не настройка SFTP, и исправление не переносится между протоколами.