创建从跳转主机到数据库的 SSH 隧道并访问跳转主机端口上的数据库

Create a SSH tunnel from a Jump host to a Database and access the database on Jump Host Port

我正在尝试在数据库 运行ning 服务器端口和另一台服务器之间创建 SSH 隧道,如下所示。

MySQL:3306 <=====> Server-A:3306

并且我想使用 Server-A:3306 作为数据库 URI 来连接到数据库。

我正在 运行在 ServerA

上执行以下操作

ssh -f -N -i ~/keys/test.pem foo@foo.storesandbox.com -L5001:127.0.0.1:2001

我可以看到隧道已启动并且 运行ning。但是当我使用Server-A的public IP尝试连接数据库时,它不起作用。

如果我在 Server-A 和 运行 MySQL 客户端之间创建另一个隧道。然后就可以了。但是我不想那样做。

这个问题可能是什么原因造成的。我对脚本编写还很陌生

默认情况下,当您使用这样的命令时,本地端(ssh 客户端)会在地址为 127.0.0.1 的环回接口上创建侦听端口

ssh me@server -L3306:localhost:3306

如果您检查主机上的 netstat,您会看到类似这样的内容

sudo netstat -ntlp | grep 3306
tcp  0 0 127.0.0.1:3306  0.0.0.0:*   LISTEN 12354/ssh

因此,您本地节点上的应用程序可以连接到此类映射服务,因为环回接口对主机本身可见,但外部节点无法访问此虚拟接口,因此无法与任何服务(端口)建立任何连接在这个单一界面上收听。

要指示本地 ssh 客户端向全世界共享此类映射端口,您需要指示它绑定到所有接口(包括环回)或仅绑定到特定接口

# here you explicitly tell ssh client to accept connection to your tunnel
# from any client(i.e. bind listenning port to all interfaces)
ssh me@server -L0.0.0.0:3306:localhost:3306 
sudo netstat -ntlp | grep 3306 
tcp  0 0 0.0.0.0:3306   0.0.0.0:*   LISTEN 12354/ssh

#here you do the same thing by using -g option
ssh me@server -g -L3306:localhost:3306
sudo netstat -ntlp | grep 3306 
tcp  0 0 0.0.0.0:3306   0.0.0.0:*   LISTEN 12354/ssh

#and here is an example of how to bind to specific interfaces only
# 10.0.0.12 is an IP of one of interfaces on your node
# 10.1.0.156 is also IP address of one interfaces of your node
ssh me@server -L10.0.0.12:3306:localhost:3306 -L10.1.0.156:3306:localhost:3306

sudo netstat -ntlp | grep 3306
tcp  0 0 10.0.0.12:3306   0.0.0.0:*   LISTEN 12354/ssh
tcp  0 0 10.1.0.156:3306  0.0.0.0:*   LISTEN 12354/ssh