我在下面提到的所有服务器上运行CentOS 7。
我正在testing一个本地开发环境来设置单独的数据库和Web服务器。
这些服务器是通过局域网中的桥接模式连接的两个VirtualBox实例,以便可以看到彼此没有问题。
我只希望WEB服务器能够使用来自WEB服务器的IP限制连接到DB服务器上的MySQL。
我已经阅读了一些讨论主题,但没有一个能够帮助解决我的问题,因为其中许多是firewall或selinux相关的。
我已经禁用了firewalld和selinux所以这些都不是目前的因素。
DB服务器IP:192.168.1.167 WEB服务器IP:192.168.1.168
我正在使用以下脚本进行testing, 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执行时, Connection failed: Permission denied错误:
wget http://192.168.1.168/connect.php在192.168.1.168terminal控制台上
在我的浏览器窗口http://192.168.1.168/connect.php也给了我相同的错误。
(1)但是,我能够通过命令行使用从192.168.1.168(WEB服务器)的mysql -u demouser -p -h 192.168.1.167成功连接,
(2)在192.168.1.168(WEB服务器)的terminal控制台直接执行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服务器发起的请求?
我能够确定SELinux是连接失败的原因。
正如在原始线程中提到的,我禁用了DB服务器上的SELinux和防火墙,我相信这是阻止从WEB服务器的远程连接。
导致连接问题的原因是WEB服务器上的SELinux 。
我暂时禁用它使用setenforce 0将其设置为permissive模式。
一切正常。
我重新启用了数据库服务器上的SELinux和防火墙。 我仍然可以通过WEB服务器上的PHP脚本进行远程数据库连接。
我现在可以确认问题是在启动连接的WEB服务器上。
我在WEB服务器上重新启用了SELinux ,并使用以下命令在WEB服务器上设置SELinux的布尔值。
setsebool -P httpd_can_network_connect_db 1
目前,我已经在enforcing模式下在WEB和DB服务器上激活了SELinux ,远程MySQL连接仍然可以成功执行。
我在其他讨论主题上看到的没有遵循的是:哪个服务器来configurationSELinux布尔值。
希望这个线程可以帮助那些遇到同样问题的人来节省一些时间。