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


93

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

我怎样才能做到这一点?

Answers:


100

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


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

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

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


6
我只是这样做,但是,是什么使它不适用于:user_name@'192.168.1.my-hacked-rnds.killing.mysql.com'????我现在继续前进,因为这是MySQL,我感觉我不想知道答案。
Florian Heigl,2015年

+ Florian,我认为使用'%'可以击败它,因为它确实增加了必须克服的安全性层,但是我认为您确实对它的弱点有所了解。我当然可以通过其他方式补充此配置,例如将数据库服务器锁定在一个单独的子网中,我可以通过防火墙控制对它的访问,从而消除您的顾虑。
乔西亚

22
dev.mysql.com/doc/refman/5.5/en/account-names.html中专门解决了类似“ 192.168.1.my-hacked-rnds.killing.mysql.com”之类的示例:为了阻止此类尝试,MySQL不允许匹配以数字和点开头的主机名。... IP通配符值只能匹配IP地址,不能匹配主机名。
Stefan Lasiewski,2015年

118

看起来像你也可以使用一个网络掩码,如

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

7
这应该是公认的答案,因为它是唯一的技术正确答案。支持,因为至少5.5:dev.mysql.com/doc/refman/5.5/en/account-names.html
lifeofguenter

6
不要尝试使用CIDR表示法,例如“ 172.16.0.0/16”,这是行不通的。始终使用完整的网络掩码。
奥利弗·

看来您必须使用该范围内的第一个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

@Malvineous那是我的意思。如果使用192.160.0.34/255.255.255.0 mysql则不允许192.160.0.34。我本来打算允许完整的/ 24(是的,我已经记录了完整的网络掩码),但是显然如果您必须使用192.160.0.0/255.255.255.0来允许完整范围。
桑德

28

您只需将“%”用作通配符,如下所示:

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

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

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


5

只是我所遇到的特殊情况的记录:
考虑:

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,

然后,

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

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


2
我不确定这是否是问题的答案。如果未提供对原始问题的直接答案,则应将其发布为评论。
Kmeixner '16

13
Kmeixner,您希望他在评论中写这么多?运用一些常识,停止成为机器人。这个社区是为了帮助开发人员减轻生活负担。
user1735921

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连接

0

受@Malvineaus的回答激励,我自己尝试了一下,发现它不适用于我。

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

例如,“ 192.168.1.0/255.255.255.128”将无法使用,因为它不在完整的八位位组边界上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.