【问题标题】:C# programatically remotely connect to Linux server to connect to Amazon RDS DBC# 以编程方式远程连接到 Linux 服务器以连接到 Amazon RDS DB
【发布时间】:2017-06-14 16:40:52
【问题描述】:

我有一个 C# 可执行文件,需要远程连接到 Linux 服务器才能连接到 Amazon RDS 数据库。

可执行文件位于 Windows 服务器上。由于权限,只有 Linux 服务器能够连接到 RDS 数据库。由于 C# 可执行文件需要来自数据库的信息,我发现自己需要先连接到 Linux 服务器,然后再从那里连接到数据库。

// include files
using MySql.Data;
using MySql.Data.MySqlClient;
using Renci.SshNet;    
//...
     using (var client = new SshClient("server.amazonaws.com", "serverUser", privateKeyFile))
     {
            client.Connect();

            MySqlConnection databaseConnection = null;
            string connString = "Server=dbServer.rds.amazonaws.com; database=database " +             
                                "UID=databaseUser password=databasePassword";
            databaseConnection = new MySqlConnection(connString);
            databaseConnection.Open();

            string queryString = "SELECT * FROM tbl_table;"; // errors here


           // ..... }

在分配显示“MySql.Data.MySqlClient.MySqlException: 'Unable to connect any of the specified MySQL hosts.'”的查询字符串时出现错误。

我正在使用SSH.Net 来建立与 Linux 服务器的连接。我正在使用MySQL Connector 连接并从数据库中检索信息。

如果我的代码有问题,我将不胜感激,但我很确定我错过了正确连接到数据库的一些必要步骤。我注意到其他类似问题的问题,但他们要么没有使用 RDS 数据库,要么不必通过 C# SSH。

编辑:自发布此消息以来,我正在执行此代码的服务器已获得对 RDS 数据库的访问权限。我目前没有时间尝试发布的解决方案。我可以说的是,在获得访问权限后,只有使用 MySql 连接器才能顺利进行。

【问题讨论】:

  • 你到底想做什么。打开与机器的 ssh 会话然后尝试从 Windows 机器打开 sql 连接没有做任何事情。您可以使用 ssh 会话来执行 sql 命令行操作。或者你需要在 linux 机器上有一个服务,你可以与之交谈来转发请求。
  • 对不起,我知道这是一团糟。 C# 可执行文件需要来自数据库的信息,因为它使用 SqlDataReader 对象来获取某些方法的行信息。我不反对在 Linux 机器上提供服务,但是我不认为自己能够使用这些对象。我继承了这个项目并且时间有限,所以我不想尝试将所有分配从使用该对象而不是使用其他对象更改。使用 SSH 会话执行 SQL 命令行操作仍然允许我这样做吗?我不太清楚你的意思。
  • 这是糟糕的设计。您应该在 Linux 机器上创建一个公开 API 的 Web 应用程序,然后在 Windows 机器上使用该 API 来访问数据库。您正在为各种安全问题敞开心扉。
  • 我同意,我实际上提出了类似的建议,但这并不完全取决于我。为了这个问题,我非常感谢在这些限制范围内的帮助。
  • 你想做的事做不到。您的代码的问题是 AWS 服务只允许从 Linux 机器连接到数据库。您正在尝试从 Windows 计算机启动连接。这样做的唯一方法是在 Linux 机器和 Windows 机器之间创建某种 API,否则您需要登录到您的 AWS 账户并授予对 Windows 机器的数据库访问权限。

标签: c# amazon-web-services amazon-aurora


【解决方案1】:

跳过 SSH。在您的 Linux 机器上,将 IPtables 配置为端口转发到 AWS。选择任意端口号,比如 12345。

任何到端口 12345 的传入 TCP 连接都会将流量转发到 AWS 上的给定主机名和端口。

随后,您的 MySQL 连接字符串将连接到您的 linux 机器上的端口 12345,但转发会将流量发送到 AWS。

以下是一些示例文章:

由于手动配置 IPtables 可能会很麻烦,因此请考虑先安装 Webmin 作为易于使用的 Web 界面来配置 iptables。

【讨论】:

  • 这个解决方案的安全性很弱。任何拥有 MySQL 客户端的人都可以使用用户名/密码猜测来暴力攻击服务器。使用 SSH 安全得多。
  • @MattHouser Moot 点,考虑到 RDS 端点是公共的。
  • RDS 端点可以根据需要公开。它们也可以是 100% 私有的,并且只能从您的 VPC 内部访问。
【解决方案2】:

你快到了。我不熟悉 SSH.NET,但是当使用 Putty(一个 SSH 终端)时,您可以配置 SSH“端口隧道”或“端口转发”,这将在您的本地计算机上设置一个监听端口。任何到本地端口的连接都会通过 SSH 连接转发到远程计算机,然后转发到最终目的地。

https://github.com/sshnet/SSH.NET 确实提到它支持“端口转发”。看看如何使用它。

  1. 使用 SSH.NET 连接到您的 Linux 机器
  2. 配置从 localhost:12345 到 dbServer.rds.amazonaws.com:3306 的端口转发
  3. 在连接字符串中使用localhost:12345 作为目标服务器,而不是dbServer.rds.amazonaws.com:3306 用于MySqlConnection

【讨论】:

    【解决方案3】:

    通过 SSH 连接不是 enoguh。你想做的事是做不到的。您的代码的问题是 AWS 服务只允许从 Linux 机器连接到数据库。您正在尝试从 Windows 计算机启动连接。这样做的唯一方法是在 Linux 机器和 Windows 机器之间创建某种 API,否则您需要登录到您的 AWS 账户并授予对 Windows 机器的数据库访问权限

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 2017-01-08
      • 1970-01-01
      相关资源
      最近更新 更多