如何为整个子网授予对 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.0
与 192.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 的远程访问权限?的主要内容,如果未能解决你的问题,请参考以下文章