数据库如何评估 MySQL 用户的主机?我的服务器尝试从其中连接到数据库,myhostname
但即使我已经在其中设置了该服务器的主机名,它仍然失败,/etc/hostname
但当我使用 IP 时它确实有效。
用户是这样创建的:
GRANT ALL ON db.* TO 'dude'@'myhostname';
数据库如何评估 MySQL 用户的主机?我的服务器尝试从其中连接到数据库,myhostname
但即使我已经在其中设置了该服务器的主机名,它仍然失败,/etc/hostname
但当我使用 IP 时它确实有效。
用户是这样创建的:
GRANT ALL ON db.* TO 'dude'@'myhostname';
MySQL 错误将告诉您服务器机器认为您的用户正在连接的主机名。根据 DNS 设置,这可能是也可能不是您的客户端认为分配给自己的主机名。从服务器看到的名称是您需要在GRANT
语句中设置的名称。
(这是合乎逻辑的。假设我知道服务器授予 Alice 的权限。我有主机 Bob。由于它是我的主机,我可以将其名称更改为 Alice。如果只是这样做授予我 Alice 的权限,整个GRANT
方案将完全不安全!发生的情况是我的主机认为是 Alice,但服务器看到我的 IP,询问 DNS “这是谁?”并收到“他是 Bob”。我仍然可以窃取 Alice 的权限,但我需要破坏 DNS 记录不知何故)
紧要关头,将客户端 IP 和主机名添加到服务器/etc/hosts
文件中。然而,这是一个 hack,正确的 DNS 设置是要走的路:一个被遗忘的hosts
hack 可能会让你在接下来的几个月里费尽心思。
如MySQL 手册中的DNS 查找优化和主机缓存中所述:
服务器使用线程安全执行主机名解析,
gethostbyaddr_r()
并gethostbyname_r()
在操作系统支持时调用。否则,执行查找的线程将锁定互斥体并调用gethostbyaddr()
andgethostbyname()
代替。
因此,连接 IP 的解析myhostname
是操作系统的问题,而不是 MySQL 的问题。您应该首先确定您的操作系统正在正确解析客户端 IP,如果没有,请调试您的操作系统或名称服务配置(有关此主题的问题可能更好地指向Super User或Sever Fault,而不是 StackOverflow)。