到目前为止我的旅程

到目前为止我的旅程

我似乎无法理解 ssh 隧道的概念。我目前所处的情况是:

  • 服务器A,可以通过ssh访问,里面有一个mysql db,可以通过localhost:3306.
  • 服务器,可以通过 ssh 访问A
  • MySQL实例C可以访问。我只能访问数据库服务器,而不能访问服务器本身,所以我无法从任何地方进行 sshC。我只能连接到任何端口

我的目标是 MySQL 复制AC,其中 A 是主设备,并且C- 奴隶。如果我想从以下位置连接,应该如何进行CA。我想象它是这样的图:

C ─────────B:B_PORT────────> B
                            │││
         |/─────tnl A:22────┘││
A_db <────localhost:3306─────┘│
         |\─────tnl A:22──────┘

到目前为止我尝试运行这个 sudo ssh -L B_PORT:localhost:3306 A_user@A_ip -f -N但我似乎仍然无法访问AC,当连接到B_端口

编辑:也ssh -L B_PORT:localhost:3306 A_user@A_ip -f -N -g按照@larsks的建议进行了尝试,但没有效果。他的解释让我相信网络中可能存在问题

到目前为止我的旅程

  1. 创建隧道于ssh -L B_PORT:localhost:3306 A_user@A_ip -f -N -g
  2. 连接C
  3. 网络统计开启显示多个 SYN_RECV 连接C
  4. 如果我尝试连接到B_端口我明白了
packet_write_wait: Connection to A port 22: Broken pipe
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
  1. ssh 连接断开隧道需要重新开放
  2. 摆弄安全组和其他网络规则。启用网络入站和出站C一切正常!

答案1

您需要将-g选项添加到 ssh 命令行:

     -g      Allows remote hosts to connect to local forwarded ports.
             If used on a multiplexed connection, then this option
             must be specified on the master process.

这将公开主机上的转发端口,B以便可以从C.这假设您的防火墙配置允许B 这些连接。

该选项更改用于本地端口的-g本地绑定地址。ssh如果没有-g-L 8000:localhost:8000结果是:

$ netstat -tln | grep 8000
tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:8000                :::*                    LISTEN     

正如您所看到的,在这种情况下,两个套接字都绑定到环回地址(127.0.0.1对于 ipv4 和::1ipv6)。

有了-g,我们得到:

$ netstat -tln | grep 8000
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN     
tcp6       0      0 :::8000                 :::*                    LISTEN     

在这种情况下,您可以看到ssh现在绑定到通配符地址而不是环回地址。

答案2

为什么sudosudo并不是所有问题的答案,而且往往是原因。

我想这就是你想要的。

ssh -L local_port:remote_ip:remote_port jump_user@jump_ip
ssh -L C_PORT:A_ip:3306 B_user@B_ip -f -N
  • 远程是从jump的角度来看的
  • 跳跃是从当地人的角度来看的

相关内容