Создание перенаправленного порта в туннеле SSH

Я пытаюсь использовать SSH.NET чтобы создать туннель из localhost:3306 для порта 3306 на удаленной машине:

  PrivateKeyFile file = new PrivateKeyFile(@" .. path to private key .. ");
  using (var client = new SshClient(" .. remote server .. ", "ubuntu", file))
  {

      client.Connect();
      var port = new ForwardedPortLocal(3306, "localhost", 3306);
      client.AddForwardedPort(port);
      port.Start();

            // breakpoint set within the code here

      client.Disconnect();
  }

когда точка останова поражена,client.IsConnected возвращается true, а telnet localhost 3306 не подключается. Если я создам соединение с помощью шпатлевки вместо этого и настрою тот же туннель, он преуспеет. Что я пропустил?

2 ответов


путем изменения параметров ForwardedPortLocal на:

    var port = new ForwardedPortLocal("localhost", 3306, "localhost", 3306);

(чтобы сделать его явным, к какому интерфейсу я привязывался), и добавление следующего кода непосредственно перед port.Start();:

    port.RequestReceived += delegate(object sender, PortForwardEventArgs e)
    {
        Console.WriteLine(e.OriginatorHost + ":" + e.OriginatorPort);
    };

я заметил, что выводится следующее:

    ::1:60309

на e.OriginatorHost часть этого ::1, который является эквивалентом IPv6 localhost, однако, конечный сервер использует протокол IPv4. Изменение параметров на:

    var port = new ForwardedPortLocal("127.0.0.1", 3306, "localhost", 3306);

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


после удара по той же проблеме и ее анализа, и учитывая, что я пришел к выводу, что это ошибка (хотя это можно считать спорным, очевидно, поведение удивляет пользователей SSH.NET API).

поэтому я сообщил об этом неожиданное поведение (a.к. a. ошибка) в локальном туннеле * проблема #117 * sshnet / SSH.NET * GitHub.

пока он не будет исправлен, обходной путь в c# - создание перенаправленного порта в туннеле SSH-переполнение стека завод.