在SSH隧道中创建转发端口

16

我正在尝试使用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 没有连接。如果我使用Putty创建连接,并在那里设置相同的隧道,则可以成功。我错过了什么?


你是否收到针对Telnet应用程序的特定警告?它是否关闭了? 二进制连接数据可能无法显示... - Maarten Bodewes
它挂起来了,无法连接。当使用Putty时,我得到了一串数据。 - Adrian Wragg
尝试使用此链接:我认为断开客户端是问题所在。如果在“Start”和“Disconnect”之间中断,则可能会停止转发。 - Maarten Bodewes
旧版本的库中似乎存在许多错误,请确保您正在使用最新版本。 - Maarten Bodewes
@owlstead 谢谢 - 我已经检查过了,我正在使用2013.4.7.0,这是最新版本。 - Adrian Wragg
@owlstead 客户端没有断开连接,而且我也没有像“中断”那样的问题——我只是有一个代码会触发断点,然后我就会进入我的 Telnet 客户端。请注意,我已经注释掉的代码是设计用于使用隧道的,如果我独立运行它(使用 Putty 创建隧道),它会成功运行。 - Adrian Wragg
2个回答

21

将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,它是localhost的IPv6等效形式;然而,目标服务器正在使用IPv4。将参数更改为:

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

强制使用IPv4运行隧道,我的代码就按照我期望的方式正常工作了。


1
非常感谢您提供的解决方案。我已经尝试解决这个问题好几个小时了 >.< - Keenora Fluffball
如果你像我一样在本地开发机器上使用MySQL实例时遇到了困难,请查看我的问题 :-) http://stackoverflow.com/questions/40592492/ssh-access-using-renci-ssh-to-mysql-server/40606542#40606542 - Captain John

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接