需求比较简单,一句话就可以描述: A 通过 B 连接 C 的 3306 端口
但是具体是实现就比较麻烦了,实际上是被搞得特别乱,本地端口转发和远程端口转发网上说的都不太明朗,求助大家 如何在 A 上执行一条命令实现呢?
1
lairdnote 2018-01-22 10:39:04 +08:00 1
ssh -L localhost:3306:C:3306 xxx@B ip
|
2
EricInBj 2018-01-22 10:43:40 +08:00 1
如果你有 B 的 SSH 权限,可以在 A 上执行:
``` ssh -NfCL 0.0.0.0:3306:C_IP:3306 root@B_IP ``` 这样你就可以在 A 上,连接 A 机的 3306 端口,达到访问 C 上的 3306 端口的目的。 同样,不管是 D 机 E 机还是啥机,只要是能访问到 A 机的,也都可以通过 A 机的 3306 访问到 C。 如果不希望别的机通过 A 访问 C,那就把上面命令中的 0.0.0.0 换成 127.0.0.1 吧。 |
3
mawenjian 2018-01-22 10:44:47 +08:00
在 B 机上装个 socat 做转发
|
5
frostnotfall OP @lairdnote #1 解决了,问题出在了 localhost 上,端口绑定到了 127.0.0.1 上,导致其他机器连接不了
|
6
warcraft1236 2018-01-22 10:51:54 +08:00 1
给你贴出来我目前用的
alias testsql="ssh -J vps -NL 13500:xx.xx.xx.xx:3306 -i ~/Downloads/text.pem xx.xx.xx.xx" 第一个 xx.xx.xx.xx 是 MySql 所在的机器 IP,第二个 xx.xx.xx.xx 是跳板机 IP |
7
warcraft1236 2018-01-22 10:53:16 +08:00
|
8
frostnotfall OP @warcraft1236 #6 不错的思路
|
9
falcon05 2018-01-22 10:55:36 +08:00 via iPhone
这一点也不特别……
|
10
xderam 2018-01-22 11:01:32 +08:00
或者 proxycommand 似乎也能解决,但比直接-L 貌似更难理解。
|
11
frostnotfall OP @falcon05 #9 看了二楼才发现真的不特别,哈哈(捂脸淘)
|
12
ywgx 2018-01-22 11:08:53 +08:00
B 机器部署一个 Nginx, 经过 stream 四层转发 C 的 3306 端口即可, 这样从 A 远程连 B 的 3306 端口达到目的
stream{ upstream mysql { server xx.xx.xx.xx:3306; } server { listen 3306;; proxy_pass mysql; } |
13
wizardoz 2018-01-22 12:11:09 +08:00
ssh -L 10022:C:22 user@B
|
14
wekw 2018-01-22 13:53:05 +08:00
Nginx +1
|
15
JoyHao 2018-01-22 14:04:01 +08:00
Nginx +2
|
16
loadinger 2018-01-22 14:06:10 +08:00
所以你们都把 22 伪装成 mysql 来“骗人”吗。。
|
17
pigzilla 2018-01-22 14:12:01 +08:00
这个需求要说明 BC 两者哪个方向是可以直连的。
如果仅 B 可以直连 C,那在 B 上 SSH 连接到 C 时做 Local Forwarding。或者在 B 上用任意端口转发 /隧道方案如 netcat,socat,iptables,spiped 等都可以。 如果仅 C 可以直连 B,那在 C 上 SSH 连接到 B 时做 Remote Forwarding 即可。或者在 C 上发起隧道连接。 |