• XSS.stack #1 – первый литературный журнал от юзеров форума

Проблема с FTP (Firewall). Помогите пожалуйста.

MAR1O

Developer
Пользователь
Регистрация
18.01.2024
Сообщения
139
Реакции
77
Гарант сделки
4
Лишние данные:

Работаю на сервере (TOR), подключены onion-домены, настроен TOR, подключен PHP и прочее-прочее (установлен модуль ftp.so, из коробки само собой)

Проблема:

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

Обнаружение зависимости:

Методом проб, я обнаружил, что при отключении файрвола скрипт вдруг чудесно начинает работать, без проблем начинает взаимодействовать с файлами.

Моя теория и мой путь ликвидации проблемы:

Настройки файрвола такие (из коробки):


1711743461345.png


Как я сказал выше, соединение с FTP успешно, но не удается работать с файлами. Я знаю, что за соединение отвечает 21 порт, но за работу с файлами по протоколу FTP , вероятно , отвечают другие порты (которые блокируются файрволом / просто не прописаны или ещё что-либо)

Как я понял, за взаимодействие с файловой системой (передачу данных) отвечает функция PASV mode , для которой используется другой порт/порты

Я сделал отправку команды PASV, на что получил ответ, где на выходе получился порт 64320 , который нужен для передачи данных по FTP.

Я добавил правило в файрвол, но ничего не сработало.

Затем я написал мелкий скрипт, который логирует подключения к порту для передачи данных FTP и при каждом новом подключении выдавался новый порт. Каждый раз при обновлении страницы (т.е при новом подключении, я получал порты 64878, 51926, 36905, 59343 ...)

Вопросы:

Значит, чтобы всё сработало, я должен добавить соответствующее правило именно для диапазона портов? Какой диапазон тогда использовать, чтобы не "продырявить" файрвол? И вообще, правильно ли я вышел на соответствующую ошибку или проблема крылась в чём-то более простом/сложном? Подскажите пожалуйста решение)
 
Последнее редактирование:

Исходя из того, что я прочёл - разрешил все соединения с портом 20 и портами в диапазоне 1024-65535. Что касается порта из диапазона, то это как раз и было корнем проблемы (как я и написал в теме). При разрешении входящего/исходящего трафика - всё отлично.

1711788318310.png



При таком условии, FTP-скрипт начинает работать корректно, но когда это правило файрволла включено, мой сайт выдаёт ошибку 502

1711788443790.png


В чём может быть дело?
 
При таком условии, FTP-скрипт начинает работать корректно, но когда это правило файрволла включено, мой сайт выдаёт ошибку 502
а что в логах nginx?
по умолчанию они раполгаются в /var/log/nginx/error.log
 
а что в логах nginx?
по умолчанию они раполгаются в /var/log/nginx/error.log

Код:
2024/03/30 09:42:38 [error] 4386#0: *251 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server: domain.onion, request: "POST /order.php HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi-74.sock:", host: "domain.onion", referrer: "http://domain.onion/"
 
получается ты запросы с nginx проксируешь на php-fpm, а с него подключаешься к ftp серверу, забираешь данные и отдаешь клиенту?

если да, то размера буфера может не хватать, попробуй добавить в php.ini buffer-size=65535 или output_buffering = 65535, если 1 вариант не сработает
 
получается ты запросы с nginx проксируешь на php-fpm, а с него подключаешься к ftp серверу, забираешь данные и отдаешь клиенту?

если да, то размера буфера может не хватать, попробуй добавить в php.ini buffer-size=65535 или output_buffering = 65535, если 1 вариант не сработает

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


PHP:
    $ftpSource = ftp_connect($ftp_server);
    ftp_login($ftpSource, $ftp_login, $ftp_password);

    $sourceFolderPath = $ftp_node;

    $destFolderPath = $ftp_taken;

    $files = ftp_nlist($ftpSource, $sourceFolderPath);

    usort($files, function($a, $b) use ($ftpSource) {
    return ftp_mdtm($ftpSource, $a) - ftp_mdtm($ftpSource, $b);
    });

    $oldestFile = reset($files);

    $filename = basename($oldestFile);
    ftp_rename($ftpSource, $sourceFolderPath . $filename, $destFolderPath . $filename);

    ftp_close($ftpSource);

    $address = pathinfo($filename, PATHINFO_FILENAME);


Переменные, соответственно содержат данные для подключения к FTP, которые само собой являются корректными, да и на клирнет-серверах всё работает отлично, а здесь какой-то ужас...
 
покажи содержимое
/etc/php/<version>/fpm/php-fpm.conf
/etc/php/<version>/fpm/php.ini
и файлов из /etc/php/<version>/fpm/pool.d/*, если есть

Проблему решил. В чём она была - не понял, но переделал скрипт FTP и всё заработало:


PHP:
$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_login, $ftp_password);

// Получаем список файлов в директории $ftp_node
$files = ftp_nlist($conn_id, $ftp_node);

// Выбираем случайный файл из списка
$random_file = $files[array_rand($files)];

// Получаем название файла без расширения
$address = pathinfo($random_file, PATHINFO_FILENAME);

// Перемещаем файл из $ftp_node в $ftp_taken
ftp_rename($conn_id, $ftp_node . basename($random_file), $ftp_taken . basename($random_file));

// Закрываем соединение с FTP сервером
ftp_close($conn_id);

Хотя на клирнет серверах первый скрипт тоже работал корректно, в общем, паронормальные явления :) Благодарю за помощь, ваш первый ответ решил вопрос
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх