更新

更新

我有三台服务器A, 和C,加上我的本地主机。每台服务器都在适当的网络内,并且服务器C应该连接到服务器 A 上的 mysql DB 端口 3306 来执行一些测试。

场景如下:

  • 在服务器中C我运行PHP脚本来mysql connection打开(这不是mysql 服务器
  • 我可以从本地主机 ssh 到服务器
  • 我可以从本地主机 ssh 到服务器A

服务器A有一个 mysql 服务器(显然),但是服务器没有 mysql 服务器。

我尝试过以下方法:

  • 地图远程乙:3306本地主机:3337, 使用:

    ssh -R 3306:localhost:3337 b-user@B-server
    
  • 地图本地主机:3337答:3306, 使用:

    ssh -L 3337:localhost:3306 a-user@A-server`
    
  • 测试php脚本打开到B的连接:

    $host= '<B-server>';
    $pwd = '<mysql-pwd>';
    $user= '<mysql-user>';
    $db  = "my_test_db";
    try {
        $pdo = new PDO("mysql:host={$host};dbname={$db};port=3306", $user, $pwd);
    } catch (PDOException $e) {
       print "Error!: " . $e->getMessage() . "<br/>";
       die();
    }
    

当我运行上述 php 脚本时,出现错误:

Error!: SQLSTATE[HY000] [2002] Connection refused

端口使用有问题吗?

更新

在服务器中我已经安装mysql-client,然后测试与服务器的连接A进展顺利:

mysql -u <sql-user> -p<sql-pass> --host 127.0.0.1 -P 3306

确实沟通A通过本地主机工作中。

答案1

-L(本地)在本地主机上监听,在那里运行 ssh。(这是您所需要的)

-R(远程)在远程主机上监听,在您通过 ssh 连接的主机上。它用于反向连接。

1.1。您需要从 C 连接 ssh 到 B,并将本地端口(3306 或任何非标准端口)映射到 B:3306

ssh -L 3306:A:3306 b-user@B-server

1.2然后连接Mysql客户端到localhost:3306

在这种情况下,Mysql 连接 B -> C 未经 ssh 加密。

2.1. 使用 B 作为堡垒主机,将 ssh 从 C 连接到 A。并将本地端口映射到 A 上的本地端口。

ssh -o ProxyCommand='ssh b-user@B-server nc A-server 22' -L 3306:localhost:3306 ssh a-user@A-server

或者如果 OpenSSH 足够新

ssh -o ProxyCommand='ssh b-user@B-server -W A-server:22' -L 3306:localhost:3306 ssh a-user@A-server

2.2然后连接Mysql客户端到localhost:3306

3.1如果你不需要 mysql 加密,并且需要最大性能

ssh b-user@B-host ncat --sh-exec "ncat A-server 3306" -l 3306 --keep-open

3.2然后连接Mysql客户端到B服务器:3306

4.1按顺序使用两个 ssh 隧道(据我所知,Sim Sca 尝试这样做)

ssh -L 3306:localhost:3337 b-user@B-server ssh -N -L 3337:localhost:3306 a-user@A-server
  • 从 C 连接到 B,并将本地(C)3306 映射到 B:3337
  • 从 B 连接到 A 并将本地(B)3337 映射到 A:3306

4.2然后连接Mysql客户端到localhost:3306

我不喜欢这种方式,因为需要在B上选择端口(3337)。

UPD 针对更新的问题:

默认情况下,ssh 仅在本地监听。

当您将远程 B:3306 映射到 localhost:3337 时,使用:

SSH-R0.0.0.0:3306:localhost:3337 b-用户@B-服务器

监听所有 IP

如果mysql连接不需要ssh加密的话可以提高性能。

相关内容