我似乎无法理解 ssh 隧道的概念。我目前所处的情况是:
- 服务器A,可以通过ssh访问,里面有一个mysql db,可以通过
localhost:3306
. - 服务器乙,可以通过 ssh 访问A。
- MySQL实例C可以访问乙。我只能访问数据库服务器,而不能访问服务器本身,所以我无法从任何地方进行 sshC。我只能连接到任何端口乙。
我的目标是 MySQL 复制A到C,其中 A 是主设备,并且C- 奴隶。如果我想从以下位置连接,应该如何进行C到A。我想象它是这样的图:
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
但我似乎仍然无法访问A从C,当连接到B_端口。
编辑:也ssh -L B_PORT:localhost:3306 A_user@A_ip -f -N -g
按照@larsks的建议进行了尝试,但没有效果。他的解释让我相信网络中可能存在问题
到目前为止我的旅程
- 创建隧道于乙和
ssh -L B_PORT:localhost:3306 A_user@A_ip -f -N -g
- 连接C到乙。
- 网络统计开启乙显示多个 SYN_RECV 连接C到乙
- 如果我尝试连接到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
- ssh 连接断开乙隧道需要重新开放
- 摆弄安全组和其他网络规则。启用网络入站和出站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 和::1
ipv6)。
有了-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
为什么sudo
?sudo
并不是所有问题的答案,而且往往是原因。
我想这就是你想要的。
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的角度来看的
- 跳跃是从当地人的角度来看的