首页 > 解决方案 > 通过 SSH.NET ForwardedPortLocal 从 .NET 代码连接到 MySQL 不起作用

问题描述

我必须通过外部网络访问具有 IP (1.1.1.1) 的计算机上的 MySQL 数据库。

我用 SSH.NET 创建了一个隧道,但是我无法访问 MySQL 中数据库所在计算机的 IP(1.1.1.1)。

直到公共 IP,隧道似乎都可以工作,但我无法访问计算机 IP (1.1.1.1),因为我不了解 SSH.NET 的工作原理。使用 PuTTY 输入端口的公共 IP,并在 SSH 隧道部分插入具有端口 3306 的 IP 计算机(1.1.1.1),它运行良好。代码是这样的

using (var client = new SshClient("ip public", port, "user", "password")) 
{
    client.Connect();
    if (client.IsConnected)
    {
        var portForwarded = new ForwardedPortLocal("127.0.0.1",22, "1.1.1.1",3306);
        client.AddForwardedPort(portForwarded);
        portForwarded.Start();

        string db = @"Server=127.0.0.1;Port=3306;Database=xxx;Uid=root;Pwd=xxx;";
        {
            var mySQLCon = new MySqlConnection(db);

            mySQLCon.Open();

            if (mySQLCon.State == ConnectionState.Open)
            {
                MainWindow stx = new MainWindow(db);
                stx.ShowDialog();
            }
        }
    }
}

我把参数放错了ForwardedPortLocal吗?

ForwardedPortLocal("127.0.0.1",22, "1.1.1.1",3306);

我想知道我ForwardedPortLocal是否正确输入了参数,或者我在使用 SSH.NET 建立隧道时错在哪里......

标签: c#mysqlsshtunnelssh.net

解决方案


boundPort参数ForwardedPortLocal是要转发的本地端口。那是您与 MySQL 客户端连接的端口。所以不是22

虽然您可以对端口进行硬编码3306,但最好通过省略该参数让 SSH.NET 自动分配一个空闲的本地端口:

var portForwarded = new ForwardedPortLocal("127.0.0.1", "1.1.1.1", 3306);

然后ForwardedPortLocal.BoundPort在您的连接字符串中使用,而不是硬编码3306.


也可以看看:


推荐阅读