Mysql

如何允許通過 HTTP/PHP 進行遠端 MySQL 連接?

  • January 22, 2017

我在下面提到的所有伺服器上執行 CentOS 7。

我正在測試本地開發環境以設置單獨的數據庫和 Web 伺服器。

這些伺服器是在區域網路中通過橋接模式連接的兩個 VirtualBox 實例,因此可以毫無問題地看到對方。

我希望 WEB 伺服器僅使用來自 WEB 伺服器的 IP 限制連接到 DB 伺服器上的 MySQL。

我已經閱讀了一些討論主題,但它們都沒有幫助解決我的問題,因為它們中的許多都是firewallselinux相關的。

我已經禁用了兩者firewalldselinux因此目前這些都不是因素。

DB伺服器IP:192.168.1.167 WEB伺服器IP:192.168.1.168

我正在使用以下腳本進行測試,http://192.168.1.168/connect.php

<?php
$servername = "192.168.1.167";
$username = "demouser";
$password = "password";

// Create connection
$conn = mysqli_connect($servername, $username, $password);

// Check connection
if (!$conn) {
   die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>

執行時出現Connection failed: Permission denied錯誤:

  • wget http://192.168.1.168/connect.php在 192.168.1.168 終端控制台上
  • http://192.168.1.168/connect.php在我的瀏覽器視窗中也給了我同樣的錯誤。

(1) 但是,我可以使用mysql -u demouser -p -h 192.168.1.167192.168.1.168 (WEB 伺服器)通過命令行成功連接

(2)我在192.168.1.168(WEB伺服器)的終端控制台Connected successfully直接執行時也得到php connect.php

我只能確認通過 SSH 的遠端 MySQL 連接正在工作,並且通過 PHP MySQL 模組正在工作。

這是 192.168.1.167(數據庫伺服器)上的訪問權限

+---------------------------------------------------------------------------------------------------------------+
| Grants for demouser@localhost                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'demouser'@'localhost' IDENTIFIED BY PASSWORD '*DB17DD535D122AED147A61C30CD5D01FB3BC5433' |
| GRANT ALL PRIVILEGES ON `demodb`.* TO 'demouser'@'localhost'                                                      |
+---------------------------------------------------------------------------------------------------------------+

+-------------------------------------------------------------------------------------------------------------------+
| Grants for demouser@192.168.1.168                                                                                   |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'demouser'@'192.168.1.168' IDENTIFIED BY PASSWORD '*DB17DD535D122AED147A61C30CD5D01FB3BC5433' |
| GRANT ALL PRIVILEGES ON `demodb`.* TO 'demouser'@'192.168.1.168'                                                      |
+-------------------------------------------------------------------------------------------------------------------+

netstat在 192.168.1.167 上顯示:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      2892/mysqld         
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1704/master         
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1053/sshd 

如何允許通過 HTTP/PHP 進行遠端 MySQL 連接,但僅適用於從上述 WEB 伺服器發起的請求?

我能夠確定這SELinux是連接失敗的原因。

如原始執行緒中所述,我禁用了數據庫SELinux伺服器上的和防火牆,我認為這會阻止來自WEB伺服器的遠端連接。

導致連接問題的原因是SELinuxWEB伺服器上。

我暫時禁用它setenforce 0以將其設置為permissive模式。

一切正常。

我在數據庫伺服器上重新啟用SELinux了防火牆。我仍然可以通過WEB伺服器上的 PHP 腳本進行遠端數據庫連接。

我現在可以確認問題出在啟動連接的WEB伺服器上。

SELinux我在WEB伺服器上重新啟用並使用以下命令SELinuxWEB伺服器上設置布爾值。

setsebool -P httpd_can_network_connect_db 1

目前,我在WEBDB伺服器SELinux上都處於活動狀態,遠端 MySQL 連接仍然可以成功通過。enforcing

我在其他未關注的討論執行緒上讀到的是:配置SELinux布爾值的伺服器。

希望這個文章可以幫助和我遇到同樣問題的人節省一些時間。

引用自:https://serverfault.com/questions/827810