기본적으로 MySQL 서버는 localhost의 연결만 수신합니다. 즉, 동일한 호스트에서 실행되는 응용 프로그램에서만 액세스할 수 있습니다.
그러나 경우에 따라 원격 위치에서 MySQL 서버에 액세스해야 합니다. 예를 들어 로컬 시스템에서 원격 MySQL 서버에 연결하거나 애플리케이션이 데이터베이스 서버와 다른 시스템에서 실행 중인 다중 서버 배포가 필요할 수 있습니다. 한 가지 옵션은 SSH 터널을 통해 MySQL 서버에 액세스하는 것이고, 다른 옵션은 원격 연결을 허용하도록 MySQL 서버를 구성하는 것입니다.
MySQL 서버에 대한 원격 연결을 허용하는 데 필요한 단계를 설명합니다. MariaDB에도 동일한 지침이 적용됩니다.
MySQL Server를 구성
첫 번째 단계는 MySQL 서버가 특정 IP 주소 또는 시스템의 모든 IP 주소에서 수신하도록 설정하는 것입니다.
MySQL 서버와 클라이언트가 전용 네트워크를 통해 통신할 수 있는 경우 MySQL 서버가 전용 IP에서만 수신하도록 설정하는 것이 가장 좋습니다.
그렇지 않으면 공용 네트워크를 통해 서버에 연결하려면 MySQL 서버가 시스템의 모든 IP 주소를 수신하도록 설정하십시오. 이렇게 하려면 MySQL 구성 파일을 편집하고 바인딩 주소 옵션의 값을 추가하거나 변경해야 합니다. 단일 IP 주소와 IP 범위를 설정할 수 있습니다. 주소가 0.0.0.0인 경우 MySQL 서버는 모든 호스트 IPv4 인터페이스에서 연결을 허용합니다. 시스템에 IPv6이 구성된 경우 0.0.0.0 대신 ::를 사용합니다.
MySQL 구성 파일의 위치는 배포에 따라 다릅니다. Ubuntu 및 Debian에서는 파일이 /etc/mysql/mysql.conf.d/mysqld.cnf에 있는 반면 CentOS와 같은 Red Hat 기반 배포에서는 파일이 /etc/my.cnf에 있습니다.
텍스트 편집기로 파일을 엽니다.
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
바인드 주소로 시작하는 줄을 검색하고 해당 값을 MySQL 서버가 수신 대기해야 하는 IP 주소로 설정합니다.
기본적으로 값은 127.0.0.1(localhost에서만 수신)로 설정됩니다.
이 예에서는 값을 0.0.0.0으로 변경하여 모든 IPv4 인터페이스에서 수신하도록 MySQL 서버를 설정합니다.
# mysqld.cnf
bind-address = 0.0.0.0
# skip-networking
건너뛰기 네트워킹이 포함된 줄이 있는 경우 줄의 맨 앞에 #를 추가하여 삭제하거나 주석을 추가합니다.
MySQL 8.0 이상에서는 bind-address 지시어가 없을 수 있습니다. 이 경우 [mysqld] 섹션 아래에 추가합니다.
완료되면 MySQL 서비스를 다시 시작하여 변경 내용을 적용합니다. 루트 또는 sudo 권한이 있는 사용자만 서비스를 재시작할 수 있습니다.
Debian 또는 Ubuntu에서 MySQL 서비스를 다시 시작하려면 다음을 입력합니다.
sudo systemctl restart mysql
CentOS와 같은 RedHat 기반 분포에 대해 설명하고 서비스 실행을 다시 시작합니다.
sudo systemctl restart mysqld
원격 시스템에서 사용자에게 액세스 권한을 부여
다음 단계는 원격 사용자에게 데이터베이스에 대한 액세스를 허용하는 것입니다.
다음을 입력하여 MySQL 서버에 루트 사용자로 로그인합니다.
sudo mysql
이전 네이티브 MySQL 인증 플러그인을 사용하여 루트로 로그인하는 경우 아래 명령을 실행하고 메시지가 표시되면 암호를 입력합니다.
mysql -uroot -p
MySQL 셸 내부에서 GRANT 문을 사용하여 원격 사용자에게 액세스 권한을 부여합니다.
GRANT ALL ON database_name.* TO user_name@'ip_address' IDENTIFIED BY 'user_password';
database_name은 사용자가 연결할 데이터베이스의 이름입니다.
user_name은 MySQL 사용자의 이름입니다.
ip_address는 사용자가 연결할 IP 주소입니다. 사용자가 모든 IP 주소에서 연결할 수 있도록 허용하려면 %를 사용하십시오.
user_password는 사용자 암호입니다.
예를 들어, IP가 10.8.0.5인 클라이언트 시스템에서 암호가 my_passwd인 foo라는 사용자에게 데이터베이스 dbname에 대한 액세스 권한을 부여하려면 다음을 실행합니다.
GRANT ALL ON dbname.* TO foo@'10.8.0.5' IDENTIFIED BY 'my_passwd';
방화벽을 구성
마지막 단계는 원격 컴퓨터의 포트 3306(MySQL 기본 포트)에서 트래픽을 허용하도록 방화벽을 구성하는 것입니다.
입타블스
iptables를 방화벽으로 사용하는 경우 아래 명령을 사용하면 인터넷의 모든 IP 주소에서 MySQL 포트에 액세스할 수 있습니다. 이것은 매우 불안정합니다.
sudo iptables -A INPUT -p tcp --destination-port 3306 -j ACCEPT
특정 IP 주소에서 액세스를 허용합니다.
sudo iptables -A INPUT -s 10.8.0.5 -p tcp --destination-port 3306 -j ACCEPT
UFW
UFW는 Ubuntu의 기본 방화벽 도구입니다. 인터넷의 모든 IP 주소(매우 안전하지 않음)에서 액세스를 허용하려면 다음을 실행합니다.
sudo ufw allow 3306/tcp
특정 IP 주소에서 액세스를 허용합니다.
sudo ufw allow from 10.8.0.5 to any port 3306
방화벽D
방화벽D는 CentOS의 기본 방화벽 관리 도구입니다. 인터넷의 모든 IP 주소(매우 안전하지 않음)에서 액세스를 허용하려면 다음을 입력합니다.
sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --reload
특정 포트의 특정 IP 주소에서 액세스를 허용하려면 새 방화벽D 영역을 만들거나 리치 규칙을 사용할 수 있습니다.
mysqlzone이라는 새 영역을 만듭니다.
sudo firewall-cmd --new-zone=mysqlzone --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --permanent --zone=mysqlzone --add-source=10.8.0.5/32
sudo firewall-cmd --permanent --zone=mysqlzone --add-port=3306/tcp
sudo firewall-cmd --reload
변경 사항을 확인
원격 사용자가 MySQL 서버에 연결할 수 있는지 확인하려면 다음 명령을 실행합니다.
mysql -u user_name -h mysql_server_ip -p
# ERROR 2003 (HY000): Can't connect to MySQL server on '10.8.0.5' (111)"
# "ERROR 1130 (HY000): Host ‘10.8.0.5’ is not allowed to connect to this MySQL server"
여기서 user_name은 액세스 권한을 부여한 사용자의 이름이고 mysql_server_ip는 MySQL 서버가 실행되는 호스트의 IP 주소입니다.
모든 설정이 올바르게 되어 있으면 원격 MySQL 서버에 로그인할 수 있습니다.
다음과 같은 오류가 발생하면 포트 3306이 열려 있지 않거나 MySQL 서버가 IP 주소를 수신하지 않는 것입니다.
아래 오류는 로그인하려는 사용자에게 원격 MySQL 서버에 액세스할 수 있는 권한이 없음을 나타냅니다.
결론
기본적으로 가장 널리 사용되는 오픈 소스 데이터베이스 서버인 MySQL은 localhost에서만 들어오는 연결을 수신합니다.
MySQL 서버에 대한 원격 연결을 허용하려면 다음 단계를 수행해야 합니다.
모든 인터페이스 또는 특정 인터페이스에서 수신하도록 MySQL 서버를 구성합니다.
원격 사용자에게 액세스 권한을 부여합니다.
방화벽에서 MySQL 포트를 엽니다.
'SW > MySQL' 카테고리의 다른 글
그래프, 네이티브 그래프 데이터베이스 소개, 개념, 설명 (0) | 2023.06.05 |
---|---|
MySQL : 데이터베이스 : 테이블 정보 나열(보기) 방법, 예제, 명령어 (0) | 2022.03.21 |
MySQL : MySQL 유저 계정 삭제 방법, 예제, 명령어 (0) | 2021.12.07 |
Mysql : MySQL 버전 확인 방법, 예제, 명령어 (0) | 2021.11.08 |
MySQL : 사용자 계정 생성, 권한 부여하는 방법, 예제, 명령어 (0) | 2021.01.23 |