"php_connect_nonb() завершилась неудачно: операция в процессе (115)" с FTP-соединением с шифрованием TLS/SSL в PHP - работает незашифрованное соединение

Я пытаюсь использовать скрипт автоматического резервного копирования для учетных записей cPanel моего сервера.
Я установил FTP-сервер на одном локальном компьютере с сервером FileZilla. Я могу успешно подключаться и передавать файлы с помощью клиента FileZilla, сервера Plesk и lftp...
Сервер принимает только зашифрованные соединения, и пассивный режим включен.

По неизвестной причине при попытке подключиться и положить файлы с PHP ответ:

Предупреждение: ftp_put(): php_connect_nonb() не удалось: операция в процессе (115) в
/home/xxxxxxx/public_html/lab/test/perform_mysql_bk.php в строке 326

Есть идеи для этой ошибки?

Для связи я использую:

$fSuccess = false;

$sServerAddress = $this->m_aConfig['FTP_SERVER_ADDRESS'];
$iServerPort = (int)( $this->m_aConfig['FTP_SERVER_PORT'] );

// set up FTP connection
if ( ($this->m_aConfig['FTP_USE_SSL'] == 'YES') ) {

    if ( function_exists('ftp_ssl_connect') ) {
        $this->m_oFtpConnection = ftp_ssl_connect( $sServerAddress, $iServerPort );

        if ( !$this->m_oFtpConnection ) {
            $this->writeLog( "Attempt to connect to ".$sServerAddress.":".$iServerPort." with SSL+FTP failed. Will fallback to normal FTP." );
        }
        else {
            $this->writeLog( "Attempt to connect to ".$sServerAddress.":".$iServerPort." with SSL+FTP Succeeded. Now logging in ..." );
        }
    }
    else {
        $this->writeLog( "This server doesn't support FTPS (FTP with SSL). Will fallback to normal FTP." );
    }
}

//Fallback
if ( !$this->m_oFtpConnection ) {
    $this->m_oFtpConnection = ftp_connect( $sServerAddress, $iServerPort );
}

// login after a successful connection
if ( $this->m_oFtpConnection ) {
    $fLoginResult = ftp_login( $this->m_oFtpConnection, $this->m_aConfig['FTP_USERNAME'], $this->m_aConfig['FTP_PASSWORD'] ); 
    //echo $fLoginResult;
}
else {
    $this->writeLog( "Attempt to connect to ".$sServerAddress.":".$iServerPort." failed." );
}

// check connection
if ( (!$this->m_oFtpConnection) || (!$fLoginResult) ) { 
    $this->writeLog( "FTP connection has failed!" );
} else {
    $this->writeLog( "FTP connection was successful with ".$sServerAddress.":".$iServerPort );
    $fSuccess = true;
}

// Set to Passive connection if login was successful and this setting was set.
if ( $fSuccess && ($this->m_aConfig['FTP_USE_PASSIVE'] == 'YES') ) {

    if ( ftp_pasv( $this->m_oFtpConnection, true ) ) {
        $this->writeLog( "FTP connection was set to PASSIVE mode." );
    }
    else {
        $this->writeLog( "Attempted to set FTP connection to PASSIVE mode but failed. Going to continue with copy anyway. If the script fails, review this as a possible source." );
    }
}

Ответ успешен: (я заменил свой IP на значения xx)

Попытайтесь подключиться к xx.xx.xx.xx:21 с помощью SSL+FTP Успешно. Теперь вход в систему...
FTP-соединение прошло успешно с xx.xx.xx.xx:21
FTP-соединение было установлено в режим PASSIVE.

Но когда система поражает это:

$fSuccess = false;

$sDestinationFile = $this->m_aConfig['FTP_PATH_TO_COPY'] . $insDbFileName;

// upload the file
$fUpload = ftp_put( $this->m_oFtpConnection, $sDestinationFile, $insDbFileName, FTP_BINARY ); 

// check upload status
if (!$fUpload) { 
    $this->writeLog( "FTP upload has failed! Check the log file for errors. Try changing PASSIVE and SSL options in the config." );
    return false;
} else {
    $this->writeLog( "Uploaded $insDbFileName to ".$this->m_aConfig['FTP_SERVER_ADDRESS']." as $sDestinationFile" );
    $fSuccess = true;
}

return $fSuccess;

Ответ - ошибка

Предупреждение: ftp_put(): php_connect_nonb() не удалось: операция в процессе (115) в
/home/xxxxxxx/public_html/lab/test/perform_mysql_bk.php в строке 326

Я прочитал много страниц, говоря, что эта ошибка вызвана тем, что FTP-сервер возвращает внутренний IP-адрес вместо общедоступного, но я проверил с другими программами, и все работает нормально, FTP-сервер отправляет общедоступный IP-адрес при выполнении команды PASV,

Есть идеи?

1 ответ

Решение

Подобное поведение PHP-кода и curl предполагает, что брандмауэр блокирует подключение к данным.

Поскольку работает незашифрованное соединение, вероятно, что брандмауэр "умный", отслеживая управляющие соединения FTP и автоматически перенаправляя порты для передачи данных, найденные в управляющем соединении. Но это не может работать для зашифрованных сеансов, так как брандмауэр не может их контролировать.

См. Также раздел "Умные брандмауэры /NAT" моего руководства о настройке сети для FTP.

Если вам нужно разрешить зашифрованное соединение, вам нужно поговорить с администратором сервера.

ftp_set_option($ftpconn, FTP_USEPASVADDRESS, false);

Эта строка кода перед установкой пассивности соединения ftp_pasv($ftpconn, true);спас мою жизнь.

У меня была та же проблема, исправленная добавлением IP-адреса ftp-сервера в список разрешенных IP-адресов брандмауэра

Другие вопросы по тегам