我们定制并支持我们的客户在来自不同networking托pipe服务器的托pipe服务器上托pipe的标准Web应用 通常,应用程序由PHP中的Web应用程序和数据库(主要是MySQL)组成。
对于我们的客户,我们希望提供一个超出networking托pipe商提供的备份服务(通常为四周的保留时间)。 我们要备份的Web应用程序(没有问题)和数据库(问题)。
其中一个Web主机有一个设置,可以防止用户使用mysql.sock
访问MySQL数据库。 相反,他们有一个单独的名称(如user123.mydatabaseserver.com)的托pipe服务器本身。 只有通过使用-h
参数才能连接到数据库,如下所示:
mysql -u mydbuser -p -h user123.mydatabaseserver.com
现在,通常我们通过使用连接到实时托pipe服务器的SSH隧道和端口将MySQL端口转发到备份服务器,然后通过隧道连接到备份服务器上的数据库并运行mysqldump
转发的端口。 但是,由于强制主机名参数,在这种情况下这是不可能的。
我们知道,我们可以连接到托pipe服务器,在那里转储数据库,然后使用scp
或其他方法复制生成的备份文件,但是我想查看是否不会丢失一些使我们不能使用用于该备份的实时受pipe服务器的存储和/或计算时间。
有只使用端口转发的解决scheme吗?
编辑1:试图使问题更清楚
服务器A(备份系统)服务器B(应用程序服务器)服务器C(数据库服务器)
服务器A应该备份服务器C上的数据库。但是,MySQL访问权限只允许服务器B连接到服务器C并访问数据库。
在这种特定情况下,服务器B和服务器C具有相同的IP地址,但似乎主机通过套接字禁止访问MySQL,并且只允许TCP / IP连接。
与此同时,我有了一个链接SSH端口的想法:
将服务器B上的端口22222绑定到服务器C上的端口3306,然后将服务器A上的44014绑定到服务器B上的22222.但是,尝试从服务器B向服务器C进行SSH连接会导致错误消息: host address xxx.xx.xxx.xx not allowed.
您不需要SSH隧道从B到C,因为B上的Web应用程序使用常规套接字连接到C,对吧?
在服务器A上,你应该像这样调用SSH:
ssh -L44014:serverc:3306 user@serverb
这将在A和B之间build立SSH隧道。当在服务器A上运行的备份进程连接到localhost:44014时,隧道将导致服务器B上的sshd进程连接到服务器C上的端口3306.从服务器C的查看,连接将显示来自某个随机客户端端口上的服务器b。
如果你想在脚本中使用它,你也可以通过-N
选项来避免产生一个shell,只需要转发端口。 因此,您可以在后台运行该命令,并在不再需要隧道时将其杀死:
ssh -NL44014:serverc:3306 user@serverb & TUNNEL_PID=$! # do the backup on localhost:44014 kill $TUNNEL_PID
如果服务器B的pipe理员已禁用本地端口转发,则可以使用socat
来模拟该行为,但这有点复杂。 在这里,我们在本地产生一个socat,使得数据通过ssh的stdio,而远程的socat把它redirect到合适的socket。 为了它的工作,你必须有SSH密码login工作已经:
socat TCP-LISTEN:44014 EXEC:"ssh user@serverb socat STDIO TCP:serverc:3306"