我试图通过端口3306远程访问MySQL,但没有运气。 我已经获得了对生产机器的root访问权限,所以我可以抓取文件和数据库,在本地处理它们,并将修改后的版本放回原处。
我的访问允许我SSH进入框,它允许FTP通过SSH。 我现在试图通过SSH获得MySQL访问权限。 MySQL正在运行(本地监听)并可以在命令行上访问,并且可以访问它没有问题。
我意识到我可以转储数据库,在本地恢复文件并执行我的修改。 但是,将来我可能需要改变一些东西,而且我不希望在命令行上这样做,因为它通过GUI更快。 或者,如果我可以像我想要的连接。
编辑:对于下面的说明如果您使用的Windows那么有两件事要记住:
1)将localhost更改为127.0.0.1因为Windows没有在%SystemRoot%\system32\drivers\etc\hosts自动设置。
2)您可以使用PuTTY工具套件中鲜为人知的plink.exe命令行工具; 它使用相同的语法的选项作为ssh命令,所以如果你在下面的例子中用plink.exereplacessh ,它应该都工作。
您需要使用SSH隧道将客户端上的本地端口转发到服务器上的mysql端口。 你可以这样做:
% ssh -f -N -L3306:localhost:3306 username@remoteserver % mysql -h remoteserver -u mysqluser -p
ssh的选项意味着:
-f Requests ssh to go to background just before command execution. -N Do not execute a remote command. -L [bind_address:]port:host:hostport Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.
使用-f -N也意味着你将会在后台分配一个ssh进程,而不是象你通常在login到远程shell时那样保持连接到远程主机。 如果你想拆除隧道,你可以杀死你的客户端上的SSH进程,如下所示:
% pgrep -fl ssh 11145 ssh -f -N -L3306:localhost:3306 username@remoteserver % kill -9 11145
当然在这种情况下, 11145是ssh进程的PID,每次启动一个新的ssh进程来打开一个通道时,这个进程的PID都会不同。
此外,这假定你没有在你的客户端上运行的MySQL服务器。 如果是这样,你需要改变你绑定的本地端口,如下所示:
% ssh -f -N -L3333:localhost:3306 username@remoteserver % mysql -P 3333 -h remoteserver -u mysqluser -p
端口3333是任意的; 你可以select你的客户端有任何免费的端口号。
使用-s 192.168.100.0/24表示您只允许远程访问端口3306,以查找与192.168.100.0/24(私有内部networking)匹配的IP范围。 这真的是你打算做的吗? 否则,这就是为什么来自其他IP的远程连接不起作用的问题。
你也通常不需要传出的规则。
如果这样做没有帮助,请提供更多关于您testing的位置,机器的IP /接口,发生了什么情况的信息,或者为我们提供iptables -vnL的完整输出?
编辑1 :
根据更多信息,它显示用作模板的示例被误解了,您必须删除源IP范围(因为您要远程允许每个人)。 只要input这个,只有这个,它应该工作:
iptables -A INPUT -i eth0 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
如果你想包含你的外部IP,它必须是目标IP,例如:
iptables -A INPUT -i eth0 -p tcp -d xx.xx.xx.xx --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-s ,和源一样,只有在你想限制访问特定的IP范围时才会使用。
编辑2 :
似乎不是一个iptables的问题,但更多的是一个MySQL的。 要允许mySQL监听远程连接,请确保将其configuration为侦听您的外部地址。 编辑/etc/mysql/my.cnf并检查bind-address语句并将其更改为:
bind-address = xx.xxx.xx.xx
您可以select将xx.xx.xx.xxreplace为外部IP地址,也可以将其设置为听取0.0.0.0这意味着它将监听所有接口。
之后,你的问题是如何为你的服务器设置整个防火墙。 您可以手动阻止任何其他人无法访问的所有特定端口,也可以设置默认策略以拒绝stream量,然后手动打开端口(如您最初指出的问题所示)以打开您希望允许的服务。 尽pipe如此,如果它是一个远程机器,如果你把错误的顺序或错误的方式放在一个非常容易的地方,你会很容易locking自己。
-A切换到iptables将新规则添加到链的末尾。 很可能你有一个早先的规则是拒绝访问,并与iptables的第一场比赛胜利。 尝试使用-I开关在链的开始插入规则。
如果这不起作用,请将iptables -L -v -n的输出显示为对您的问题的编辑。
INPUT和OUTPUT的默认策略是ACCEPT。 您还没有定义任何规则来丢弃或拒绝数据包。 这意味着你的防火墙不会阻塞任何连接。
问题在其他地方。
使用netstat -tan | grep LISTEN netstat -tan | grep LISTEN以确保您正在运行MySQL并且正在侦听。
如果这样的话,可能还有另外一个阻止连接的防火墙。
我find了自己的问题的答案(我应该澄清,我在本地使用Windows 7,并远程Linux)。
无论如何,答案是使用PuTTy转发一个端口,根据其他回答者 – 但这是Windows用户。
在PuTTy中,build立一个正常的SSH连接,然后进入隧道设置,在SSH下,select一个任意的端口(我用5555)在本地转发到127.0.0.1:3306

打开SSH会话并正常login。
然后在您的MySQL客户端中,将主机地址设置为127.0.0.1,将端口设置为您select的那个(5555)。
因此,MySQL客户端连接到本地计算机,而本地计算机又通过SSH转发到远程计算机上的3306并允许连接。
大注意:我们实际上已经使用localhost (和你一样)而不是127.0.0.1来设置,在PuTTy和MySQL Client之间的某个地方,这个没有解决 – 所以你似乎必须使用环回地址!
非常感谢! 我正在尝试各种各样的垃圾,以便能够远程使用MySQL Workbench来处理我的CentOS MySQL实现中的表。 基本上唯一的解决办法是打开端口3306给每个人(安全性不好)。
我们已经使用Putty来安全地访问我们的服务器,并不知道我们可以build立这样的隧道。 基本上我们可以使用我们现有的安全SSH连接来连接MySQL Workbench和我们的服务器。 谢谢 ! ! !