Невозможно подключиться к PostgreSQL серверу через S SH: не удалось установить соединение, потому что целевой компьютер активно отказался от него - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь автоматически создать соединение S SH для программы, которая использует туннель S SH для обновления локальной базы данных с удаленного сервера PostgreSQL. До этого я вручную открывал туннель с помощью PuTTY (включая инструкции по переадресации локальных портов с помощью команды -L). Я хочу использовать s sh. net для автоматического открытия порта при запуске программы. Как только соединение установлено, программа использует Entity Framework Core для доступа к удаленной базе данных.

Когда я открываю соединение S SH с PuTTY, программа работает нормально. Это команда PuTTY:

//plink.exe -i "C:\Users\user.name\Desktop\host_private_key.ppk" -L 6544:111.22.33.66:6543 -N user@address.io -pw *PASSWORD*"

(данные для входа удалены для конфиденциальности)

Это код s sh. net, который я пытаюсь открыть для того же соединения:

public void MakeSSHTunnel()
        {
            string password = "password";
            // path of RSA private key in openSSH format:
            string privateKeyPath = "C:/Users/user.name/.ssh/id_rsa";

            try
            {
                // creates variable to transmit RSA private key + passphrase to server via SSH.NET, openSSH compatible.
                var privateKeyFile = new PrivateKeyFile(privateKeyPath, password);
                string serverAddress = "address.io";
                string user = "user";

                // allows for the remote port forwarding options required by the server 
                using (var client = new SshClient(serverAddress, user, privateKeyFile))
                {
                    client.Connect();
                    var tunnel = new ForwardedPortLocal(6544, "111.22.33.66", 6543);
                    client.AddForwardedPort(tunnel);

                    // testing weather the connection has been successful:
                    if (client.IsConnected)
                    {
                        Console.WriteLine("OPENTUNNEL.CS: Connection to {0} successful.", serverAddress);
                        state = "Open";
                    }
                    else
                    {
                        Console.WriteLine("Connection to {0} failed.");
                        state = "Closed";
                    }

                    tunnel.Exception += delegate (object sender, ExceptionEventArgs e)
                    {
                        Console.WriteLine(e.Exception.ToString());
                    };
                    tunnel.Start();
                    Program.RunBackup();


                    // ... closes the port ... //
                    tunnel.Stop();
                    client.Disconnect();
                }
            }
            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine(e);
            }
        }

Я в замешательстве, поскольку в приведенном выше примере if (client.IsConnected) возвращает значение true.

Кажется, что возникает ошибка, когда базовый метод OnConfiguring () платформы Entity Framework передает подробные данные о соединении. с его optionsBuilder:

optionsBuilder.UseNpgsql($"Host=127.0.0.1;Port=6544;Database=user;Username=user;Password=databasePassworh;CommandTimeout=300;Timeout=300;SSL Mode=Require;Trust Server Certificate=true;Convert Infinity DateTime=true");

Возникающие ошибки:

NpgsqlException: Exception while connecting

и:

ExtendedSocketException: No connection could be made because the target machine actively refused it. 127.0.0.1:6544

Я дважды проверил все пароли и прочитал всю документацию и примеры кода S SH. NET и оставил все ранее работающий (через PuTTY) код без изменений.

Если кто-нибудь увидит, что я делаю не так, буду благодарен. C#, S SH. NET и переадресация портов являются новыми для меня, пожалуйста, скажите мне, где я идиот.

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Этот код сейчас работает. Я считаю, что проблема заключалась в том, что в строке:

var tunnel = new ForwardedPortLocal(6544, "111.22.33.66", 6543);

«связанный порт» не включал адрес. Я видел примеры, где это не было определено, и следовал за этим. Проходя по коду, я заметил, что поле пустое, и решил попробовать 127.0.0.1. Теперь это успешно подключается к базе данных. Он работает с:

var tunnel = new ForwardedPortLocal("127.0.0.1", 6544, "111.22.33.66", 6543); 

Спасибо за внимание и за ваш вклад.

0 голосов
/ 22 января 2020

Вы можете использовать это, чтобы увидеть, что происходит на сервере при установлении соединения s sh:

tail  -f  /var/log/auth.log

Вполне вероятно, что пара ключей, к которой принадлежит этот файл id_rsa, не является доверенной ваш сервер, и в этом случае вы увидите такую ​​строку в файле auth.log вашего сервера при запуске вашей программы:

"Failed publickey for user from <yourIP> port <yourPort> ssh2: RSA SHA256 

Вы можете сгенерировать действительный ключ из файла host_private_key.ppk, потому что вы знаю, что ему доверяет сервер, к которому вы подключаетесь.

Используйте PuttyGen для загрузки файла host_private_key.ppk. В разделе «Конверсии» вы можете «Экспортировать OpenS SH» и экспортировать свой закрытый ключ. (Не экспортируйте и не перезаписывайте то, что находится в C: / Users / user.name / .s sh, если ключи там используются для других целей).

Затем адаптируйте вашу программу для использования новый ключ, если вы создали ключ по другому пути.

...