Commons Net FTPHTTPClient: туннели HTTP-прокси для пассивного FTP
Туннелируйте управление FTP и пассивные соединения данных через HTTP-прокси с помощью специализированного клиента Commons Net.
Apache Commons Net включает FTPHTTPClient для работы с FTP через HTTP CONNECT-прокси. Его полезная особенность не только в достижении порта входа FTP: он также устанавливает туннели прокси для пассивных соединений данных, которые используются списками и передачей файлов.
Конструктор принимает конечную точку прокси и необязательные учётные данные прокси. Сервер FTP остаётся аргументом connect, а login получает учётную запись FTP:
FTPHTTPClient ftp = new FTPHTTPClient(
"proxy.example.net", 8080, proxyUser, proxyPassword
);
try {
ftp.connect("ftp.example.net", 21);
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
throw new IOException(ftp.getReplyString());
}
if (!ftp.login(ftpUser, ftpPassword)) {
throw new IOException(ftp.getReplyString());
}
ftp.enterLocalPassiveMode();
if (!ftp.setFileType(FTP.BINARY_FILE_TYPE)
|| !ftp.retrieveFile(remoteFile, output)) {
throw new IOException(ftp.getReplyString());
}
ftp.logout();
} finally {
if (ftp.isConnected()) {
ftp.disconnect();
}
}
Этот фрагмент передачи предполагает импорты FTP из Commons Net, java.io.IOException, переменные учётных данных, предоставляемые приложением, и выходной поток, принадлежащий вызывающему коду. remoteFile — предполагаемое имя файла на стороне сервера. Приложение также должно закрыть свой выходной поток в подходящий момент.
Установите пассивный режим после подключения и перед операцией с данными. Реализация FTPHTTPClient отклоняет соединения данных в активном режиме. В пассивном режиме она согласует конечную точку данных с FTP и открывает ещё одно соединение с HTTP-прокси, затем запрашивает туннель CONNECT к этой конечной точке.
Этот второй туннель объясняет распространённое ограничение: разрешения прокси для порта управления FTP недостаточно. Разрешённые назначения и порты должны включать пассивные конечные точки данных сервера. Успешное приветствие и вход доказывают лишь, что маршрут управления работал.
Реализация обеспечивает Basic-аутентификацию прокси, когда присутствуют и имя пользователя, и пароль прокси. Это отличается от обмена FTP USER/PASS. Прокси, требующему другого механизма аутентификации, нужен совместимый коннектор; конструктор делает доступными не все схемы.
Commons Net документирует этот класс как экспериментальный, поэтому оцените его с точки зрения требований приложения и прокси, прежде чем принимать. Это клиент FTP, а не FTPS или SFTP. Для FTPS с доступной службой SOCKS интерфейс сокет-прокси FTPSClient — отдельный клиентский путь. CONNECT предоставляет маршрут и сам не шифрует учётные данные FTP или содержимое файлов.
Держите ошибки привязанными к этапу, на котором они возникли: отказ HTTP при настройке туннеля, отказ во входе FTP или сбой передачи FTP/данных. Замена пароля FTP не может решить политику прокси, отклоняющую пассивный порт данных.