Подтвердить что ты не робот

Отправлять запрос канала с сервера SSH, создавая `ssh_channel_accept_forward()` возврат на SSH-клиент?

Я использую код клиента для прямой и обратной переадресации портов из официальных обучающих программ: http://api.libssh.org/master/libssh_tutor_forwarding.html

Этот код отлично работает при подключении клиента к серверу OpenSSH на Ubuntu 16.10, т.е. достигается прямая и обратная пересылка портов.

Однако рассмотрите код клиента для переадресации обратного порта (web_server()), который использует следующие вызовы:

ssh_channel_listen_forward()

ssh_channel_accept_forward()

Используя мой собственный сервер libssh, проблема заключается в том, что клиент выполняет вызов в ssh_channel_accept_forward() со следующим сообщением об ошибке:

"No channel request of this type from server"

То есть сообщение об ошибке выводится следующим клиентским кодом после ожидания 1 минута:

  channel = ssh_channel_accept_forward(session, 60000, &port);
  if (channel == NULL)
  {
    fprintf(stderr, "Error waiting for incoming connection: %s\n",
            ssh_get_error(session));
    return SSH_ERROR;
  }

Как мне создать запрос канала на стороне сервера, так что клиент не отправляется в ssh_channel_forward_accept() и создается новый прямой канал? Я пробовал большинство функций API без удачи...

Существует ли конкретная функция API для отправки такого запроса канала? Если нет, как мне выполнить задачу запроса канала?

Мой код на стороне сервера идет по следующим строкам, где запрос ssh_channel_listen_forward() захватывается следующей функцией обратного вызова:

void global_request(ssh_session session, ssh_message message, void *userdata) {
    #ifdef DEBUG
    printf("[Debug] global_request()\n");
    #endif
    struct session_data_struct *session_data = (struct session_data_struct*) userdata;
    ssh_message_global_request_reply_success(message, 8080);
    const char *addr = ssh_message_global_request_address(message);
    int port = ssh_message_global_request_port(message);
    printf("Received global request: %s:%d\n", addr, port);
    session_data->channel = ssh_channel_new(session);
    ssh_channel ch = ssh_message_channel_request_channel(message);
    if (ssh_channel_is_open(session_data->channel)) {
        printf("Channel is open!\n");
    }
}

Однако, как указано, сервер не заставляет клиента принимать новый прямой канал при вызове ssh_channel_accept_forward().

Любые идеи?

4b9b3361

Ответ 1

Код сервера не отправляет запрос на открытие обратного туннеля на стороне клиента. Этот канал: session_data->channel создан не связан с сервером. Вы можете попытаться подключить его, но в этом случае вы должны установить подтип "forwarded-tcpip" вручную.

Этот запрос: ssh_message_channel_request_channel(message); возвращает NULL, поскольку запрос пересылки порта не имеет поля канала.

Для запуска обратного туннеля, который вы можете принять с помощью ssh_channel_accept_forward(), вы должны подключиться к подключенному порту прослушивания на стороне сервера. (номер порта от ssh_channel_listen_forward() вы знаете).

P.S. И не используйте обратные вызовы сервера, чтобы принять этот запрос. Libssh по-прежнему фильтрует этот подтип сообщения из обработки обратного вызова.

P.P.S. Прочтите RFC (https://tools.ietf.org/html/rfc4254#page-7) и источник библиотеки. Это полностью читаемый и не такой большой