如何防止使用每个 IP 地址的 PDO 连接进行反向 DNS 查找?
How to prevent Reverse DNS Lookup with PDO-connect per IP-adress?
我尝试通过 PDO 连接到每个 IP 地址的另一个数据库服务器 (MySQL)。
$db = new PDO('mysql:host=IP-ADDRESS;dbname=AAA', 'USER', 'XXXXX');
我在这里伪造了 IP 地址和用户,这不是错误 ;)
但无论出于何种原因,PDO 将进行一些疯狂的反向 DNS 查找并最终连接到一个完全不同的服务器,该服务器具有另一个 IP 地址和每个 A 记录分配的其他域作为 PDO 的反向 dns 查找会在这里找到。
PDO 抛出特定异常:
SQLSTATE[28000] [1045] Access denied for user 'USER'@'WWW.ANOTHER-SERVER.COM'
通过 mysql-client 在终端中连接时,一切都按预期工作。
- 如何避免 PDO 进行反向 DNS 查找?
- 我如何告诉 PDO 它应该根据参数中给定的 IP 地址进行连接?
- 这个反向 DNS 查询怎么会错得这么离谱?
/etc/hosts 中没有特定条目,这可能是根本原因。
PHP/PDO机器:
PDO 永远不会进行反向查找。它将进行正向查找,然后连接到该 IP。
您应该能够看到,作为 PHP/PDO 机器的 root,运行
tcpdump -i ethsomething -n -s 1500 -xX port 3306
当 PDO 尝试连接时,此处显示哪个 IP 号?
MySQL机器:
MySQL 永远不会知道您试图访问它的主机名是什么。服务器将看到一个传入请求,在套接字上执行 getpeername(),产生一个 IP 号码。
默认情况下,服务器将对该 IP 进行反向查找。您可以通过输入
来关闭它
[mysqld]
skip-name-resolve
进入您的 my.cnf 文件并重新启动服务器。
当MySQL配置为进行反向查找时,它会尝试这样做。如果失败,在服务器放弃之前等待 DNS 响应的连接尝试需要 5 到 30 秒。
如果反向查找成功,MySQL 将进入 mysql.user 表及其具有已解析名称的朋友,user@reverse_lookup_result.
如果反向查找失败,或者已使用 skip-name-resolve 禁用,MySQL 将进入 mysql.user 表和具有未解析名称的朋友,user@1.2.3.4 或相似。
这会产生有趣的结果:
开启name-resolve后,根据反向查找的成功与否,用户可能拥有不同的权限。
当 skip-name-resolve 打开时,mysql.user.host 中不是 ip-numbers 的条目是无用的。
我尝试通过 PDO 连接到每个 IP 地址的另一个数据库服务器 (MySQL)。
$db = new PDO('mysql:host=IP-ADDRESS;dbname=AAA', 'USER', 'XXXXX');
我在这里伪造了 IP 地址和用户,这不是错误 ;)
但无论出于何种原因,PDO 将进行一些疯狂的反向 DNS 查找并最终连接到一个完全不同的服务器,该服务器具有另一个 IP 地址和每个 A 记录分配的其他域作为 PDO 的反向 dns 查找会在这里找到。
PDO 抛出特定异常:
SQLSTATE[28000] [1045] Access denied for user 'USER'@'WWW.ANOTHER-SERVER.COM'
通过 mysql-client 在终端中连接时,一切都按预期工作。
- 如何避免 PDO 进行反向 DNS 查找?
- 我如何告诉 PDO 它应该根据参数中给定的 IP 地址进行连接?
- 这个反向 DNS 查询怎么会错得这么离谱?
/etc/hosts 中没有特定条目,这可能是根本原因。
PHP/PDO机器:
PDO 永远不会进行反向查找。它将进行正向查找,然后连接到该 IP。
您应该能够看到,作为 PHP/PDO 机器的 root,运行
tcpdump -i ethsomething -n -s 1500 -xX port 3306
当 PDO 尝试连接时,此处显示哪个 IP 号?
MySQL机器:
MySQL 永远不会知道您试图访问它的主机名是什么。服务器将看到一个传入请求,在套接字上执行 getpeername(),产生一个 IP 号码。
默认情况下,服务器将对该 IP 进行反向查找。您可以通过输入
来关闭它[mysqld]
skip-name-resolve
进入您的 my.cnf 文件并重新启动服务器。
当MySQL配置为进行反向查找时,它会尝试这样做。如果失败,在服务器放弃之前等待 DNS 响应的连接尝试需要 5 到 30 秒。
如果反向查找成功,MySQL 将进入 mysql.user 表及其具有已解析名称的朋友,user@reverse_lookup_result.
如果反向查找失败,或者已使用 skip-name-resolve 禁用,MySQL 将进入 mysql.user 表和具有未解析名称的朋友,user@1.2.3.4 或相似。
这会产生有趣的结果:
开启name-resolve后,根据反向查找的成功与否,用户可能拥有不同的权限。
当 skip-name-resolve 打开时,mysql.user.host 中不是 ip-numbers 的条目是无用的。