web-dev-qa-db-ja.com

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.IsConnectedtrueを返しますが、telnet localhost 3306は接続していません。代わりにPuTTYを使用して接続を作成し、そこに同じトンネルを設定すると、成功します。私は何を逃しましたか?

13
Adrian Wragg

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で実行すると、コードは期待どおりに機能しました。

17
Adrian Wragg

同じ問題にぶつかって分析し、それがバグであるという結論に達したと考えた後(議論の余地があると思われるかもしれませんが、明らかにこの動作はSSH.NET APIのユーザーを驚かせます)。

だから私はそれを報告しました ローカルトンネルでの予期しない動作(別名バグ)・問題#117・sshnet/SSH.NET・GitHub

修正されるまで、 c#-SSHトンネル内に転送ポートを作成する-スタックオーバーフロー の回避策は機能します。

0