如何透過 HTTP/PHP 允許遠端 MySQL 連線?

如何透過 HTTP/PHP 允許遠端 MySQL 連線?

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

我正在本地開發環境上進行測試,以設定單獨的資料庫和 Web 伺服器。

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

我希望 WEB 伺服器能夠僅使用 WEB 伺服器的 IP 限制連接到資料庫伺服器上的 MySQL。

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

我已經禁用了這兩個功能firewalldselinux因此目前這些不是影響因素。

資料庫伺服器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(DB伺服器)的存取權限

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

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

netstat192.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 伺服器發起的請求?

答案1

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

正如原始線程中提到的,我禁用了SELinux防火牆D B伺服器,我認為它阻止了來自網路伺服器.

導致連線問題的原因SELinux網路伺服器.

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

一切正常。

我重新啟用了SELinux防火牆D B伺服器.我仍然可以透過 PHP 腳本進行遠端資料庫連接網路伺服器.

我現在可以確認問題出在網路伺服器發起連線。

我重新啟用SELinux網路伺服器並使用以下命令設定布林SELinux網路伺服器.

setsebool -P httpd_can_network_connect_db 1

目前我SELinux在這兩方面都很活躍網路&D B伺服器處於enforcing模式下,遠端MySQL連線仍然可以成功。

我在其他沒有遵循的討論線程上讀到的內容是:配置SELinux布林值的伺服器。

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

相關內容