我目前正在使用MediaTemple提供的Premium Wordpress主机。我有一个非常大的数据集要导入,我希望通过SSH隧道直接访问数据库。
--------------- ------------------- ------------
| My Machine | ---- SSH TUNNEL -----| Hosting Server | -- -- ? -- -- | Database |
--------------- ------------------- ------------
如果我进入Hosting Server
和 Hosting Provider
上的 shell,连接到这样的mysql,我就能进入MySQL。
mysql -uuser -ppassword -h123.456.789.1 -P3308
但是,如果我尝试使用-L标志用SSH连接到MySQL以创建隧道,我将无法连接到服务器。
ssh me@hostingserver.net -L 7002:123.456.789.1:3308
来自 My Machine
上的shell:
mysql -uuser -ppassword -h127.0.0.1 -P7002
我收到以下错误:
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
通过阅读其他答案(StackOverflow ,StackOverflow),我推断该问题源于MySQL客户端尝试绑定的IP地址。我认为连接请求的IP地址附加在我的机器上执行时,不在Database Server
的白名单上。
无论如何都可以从My Machine
直接访问MySQL数据库。从系统管理的角度来看,我有足够的访问权限从shell连接到MySQL数据库但我无法在My Machine
上运行客户端。我有一个非常大的数据集,我想从My Machine
转移到Database
。我还希望能够在需要时访问数据库并exicute SQL。这个和大数据集类型消除了在source
上使用来自MySQL客户端的Hosting Server
命令的可能性。什么是最好的解决方法,让我能够在Database
My Machine
上运行SQL?
答案 0 :(得分:1)
我遇到了大致相同的问题。也就是说,即使我已成功通过隧道连接到远程主机,我也无法连接到MySQL服务器。
TLDR:这是涉及环回接口的iptables
问题
在我的情况下,mysqld
与sshd
在同一个VPS上运行。但是,MySQL实例仅绑定到127.0.0.1
并侦听默认端口。正如您所做的那样,我确认可以使用本地使用的凭据连接到远程计算机上的mysqld
实例。
这是隧道:
ssh -v -N -L 33306:127.0.0.1:3306 sshuser@sshanddbvps.org
以下是使用mysqld
客户端的mysql
实例的连接字符串:
mysql -umysqluser -h127.0.0.1 -P 33306 -p
即使ssh
表示连接成功......
debug1: Connection to port 33306 forwarding to 127.0.0.1 port 3306 requested.
...使用您提到的消息接受正确的密码后,mysql
客户端连接会出错:
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet'...
要检查数据是否在loopback接口上流动,我登录到远程服务器并在三个单独的shell中运行了三个命令:
while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l 127.0.0.1 1234; done
tcpdump -i lo src 127.0.0.1 -or dst 127.0.0.1
nc 127.0.0.1 1234
运行第三个命令后,第二个命令的输出出现了:
13:59:14.474552 IP localhost.36146 > localhost.1234: Flags [S], seq 1149798272, win 43690, options [mss 65495,sackOK,TS val 48523264 ecr 0,nop,wscale 7], length 0
但没有任何迹象表明数据包正在反向流动。
在允许来自默认环回地址的流量的防火墙的INPUT
链中插入规则解决了这个问题:
iptables -I INPUT 4 -i lo -s 127.0.0.1 -j ACCEPT