【问题标题】:.NET SSH port forwarding.NET SSH 端口转发
【发布时间】:2011-02-19 14:36:42
【问题描述】:

我正在尝试将 SSH 端口转发构建到我正在编写的 .NET 应用程序中。

我尝试过使用sharpSSH,但它要求用户每次都输入密码,我不希望这样。我将处理存储密码。

我已经下载了Granados,但它的文档基本上为零。如何使用 Granados 或任何其他适用于 .NET 的免费 SSH 库完成端口转发?

【问题讨论】:

    标签: c# .net networking ssh portforwarding


    【解决方案1】:

    SSH.NET library 是实现此目的的简单方法:

    using (var client = new SshClient("client.net", "user", "password"))
    {
        client.Connect();
    
        var port = new ForwardedPortLocal("localhost", 10000, "remote.net", 80);
        client.AddForwardedPort(port);
    
        port.Exception += delegate(object sender, ExceptionEventArgs e)
        {
            Console.WriteLine(e.Exception.ToString());
        };
        port.Start();
    
        // ... hold the port open ... //
    
        port.Stop();
        client.Disconnect();
    }
    

    【讨论】:

    • 这是旧的,我可能无法得到答案,但是 client.net 是运行 SSH 服务器的服务器吗? remote.net 会是什么?对 localhost:1000 的任何请求都将发送到 client.net,然后将请求转发到 remote.net:80?那正确吗?还是会直接从我的本地主机访问 remote.net?
    • 是的,client.net 是 SSH 服务器。 remote.net:80 是您要通过 SSH 隧道连接的计算机。正如您所说,对 localhost:10000 的任何请求都将通过 SSH 发送到 client.net,然后将请求转发到 remote.net:80。因此 localhost 和 remote.net 之间没有直接连接。
    • 实际上,该代码不起作用,由于某种原因 SSH.NET 无法正确解析 localhost,但 127.0.0.1 似乎可以正常工作;认为这与我的网络配置有关,无论如何使用 localhost 在这里并不可靠
    • 有没有关于如何配置.net ssh 服务器的教程?
    • 我一直在努力让它工作,看起来你可以让localhost离开端口ForwardedPortLocal调用——缺点是任何IP都可以连接到SSH服务器在端口 10000 上,它将被转发到 remote.net:80。如果在您的情况下这不是安全问题,那么您很好 - 否则您需要找出您的本地主机名或 IP 并将其而不是 localhost。
    【解决方案2】:

    如果您在 SSH 服务器上远程设置了 DSA 密钥,您可以为用户保存一个密钥(一次性完成),然后作为授权用户将该密钥保存在服务器上。

    【讨论】:

    • 使用密钥对于反向连接和指纹非常危险
    【解决方案3】:

    这些 C# 替代方案均源自 JCraft 的 Java Jsch

    1. sharpSSH(自 2010 年 1 月起无效)/author's page/article
    2. DotNetSSH(自 2010 年 6 月起无效)
    3. SSH.NET Library(2012 年 1 月有效)
    4. Nsch(从 Jsch 2012 年 2 月生成/更新)

    Granados product page 链接到 Poderosa 项目,其中包括 PortForwarding plugin。那里的channel.csconnectionmanager.cs 文件的source code 似乎实现了端口转发。请参阅a recommendation 的此答案。

    Nsch 似乎是 MonoDevelop 的 NGit 中隐藏的宝石;它是来自 Jsch 的 mostly-automatically converted (background info)。

    Further research 于 2011 年 2 月由 Sumatra PDF 的Krzysztof Kowalczyk 撰写。

    【讨论】:

      【解决方案4】:

      虽然文档记录不佳 - 或者至少文档让我无法理解 - 这似乎能够处理 SSH 连接,包括文件传输和端口转发:https://github.com/sshnet/SSH.NET

      【讨论】:

        【解决方案5】:

        这是一种无需提升任何parameters: (全自动端口转发)的方法,使用SharpSSH

        (用户、主机、Lport、Rhost、Rport、DSA-key-confirmation、密码)

            Dim JJ As Tamir.SharpSsh.jsch.JSch = New Tamir.SharpSsh.jsch.JSch()
            Dim sess As Tamir.SharpSsh.jsch.Session = JJ.getSession("user", "remoteadd.dydns.com")
            Dim conf As Hashtable = New Hashtable()
            conf.Add("StrictHostKeyChecking", "no")
            sess.setConfig(conf)
            sess.setPassword("password")
            sess.connect()
            sess.setPortForwardingR(45, "127.0.0.1", 256)
        

        【讨论】: