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

114

我可以轻松使用以下代码授予一个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.* 远程访问数据库。

我该如何做到?

8个回答

155

看起来你也可以使用网络掩码,例如这里

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

8
这应该被认为是正确的答案,因为它是唯一的技术上正确的答案。自至少5.5版本以来得到支持:http://dev.mysql.com/doc/refman/5.5/en/account-names.html - lifeofguenter
13
不要尝试使用CIDR表示法,比如“172.16.0.0/16”,这样不起作用。请始终使用完整的网络掩码。 - Oliver R.
2
看起来你必须使用范围内的第一个IP地址;例如使用192.168.0.34/255.255.255.0将会失败! - Saa
@Malvineous 这就是我的观点。如果您使用192.160.0.34/255.255.255.0,mysql将不允许192.160.0.34。我本意是要允许完整的/24(是的,我使用了完整的网络掩码,正如文档所述),但显然如果您必须使用192.160.0.0/255.255.255.0才能允许完整范围。 - Saa
@SanderBackus:好的,抱歉,我以为你想使用“.34”来允许/25或更小的子网。 - Malvineous
显示剩余3条评论

116

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


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

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

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


7
我只是这样做了,但是,比如说,为什么它不能应用于:user_name@'192.168.1.my-hacked-rnds.killing.mysql.com'?我现在会继续,因为这是MySQL,我感觉我不想知道答案。 - Florian Heigl
+Florian,我认为这比简单地使用“%”更好,因为它增加了一层必须克服的安全性,但我认为你提出了一个很好的观点,即它的弱点。当然,我通过其他方式补充了这个配置,例如将数据库服务器锁定在我可以通过防火墙控制访问权限的单独子网中,以消除您的担忧,等等。 - Josiah
26
像“192.168.1.my-hacked-rnds.killing.mysql.com”这样的示例在https://dev.mysql.com/doc/refman/5.5/en/account-names.html中有特别说明:为了防止这种尝试,MySQL禁止匹配以数字和点开头的主机名...IP通配符值只能匹配IP地址,而不能匹配主机名。 - Stefan Lasiewski

35

你可以像这样使用“%”作为通配符:

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

17
mysql> GRANT ALL ON *.* to root@'192.168.1.%' IDENTIFIED BY 'your-root-password';  
通配符字符应使用 "%" 而不是 "*"。

9

我遇到了一个奇怪的问题:

考虑以下内容:

db server:  192.168.0.101
web server: 192.168.0.102

如果在mysql.user中定义了两个用户,一个是'user'@'192.168.0.102',密码为password1,另一个是'user'@'192.168.0.%',密码为password2。

那么,如果你尝试使用密码为password2的'user'从Web服务器连接到数据库服务器,将导致"Access denied"(拒绝访问)错误,因为单个IP'user'@'192.168.0.102'的认证比通配符'user'@'192.168.0.%'的认证更优先。


2
我不确定这是否是对问题的回答。如果它没有直接回答原始问题,应该将其发布为评论。 - Kmeixner
16
Kmeixner,你希望他在评论中写这么多吗?用点常识,别再表现得像个机器人了。这个社区是为了帮助开发者而不是让他们的生活变得更加困难。 - user1735921
感谢您提供这个非常有价值的提示。 - TenG

3
受@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”将不起作用,因为它不在完整的八位字节边界上。

2

MySQL 8.0.23及以上版本现在也支持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 ...

0

在连接服务器后,如果您想要在自己的主机上连接,应按照以下步骤进行:

  1. 输入mysql以打开mysql
  2. 输入GRANT ALL ON . to root@'write_your_ip_addres' IDENTIFIED BY 'write_password_to_connect';
  3. 按下control和X键退出mysql
  4. 输入nano /etc/mysql/my.cnf
  5. 在my.cnf文件夹中bind-address = 127.0.0.1前面加上#
  6. #bind-address = 127.0.0.1
  7. 使用control + X保存my.cnf文件夹
  8. 输入service mysql restart
  9. 您现在可以通过navicat在自己的主机上连接了

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接