如何为整个子网授予对 MySQL 的远程访问权限?

Posted

技术标签:

【中文标题】如何为整个子网授予对 MySQL 的远程访问权限?【英文标题】:How to grant remote access to MySQL for a whole subnet? 【发布时间】:2012-07-29 09:18:39 【问题描述】:

我可以使用此代码轻松授予对一个 IP 的访问权限:

$ mysql -u root -p
Enter password:    
mysql> use mysql    
mysql> GRANT ALL ON *.* to root@'192.168.1.4' IDENTIFIED BY 'your-root-password';     
mysql> FLUSH PRIVILEGES;

但我需要允许整个子网 192.168.1.* 远程访问数据库。

我该怎么做?

【问题讨论】:

【参考方案1】:

MySQL 8.0.23 onwards 现在也支持 CIDR 表示法。

所以,基本上:

-- CIDR Notation
GRANT ... TO 'user'@'192.168.1.0/24' IDENTIFIED BY ...

-- Netmask Notation
GRANT ... TO 'user'@'192.168.1.0/255.255.255.0' IDENTIFIED BY ...

【讨论】:

【参考方案2】:

受@Malvineaus 回答的启发,我自己尝试了一下,发现它对我不起作用。

您可以使用“192.168.1.%”或“192.168.1.0/255.255.255.0”指定子网掩码,但子网必须始终使用完整的八位字节。见https://mariadb.com/kb/en/create-user/#host-name-component。因此,一种规范方式和另一种规范方式之间的功能是相同的。

例如,'192.168.1.0/255.255.255.128' 将不起作用,因为它不在完整的八位字节边界上。

【讨论】:

【参考方案3】:

连接服务器并想在主机上连接后,您应该执行以下步骤:

    mysql打开mysql 写信GRANT ALL ON <em>.</em> to root@'write_your_ip_addres' IDENTIFIED BY 'write_password_to_connect'; 按 control 和 X 退出 mysql 写信nano /etc/mysql/my.cnf 在my.cnf文件夹的bind-address = 127.0.0.1之前写# #bind-address = 127.0.0.1 用 control + X 保存 my.cnf 文件夹 写信service mysql restart 您可以通过主机上的 navicat 进行连接

【讨论】:

【参考方案4】:

编辑:考虑查看并支持Malvineous 在此页面上的答案。网络掩码是一种更优雅的解决方案。


只需在 IP 地址中使用百分号作为通配符。

来自http://dev.mysql.com/doc/refman/5.1/en/grant.html

您可以在主机名中指定通配符。例如,user_name@'%.example.com' 适用于user_name,适用于example.com 域中的任何主机,user_name@'192.168.1.%' 适用于user_name,适用于192.168.1 C 类子网中的任何主机。

【讨论】:

我只是这样做了,但是,比如说,是什么使它不适用于:user_name@'192.168.1.my-hacked-rnds.killing.mysql.com'????我现在继续,因为这是 MySQL,我觉得我不想知道答案。 +Florian,我认为它比简单地使用 '%' 要好,因为它确实增加了必须克服的安全层,但我认为你确实说明了它的弱点。我当然会通过其他方式补充此配置,例如将数据库服务器锁定在一个单独的子网中,我可以通过防火墙控制访问以消除您的顾虑等。 像 '192.168.1.my-hacked-rnds.killing.mysql.com'' 这样的例子在dev.mysql.com/doc/refman/5.5/en/account-names.html 中得到了特别的解决:为了阻止这种尝试,MySQL 不允许匹配主机名以数字和点开头。 ... IP 通配符值只能匹配 IP 地址,不能匹配主机名。【参考方案5】:

它looks like you can also use a netmask,例如

GRANT ... TO 'user'@'192.168.0.0/255.255.255.0' IDENTIFIED BY ...

【讨论】:

这应该是公认的答案,因为它是唯一技术正确的答案。至少从 5.5 开始支持:dev.mysql.com/doc/refman/5.5/en/account-names.html 不要尝试使用像“172.16.0.0/16”这样的 CIDR 表示法,这不起作用。始终使用完整的网络掩码。 看来您必须使用范围内的第一个 IP 地址;使用例如 192.168.0.34/255.255.255.0 将失败! @SanderBackus: 192.160.0.34/255.255.255.0192.168.0.34/24 相同,这实际上没有意义(/24 表示最后一个数字可以从 0 到 255,忽略您的值 34)。如果您对 IP 使用有效的掩码,例如 192.168.0.34/255.255.255.252,它是否有效? @Malvineous 这就是我的观点。如果使用 192.160.0.34/255.255.255.0 mysql 不允许使用 192.160.0.34。我的意思是允许完整的 /24 (是的,我使用了完整的网络掩码,如文档所示),但显然如果你必须使用 192.160.0.0/255.255.255.0 来允许完整的范围。【参考方案6】:

只是记录我遇到的一个特殊性: 考虑:

db server:  192.168.0.101
web server: 192.168.0.102

如果您在 mysql.user 中定义了一个用户为 'user'@'192.168.0.102',密码为 1,另一个用户为 'user'@'192.168.0.%',密码为 2,

那么,

如果您尝试使用密码 2 以“用户”身份从 Web 服务器连接到数据库服务器,

这将导致“访问被拒绝”错误,因为单个 IP 'user'@'192.168.0.102' 身份验证使用通配符 'user'@'192.168.0.%' 身份验证。

【讨论】:

我不确定这是对问题的回答。如果它没有直接回答原始问题,则应将其作为评论发布。 Kmeixner ,你希望他在评论中写这么多吗?运用一些常识,不要再做机器人了。这个社区是为了帮助开发者不要让他们的生活变得困难。 感谢您的宝贵建议。【参考方案7】:
mysql> GRANT ALL ON *.* to root@'192.168.1.%' IDENTIFIED BY 'your-root-password';  

通配符是“%”而不是“*”

【讨论】:

【参考方案8】:

您可以像这样使用 '%' 作为通配符:

GRANT ALL ON *.* to root@'192.168.1.%' IDENTIFIED BY 'your-root-password';

【讨论】:

以上是关于如何为整个子网授予对 MySQL 的远程访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

如何为我的网站数据库中的 mysql 数据库表授予超级权限

sql 授予root用户远程访问MySQL服务器的权限

Chef:如何为多个服务器提供文件库访问权限

如何为phonegap混合应用程序授予相机权限?

如何为 zeppelin 用户授予正确的权限

如何为 npx 命令授予 mkdir 权限