运行我的脚本的本地计算机需要访问远程服务器的数据库。上周我可以在本地机器上执行以下操作
ssh -f -N -T -L1081:localhost:3306 ueser@remoteserver -p2222
:
# netstat -an | egrep "tcp.*:1081.*"
tcp 0 0 127.0.0.1:1081 0.0.0.0:* LISTEN
tcp6 0 0 ::1:1081 :::* LISTEN
然后告诉我的脚本使用端口 1081 进行 mysql 连接就成功了。这个 netstat 命令显示我在本地接受连接正常,但在远程计算机上进行相同的检查,实际 mysql 服务器根本没有侦听 1081,以前情况并非如此
我检查了 sshd_config ,它似乎允许隧道,即没有配置更改。我还尝试打开到网络上另一台服务器的隧道,但这也不起作用,我的命令是垃圾还是什么?尝试了各种组合 -f -T
答案1
我画了一些草图
键入 ssh 隧道命令的机器称为»你的主人«。
介绍
当地的:
-L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.
ssh -L sourcePort:forwardToHost:onPort connectToHost
表示:使用 ssh 连接到connectToHost
,并将所有连接尝试转发到当地的sourcePort
onPort
到名为 的计算机上的端口forwardToHost
,可以从该connectToHost
计算机访问该端口。偏僻的:
-R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.
ssh -R sourcePort:forwardToHost:onPort connectToHost
表示:使用 ssh 连接到connectToHost
,并将所有连接尝试转发到偏僻的sourcePort
onPort
到名为 的计算机上的端口forwardToHost
,可以从本地计算机访问该计算机。
其他选项
-f
告诉 ssh 在进行身份验证后自行后台运行,因此您不必在远程服务器上运行某些东西来使隧道保持活动状态。-N
表示您想要 SSH 连接,但实际上不想运行任何远程命令。如果您创建的只是一条隧道,那么包含此选项可以节省资源。-T
禁用伪 tty 分配,这是合适的,因为您不尝试创建交互式 shell。
你的例子
第一张图片代表您的情况。如果你这样做
ssh -L 1081:localhost:3306 remotehost
所有到绿色端口的连接尝试都1081
通过 ssh 隧道转发到3306
远程主机的本地主机上的粉色端口,即远程主机本身。
现在您的 php 脚本可以通过localhost:1081
.但是netstat
你的命令remotehost
找不到任何在 1081 监听的东西(至少不是隧道的结果)。因为粉红色的端口不是ssh创建的监听端口,而是转发的目标。并且它不是转发到端口1081
而是转发到3306
。
您的数据库服务器是否真正在端口上侦听3306
或可能在端口上侦听1081
?如果后者为真,那么您的命令应该更改为如下所示:
ssh -L 1081:localhost:1081 remotehost
如果您的数据库侦听端口,1081
您应该使用 netstat (独立于 ssh)找到它。
答案2
您不会期望远程端侦听端口 1081。您要求隧道连接到远程端的端口 3306,这是 mysql 的默认端口。可能值得检查它是否确实正在侦听该端口。或者,如果您确实想在两侧使用端口 1081,请将您的-L
选项替换为-L1081:localhost:1081
.