![Wie kann ich eine Remote-MySQL-Verbindung über HTTP/PHP zulassen?](https://rvso.com/image/697399/Wie%20kann%20ich%20eine%20Remote-MySQL-Verbindung%20%C3%BCber%20HTTP%2FPHP%20zulassen%3F.png)
Ich verwende CentOS 7 auf allen unten genannten Servern.
Ich teste in einer lokalen Entwicklungsumgebung das Einrichten separater Datenbanken und Webserver.
Bei diesen Servern handelt es sich um zwei VirtualBox-Instanzen, die über den Bridged-Modus im lokalen Netzwerk verbunden sind, sodass sie sich gegenseitig problemlos sehen können.
Ich möchte, dass der Webserver eine Verbindung zu MySQL auf dem DB-Server herstellen kann, wobei nur die IP-Einschränkung des Webservers gilt.
Ich habe einige Diskussionsthreads durchgelesen, aber keiner davon half mir bei der Lösung meines Problems, obwohl viele davon damit zusammenhängen firewall
oder selinux
damit zusammenhängen.
Ich habe beides deaktiviert firewalld
, selinux
sodass diese Faktoren derzeit nicht vorliegen.
DB-Server-IP: 192.168.1.167 WEB-Server-IP: 192.168.1.168
Ich verwende das folgende Skript zum Testen,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
Beim Ausführen von: tritt eine Fehlermeldung auf.
wget http://192.168.1.168/connect.php
auf der Terminalkonsole 192.168.1.168http://192.168.1.168/connect.php
in meinem Browserfenster wird mir der gleiche Fehler angezeigt.
(1) Allerdings kann ich mich erfolgreich über die Kommandozeile mysql -u demouser -p -h 192.168.1.167
mit 192.168.1.168 (Webserver) verbinden.
(2) Ich bekomme auch Connected successfully
bei direkter Ausführung php connect.php
in der Terminalkonsole die Adresse 192.168.1.168 (WEB-Server)
Ich kann nur bestätigen, dass die Remote-MySQL-Verbindung über SSH und über das PHP-MySQL-Modul funktioniert.
Hier ist das Zugriffsrecht auf 192.168.1.167 (DB-Server)
+---------------------------------------------------------------------------------------------------------------+
| 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
auf 192.168.1.167 zeigt:
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
Wie kann ich eine Remote-MySQL-Verbindung über HTTP/PHP zulassen, allerdings nur für Anfragen, die vom oben genannten Webserver initiiert werden?
Antwort1
Ich konnte feststellen, dass dies SELinux
die Ursache für den Verbindungsfehler war.
Wie im ursprünglichen Thread erwähnt, habe ich die SELinux
Firewall auf demDBServer, von dem ich glaubte, dass er die Remote-Verbindung vomNETZServer.
Die Ursache für das Verbindungsproblem war SELinux
auf demNETZServer.
Ich habe es vorübergehend deaktiviert, indem ich setenforce 0
es in permissive
den Modus gesetzt habe.
Funktioniert alles.
Ich habe SELinux
die Firewall auf demDBServer. Ich kann immer noch eine Remote-Datenbankverbindung über das PHP-Skript auf demNETZServer.
Ich kann nun bestätigen, dass das Problem auf demNETZServer, der die Verbindung initiiert.
Ich habe es wieder aktiviert SELinux
auf derNETZServer und verwenden Sie den folgenden Befehl, um den Boolean für SELinux
auf demNETZServer.
setsebool -P httpd_can_network_connect_db 1
Derzeit habe ich SELinux
aktiv auf beidenNETZundDBServer im enforcing
Modus und die Remote-MySQL-Verbindung kann weiterhin erfolgreich hergestellt werden.
Was ich in anderen Diskussionsthreads, die ich nicht verfolgt habe, gelesen habe, war: Auf welchem Server sollen die SELinux
Booleschen Werte konfiguriert werden?
Hoffe, dieser Thread kann jedem, der das gleiche Problem hat wie ich, helfen, etwas Zeit zu sparen.