如何允许远程 MySQL 访问单个静态 IP?

如何允许远程 MySQL 访问单个静态 IP?

我正在尝试通过端口 3306 启用对 MySQL 的远程访问,但没有成功。我被授予了生产机器的 root 访问权限,这样我就可以获取文件和数据库,在本地处理它们,然后放回修改后的版本。

我的访问权限允许我通过 SSH 进入该框,并且允许通过 SSH 进行 FTP。我现在正尝试通过 SSH 获取 MySQL 访问权限。MySQL 正在运行(本地监听)并可在命令行上访问,并且可以毫无问题地访问它。

我意识到我可以转储数据库,在本地恢复文件并执行修改。但是,将来我可能需要更改一些内容,我不希望在命令行上执行此操作,因为通过 GUI 执行此操作更快。或者如果我可以像我想要的那样连接,那就更好了。

答案1

编辑:如果您使用 Windows,则需要记住以下说明的两件事:

1) 更改localhost127.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

当然在这种情况下,11145ssh 进程的 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

PuTTy 隧道选项

打开 SSH 会话并正常登录。

然后在您的 MySQL 客户端中,将主机地址设置为 127.0.0.1,并将端口设置为您选择的端口 (5555)。

因此,MySQL 客户端连接到您的本地计算机,然后通过 SSH 转发到远程计算机上的 3306 并允许连接。

重要提示:我们实际上已经使用术语进行了设置本地主机(正如您所做的那样)而不是 127.0.0.1,在 PuTTy 和 MySQL 客户端之间的某个地方,这并没有解决 - 所以看来您必须使用环回地址!

相关内容