网络设置如下:
机器 A(我的电脑)SSH 22 => 机器 B(具有 root 访问权限的 Linode)SSH 21343 => 机器 C(MySQL 服务器)。
我想将端口 3306 从 C 通过 B 转发到 A,这样我就可以使用 A 上的 SQL Workbench 在 C 上执行命令。
请注意,C 只能通过 SSH 端口 21343 访问,并且只能从 B 访问(我们无法更改 C 上的防火墙以打开更多端口,但我们可以更改其 SSH 设置)。
这可能吗?我读过有关隧道和 ProxyCommand 的文章。但我需要一个简单的分步示例。
所有机器都是 debian Lenny。
答案1
在机器A上:
ssh -L 3307:C:3306 user@B
这分配了一个套接字来监听 A 上的端口 3307。并且,每当与该端口建立连接时,它都会通过 ssh 隧道转发到 C:3306。
然后,您可以使用以下命令在 C 上连接到 MySQL 服务器:
mysql -u <user> -p -h 127.0.0.1 -P 3307
(127.0.0.1 通过 TCP/IP 而不是套接字连接)
不,我无法从 B 连接到 C 上的 MySQL。只有在 21343 上监听的 SSH 对 B 开放。
如果 C 上的防火墙只允许从本地主机连接,则如下所示:
iptables -A INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
因此,据我所知,没有办法做到这一点。如果您尝试通过 ssh 隧道连接,您将收到以下错误:
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
答案2
机器 A 上的 ~/.ssh/config 如下所示:
Host C
ProxyCommand ssh -q B nc %h %p
LocalForward 3306 localhost:3306
Port 21343
Host B
Hostname X.X.X.X (ip of host B)
然后在 Assh C
然后在 A 上的另一个终端运行,mysql -h localhost
这将通过 ssh 端口转发将您连接到 C 上的 mysql。
答案3
你可能会考虑http://sourceforge.net/projects/portfwd/在机器 B 上,可能正在监听 TCP 22 以外的其他端口,以便 SSH 可以保留在机器 B 的标准端口上。