【问题标题】:SSH Tunnelling to MySQL in c++在 C++ 中 SSH 隧道到 MySQL
【发布时间】:2017-05-01 10:46:09
【问题描述】:

我正在开发一个测试应用程序,以了解如何使用 SSH 隧道连接到 C++ 中的 MySQL 数据库。

我正在使用 libssh2 库,并且正在使用来自 https://www.libssh2.org/examples/direct_tcpip.html 的示例,但我不能 100% 确定这是否是正确的使用方法。

我几乎复制了这个示例,但是在我的套接字上连接到 MySQL 时,MySQL 抛出:

Errro 2013 (HY000):在“读取通信数据包”时丢失与 mysql 服务器的连接,系统错误:0

当我使用 mysql -uroot -p -P2222 连接到 mysql 时,我的应用程序使用以下命令读取通道上的数据:

int len = libssh2_channel_read(channel, buf, sizeof(len));

并且buf包含SSH-2.0-,然后将其写入转发套接字,如下所示:

wr = 0;
while (wr < len)
{
    i = send(forward_socket, buf + wr, len - wr, 0);
    if (i <= 0)
    {
        perror("write");
        return EXIT_FAILURE;
    }
    wr += i;
}

发送完成后,我立即收到 mysql 错误。我认为这是因为我将 SSH-2.0- 发送到 MySQL 没有预料到的 MySQL,所以它关闭了连接,但我看不出有什么问题,而且我无法确定 libssh2 direct_tcpip 是否正确使用的东西。

【问题讨论】:

  • 这里有一个类似的帖子stackoverflow.com/questions/21091850/…
  • 这并不真正相关,是的,它是相同的错误,但这与 MySQL 配置/网络有关,而不是 C++ 以编程方式创建 SSH 隧道,这是我想要做的
  • 等等,你从一开始就想做什么。 SSH隧道是一个套接字,例如,您将客户端端口8282隧道连接到服务器3306,一旦设置好,您的MySQL客户端就可以在您的客户端机器上使用localhost:8282,例如MySQL Workbench连接到localhost:8282,它将连接到你的服务器在端口3306
  • 理解概念证明没什么问题,但是如果我听说有人在现实世界中这样做,我强烈建议不要这样做我很难理解你为什么要在其中进行 ssh 隧道干净轻松的应用程序可以是应用程序之外的一个层。此外,MySQL 已经在数据流上提供了 ssl 加密功能,使 ssh 隧道更多地成为运行时细节。
  • 它是 Android 应用程序 API 的一部分

标签: c++ mysql sockets ssh


【解决方案1】:

我想你误解了什么是 SSH 隧道。

SSH 隧道只不过是客户端套接字到服务器套接字的映射,例如防火墙网络端口。

并表明这是它的工作原理。我使用了我的个人网络服务器并连接到一个不允许任何外部连接的 MySQL 服务器,因此只能从 localhost 连接。

要使用 LibSSH2 设置 SSH 隧道,请遵循 http://api.libssh.org/master/libssh_tutor_forwarding.html 标题下的代码使用 libssh 进行直接端口转发

如果您不想将映射公开到客户端计算机上的端口,则不一定必须手动将数据发送到通道并读取它,但是如果有任何形式的加密或文本编码与您在通道上的 mysql 不匹配,您将向其发送无效数据。

因此,一旦您创建了 SSH 隧道,然后您将其用作标准网络连接到您已隧道的端口,如果您希望在 C++ 中执行此操作,请使用 MySQL C++ Connector 并在创建隧道后连接使用 C++ 连接器。

如果您希望允许您的应用程序通过 SSH 通道与 MySQL 通信而不将其暴露于网络端口,您可能不得不弄乱 C++ MySQL 连接器的源代码。很多工作,你认为你会通过整个连接器以及任何通过网络套接字进行的写入和读取,并将其替换为通过 SSH 隧道通道的代码。

【讨论】:

  • 谢谢,我没有误解 SSH 隧道,我以前在 C# 中做过,而且我经常使用它,但是将 C# 应用程序转换为 C++,因此我需要 SSH 隧道。 libssh2 的文档似乎很差,所以我现在找到了另一个我正在使用的库
【解决方案2】:

最后,通过大量的反复试验和拉扯头发,设法弄清楚该怎么做。

使用来自https://www.libssh2.org/examples/direct_tcpip.html 的示例,但我将变量设置为错误的值。

基本上,在示例中它有

const char *remote_desthost = "localhost"; /* resolved by the server */ 
unsigned int remote_destport = 22;

由于示例中的 remote_destport 为 22,我认为这是 SSH 连接详细信息,因此我将其设置为我的 SSH 设置。

原来这是连接从 SSH 会话转发到的地方,所以我将其更改为

const char *remote_desthost = "localhost"; /* resolved by the server */ 
unsigned int remote_destport = 3306;

所以现在我可以从我的笔记本电脑上运行我的应用程序,它连接到我的 SSH 服务器作为我的 Web 服务器,然后在我的笔记本电脑上运行命令

mysql -uroot -p -P2222 我通过 SSH 隧道连接到我的网络服务器上的数据库。

【讨论】:

    猜你喜欢
    • 2014-12-13
    • 2018-02-22
    • 1970-01-01
    • 2014-03-20
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    相关资源
    最近更新 更多