我正在尝试通过端口 3306 启用对 MySQL 的远程访问,但没有成功。我被授予了生产机器的 root 访问权限,这样我就可以获取文件和数据库,在本地处理它们,然后放回修改后的版本。
我的访问权限允许我通过 SSH 进入该框,并且允许通过 SSH 进行 FTP。我现在正尝试通过 SSH 获取 MySQL 访问权限。MySQL 正在运行(本地监听)并可在命令行上访问,并且可以毫无问题地访问它。
我意识到我可以转储数据库,在本地恢复文件并执行修改。但是,将来我可能需要更改一些内容,我不希望在命令行上执行此操作,因为通过 GUI 执行此操作更快。或者如果我可以像我想要的那样连接,那就更好了。
答案1
编辑:如果您使用 Windows,则需要记住以下说明的两件事:
1) 更改localhost
为127.0.0.1
因为 Windows 没有在 中自动设置%SystemRoot%\system32\drivers\etc\hosts
。
2)你可以使用鲜为人知的链接器命令行工具油灰工具套件;它使用与命令相同的选项语法ssh
,因此如果您ssh
在下面的示例中替换它plink.exe
,它应该都可以工作。
您需要使用 SSH 隧道将客户端上的本地端口转发到服务器上的 mysql 端口。您可以使用以下命令执行此操作:
% ssh -f -N -L3306:localhost:3306 username@remoteserver
% mysql -h remoteserver -u mysqluser -p
选项远程控制意思是:
-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 进程,而不是像登录远程 shell 时通常那样保持与远程主机的连接。如果您想拆除隧道,您可以像这样在客户端上终止 ssh 进程:
% pgrep -fl ssh
11145 ssh -f -N -L3306:localhost:3306 username@remoteserver
% kill -9 11145
当然在这种情况下,11145
ssh 进程的 PID 每次启动新的 ssh 进程来打开隧道时都会有所不同。
此外,这假设你确实不是您的客户端上是否也运行有 mysql 服务器。如果是这样,您需要更改绑定到的本地端口,如下所示:
% ssh -f -N -L3333:localhost:3306 username@remoteserver
% mysql -P 3333 -h remoteserver -u mysqluser -p
端口3333
是任意的;您可以选择客户端的任何空闲端口号。
答案2
使用-s 192.168.100.0/24
意味着您仅允许与 192.168.100.0/24 匹配的 IP 范围远程访问端口 3306,这是一个私有内部网络。这真的是您想要做的吗?否则这就是其他 IP 的远程连接不起作用的原因。
您通常也不需要传出规则。
如果这没有帮助,请提供更多有关您从哪里进行测试、机器的 IP /接口、发生了什么以及是否iptables -vnL
为我们提供完整的输出的信息?
编辑1:
根据更多信息,它表明用作模板的示例被误解了,您必须删除源 IP 范围(因为您想允许所有人远程访问)。只需输入此内容,并且仅输入此内容,它应该可以工作:
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 监听远程连接,请确保将其配置为监听您的外部地址。编辑/etc/mysql/my.cnf
并检查bind-address
语句并将其更改为:
bind-address = xx.xxx.xx.xx
您可以选择将 xx.xx.xx.xx 替换为您的外部 IP 地址,或者您可以将其设置为监听,0.0.0.0
这意味着它将监听所有接口。
之后,您要考虑的问题是如何为您的服务器设置整个防火墙。您可以手动阻止其他任何人都无法访问的所有特定端口,或者必须设置默认策略以拒绝流量,然后手动逐个端口打开要允许的服务(如您的初始问题所示)。非常但要小心这一点,如果它是一台远程机器,如果你把东西按错误的顺序或错误的方式输入,你很容易把自己锁在外面。
答案3
切换-A
到 iptables 会将新规则添加到链的末尾。您可能有一个较早的规则拒绝访问,而使用 iptables 时第一个匹配会获胜。尝试使用开关-I
将规则插入链的开头。
如果这不起作用,请向我们展示iptables -L -v -n
作为对您的问题的编辑的输出。
答案4
我找到了我自己的问题的答案(我应该澄清一下,我在本地使用的是 Windows 7,在远程使用的是 Linux)。
无论如何,答案是使用 PuTTy 转发端口,按照其他回答者的说法 - 但这是针对 Windows 用户而言的。
在 PuTTy 中,正常设置 SSH 连接,然后转到隧道设置,在 SSH 下,在本地选择一个任意端口(我使用了 5555)转发到 127.0.0.1:3306
打开 SSH 会话并正常登录。
然后在您的 MySQL 客户端中,将主机地址设置为 127.0.0.1,并将端口设置为您选择的端口 (5555)。
因此,MySQL 客户端连接到您的本地计算机,然后通过 SSH 转发到远程计算机上的 3306 并允许连接。
重要提示:我们实际上已经使用术语进行了设置本地主机(正如您所做的那样)而不是 127.0.0.1,在 PuTTy 和 MySQL 客户端之间的某个地方,这并没有解决 - 所以看来您必须使用环回地址!