无法使用SSH.Net Tunnel连接到C#中的任何指定MySQL主机

时间:2013-06-28 12:38:44

标签: mysql ssh portforwarding

我正在尝试使用使用OpenSSH密钥文件和SSH.Net库设置的SSH隧道连接到远程mysql服务器,如下面的代码部分所示...

try
{
    PrivateKeyFile pkfile = new PrivateKeyFile("C:\\Users\\OpenSSHKey", "mypassword");
    var client = new SshClient("servername.com", 22, "myusername", pkfile);
    client.Connect();
    if (client.IsConnected)
    {
        var local = new ForwardedPortLocal(22, "localhost", 3306);
        client.AddForwardedPort(local);
        try
        {
            local.Start();
        }
        catch (SocketException se)
        {

        }
        string connStr = "server=localhost;user=mysql_username;database=database_name;port=3306;password=MyDBPassword;";
        MySqlConnection sql = new MySqlConnection(connStr);
        sql.Ping();
        try
        {
            sql.Open();
        }
        catch (MySqlException se)
        {
        }
    }
}
catch(Exception e)
{
}

隧道肯定是设置好的,因为它会在sql.Open()调用中抛出以下错误“无法连接到任何指定的MySQL主机”...

我确定数据库位于名为mysername的服务器上,因为我可以使用putty或workbench连接到它,并使用MYSQL连接字符串中使用的凭据...我希望有人可以提供帮助

1 个答案:

答案 0 :(得分:3)

我自己刚刚解决了这个问题。只需将您的ForwardedPortLocal更改为:

    var local = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);

在原始版本中,您将源端口设为22。但是,您的MySql连接将连接到本地计算机上的端口3306(然后您将通过隧道传输到目标上的端口3306),因此您需要确保转发的端口在3306上本地侦听从...开始。

此外,我已将localhost更改为127.0.0.1。我遇到的第二个问题是我的计算机上的localhost实际上已解析为::1,这是一个IPv6地址,而目标服务器并没有“说”IPv6。通过将其切换到127.0.0.1(IPv4的localhost版本),它可以确保默认使用IPv4。