С# SSH-туннель Подключение к базе данных Postgres

Я пытаюсь подключиться к базе данных Postgres на удаленном сервере через туннель SSH. Я использую SSH.NET и библиотеку Npgsql. Вот мой пример кода:

using (var client = new SshClient("210.130.90.110", "root", "pasword"))
{
    client.Connect();

    if (!client.IsConnected)
    {
        // Display error
        Console.WriteLine("Client not connected!");
    }
    else
    {
        Console.WriteLine("Client connected!");
    }

    var port = new ForwardedPortLocal("127.0.0.1", 15432, "210.130.90.110", 5432);
    client.AddForwardedPort(port);

    port.Start();

    using (var conn = new NpgsqlConnection("Server=127.0.0.1;Database=dbname;Port=15432;User Id=dbuser;Password=dbpassword;"))
    {
        conn.Open();
    }

    port.Stop();
    client.Disconnect();
}

После выполнения кода получаю:

Npgsql.NpgsqlException: «Исключение при чтении из потока». EndOfStreamException: попытка чтения после конца потока.

Я могу подключиться к базе данных с помощью DBeaver.


person peropata    schedule 02.10.2019    source источник


Ответы (1)


Удаленный конец переадресации портов разрешается на сервере. Поэтому вам нужно установить IP-адрес/имя хоста таким образом, чтобы он работал, поскольку вы подключаетесь с самого сервера.

База данных, вероятно, прослушивает только интерфейс localhost. Не на общедоступном IP-адресе (если бы он был, вам, возможно, вообще не понадобилась бы переадресация портов).

Кроме того, не рекомендуется жестко кодировать локальный перенаправляемый порт. Вы не можете знать, если этот порт уже не занят другим приложением. Пусть система выберет любой свободный локальный порт.

var port = new ForwardedPortLocal("127.0.0.1", "127.0.0.1", 5432);
client.AddForwardedPort(port);
port.Start();

string connString =
    $"Server={port.BoundHost};Database=dbname;Port={port.BoundPort};" +
     "User Id=dbuser;Password=dbpassword;";

using (var conn = new NpgsqlConnection(connString))
{
    conn.Open();
}

Связано: Переадресация порта MySQL в SSH.NET. Была предпринята попытка доступа к сокету способом, запрещенным его правами доступа

person Martin Prikryl    schedule 03.10.2019