2015-09-05 116 views
2

我嘗試通過PDO連接到每個IP地址的另一個數據庫服務器(MySQL)。如何使用每個IP地址的PDO連接防止反向DNS查找?

$db = new PDO('mysql:host=IP-ADDRESS;dbname=AAA', 'USER', 'XXXXX'); 

我僞造IP-ADRESS和用戶在這裏,這不是錯誤;)

但不管是什麼原因PDO將會做出一些瘋狂的反向DNS查找,並最終連接到一個完全不同的服務器,它有另一個IP地址和其他域分配每個A記錄作爲從PDO的反向dns查找將在這裏找到。

PDO拋出特定異常:

SQLSTATE[28000] [1045] Access denied for user 'USER'@'WWW.ANOTHER-SERVER.COM' 

雖然通過MySQL的客戶端連接都在終端工作正常。

  1. 我該如何避免PDO進行反向DNS查找?
  2. 我該如何告訴PDO它應該連接參數中給出的每個IP地址?
  3. 這怎麼可能,這反向DNS查詢是如此錯誤?

/etc/hosts中沒有特定的條目,這可能是造成這種情況的根本原因。

回答

3

PHP/PDO機:

PDO永遠以反向查找。它將執行正向查找,然後連接到該IP。

你應該能夠看到的是,在PHP/PDO機是根,運行

tcpdump -i ethsomething -n -s 1500 -xX port 3306 

哪個IP號碼時,此處顯示PDO嘗試連接?

MySQL的機器:

MySQL將永遠不知道主機名是根據你試圖去實現它。服務器將看到一個傳入的請求,在套接字上執行一個getpeername(),產生一個IP號碼。

服務器默認會對該IP進行反向查找。您可以通過將

[mysqld] 
skip-name-resolve 

放入您的my.cnf文件並重新啓動服務器。

當MySQL配置爲執行反向查找時,它將嘗試這樣做。如果失敗,則在服務器放棄之前,等待DNS響應的連接嘗試需要5到30秒的時間。

如果反向查找成功,MySQL將以解析名稱user @ reverse_lookup_result進入mysql.user表及其朋友。

如果反向查找失敗或已通過skip-name-resolve禁用,則MySQL將進入mysql.user表和擁有未解析名稱[email protected]或類似名稱的朋友。

這有有趣的結果:

  1. 當名稱解析是,用戶可能根據反向查找的成功不同的權限。

  2. 當skip-name-resolve打開時,mysql.user.host中不是ip-numbers的條目是無用的。