![如何透過 HTTP/PHP 允許遠端 MySQL 連線?](https://rvso.com/image/697399/%E5%A6%82%E4%BD%95%E9%80%8F%E9%81%8E%20HTTP%2FPHP%20%E5%85%81%E8%A8%B1%E9%81%A0%E7%AB%AF%20MySQL%20%E9%80%A3%E7%B7%9A%EF%BC%9F.png)
我在下面提到的所有伺服器上運行 CentOS 7。
我正在本地開發環境上進行測試,以設定單獨的資料庫和 Web 伺服器。
這些伺服器是區域網路中透過橋接模式連接的兩個 VirtualBox 實例,因此可以毫無問題地相互看到。
我希望 WEB 伺服器能夠僅使用 WEB 伺服器的 IP 限制連接到資料庫伺服器上的 MySQL。
我已經閱讀了一些討論主題,但它們都無法幫助解決我的問題,因為其中許多都是firewall
相關selinux
的。
我已經禁用了這兩個功能firewalld
,selinux
因此目前這些不是影響因素。
資料庫伺服器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.167
192.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' |
+-------------------------------------------------------------------------------------------------------------------+
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 伺服器發起的請求?
答案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
布林值的伺服器。
希望這個帖子可以幫助那些和我遇到同樣問題的人節省一些時間。