我有三台服务器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加密的话可以提高性能。