HTTP/PHP를 통한 원격 MySQL 연결을 어떻게 허용합니까?

HTTP/PHP를 통한 원격 MySQL 연결을 어떻게 허용합니까?

아래 언급된 모든 서버에서 CentOS 7을 실행하고 있습니다.

별도의 데이터베이스와 웹 서버를 설정하기 위해 로컬 개발 환경에서 테스트하고 있습니다.

이 서버는 LAN에서 브리지 모드를 통해 연결된 두 개의 VirtualBox 인스턴스이므로 문제없이 서로를 볼 수 있습니다.

웹 서버에서만 IP 제한을 사용하여 웹 서버가 DB 서버의 MySQL에 연결할 수 있기를 원합니다.

일부 토론 스레드를 읽었지만 그 중 많은 스레드가 관련되어 있거나 내 문제를 해결하는 데 도움이 되지 firewall않습니다 selinux.

나는 둘 다 비활성화하여 firewalld현재 selinux로서는 이것이 요인이 되지 않도록 했습니다.

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.php192.168.1.168 터미널 콘솔에서

  • http://192.168.1.168/connect.php내 브라우저 창에서도 같은 오류가 발생합니다.

mysql -u demouser -p -h 192.168.1.167(1) 그러나 192.168.1.168(웹 서버)을 사용하여 명령줄을 통해 성공적으로 연결할 수 있습니다.

(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 연결을 허용하려면 어떻게 해야 합니까?

답변1

SELinux그것이 연결 실패의 원인임을 확인할 수 있었습니다 .

원래 스레드에서 언급한 대로, 저는 SELinux방화벽과 방화벽을 비활성화했습니다.DB서버가 원격 연결을 차단하고 있다고 생각했습니다.편물섬기는 사람.

연결 문제를 일으키는 원인 SELinux편물섬기는 사람.

모드 setenforce 0로 설정하기 위해 일시적으로 비활성화했습니다 .permissive

모든 것이 작동합니다.

다시 활성화 SELinux하고 방화벽을DB섬기는 사람. 여전히 PHP 스크립트를 통해 원격 데이터베이스 연결을 만들 수 있습니다.편물섬기는 사람.

이제 문제가 다음에 있었음을 확인할 수 있습니다.편물연결을 시작하는 서버.

SELinux에서 다시 활성화했습니다.편물SELinux서버 에서 다음 명령을 사용하여 부울을 설정합니다.편물섬기는 사람.

setsebool -P httpd_can_network_connect_db 1

현재 저는 SELinux두 가지 모두에서 활동 하고 있습니다.편물&DB서버가 enforcing모드에 있고 원격 MySQL 연결은 여전히 ​​성공적으로 진행될 수 있습니다.

내가 따르지 않은 다른 토론 스레드에서 읽은 내용은 SELinux부울을 구성할 서버가 무엇인지였습니다.

이 스레드가 나와 같은 문제를 겪고 있는 사람에게 시간을 절약하는 데 도움이 되기를 바랍니다.

관련 정보