리눅스

MySQL 외부 접속 방법 및 허용을 위한 설정

MySQL 외부 접속 방법


MySQL(또는 MariaDB)에서 외부 접속을 허용할 수 있습니다. 외부 접근을 허용하게 되면 로컬 호스트가 아닌 외부 서버 또는 프로그램 등에서 데이터베이스에 접근할 수 있습니다. 예를 들어 특정 데이터베이스 서버를 다른 웹 서버에서 참조해야 될 일이 있을 경우 외부 접근을 허용해야 할 수 있습니다.

 

진행하기에 앞서 외부 접속 이전에 로컬 호스트에서의 데이터베이스 접속이 원활한지 확인해 볼 필요가 있습니다.

  • mysql 명령어를 이용하여 로컬 호스트에서 접속에 성공하는지 확인
  • 3306 포트가 열려있는지 확인

다음으로 mysql 설정 파일에서 외부 접속에 대한 차단 여부가 지정되지는 않았는지 확인해야 합니다.

/etc/my.cnf 파일을 열어 (my.cnf 파일의 위치는 MySQL, MariaDB 마다 다를 수 있습니다.) 아래 내용이 있는지 확인해주세요.

[mysqld]
bind-address=0.0.0.0

만약 bind-address 문구가 없다면 건너뛰셔도 되지만, 해당 항목이 존재한다면 bind-address 앞에 # 을 붙여 주석 처리해주시면 됩니다.

[mysqld]
#bind-address=0.0.0.0

만약 위 방법으로 진행되지 않는다면, 주석 처리를 해제한 후에는 정상적으로 동작하는지 확인해봐야 합니다.

 

이제 본격적으로 외부 접근을 허용해보도록 하겠습니다.

방법은 간단합니다. 먼저 원격 서버에 접속하여 mysql 명령어를 사용하여 데이터베이스에 접속합니다. (또는 Mysql Workbench와 같은 프로그램을 사용하여 접속하셔도 됩니다.)

$ mysql -uroot -p
Enter password: [패스워드 입력]
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 106
Server version: 10.1.33-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

 

접속에 성공하면 아래 명령어로 외부 접속을 허용할 유저를 생성합니다.

참고 : root 권한으로 외부 접속을 허용하는 방법도 있지만 보안상 새로운 유저를 생성하는 것을 권장합니다.

MariaDB [(none)]> create user '[UserName]'@'[HostName]' identified by '[Password]';

예를 들어 유저명이 hello, 호스트명이 myhost인 경우 아래와 같이 입력해주시면 됩니다.

create user ‘hello’@’myhost’ identified by ‘p@ssw0rd’;

여기에서 HostName에 들어가는 규칙에 따라 권한이 달라지는데 모든 호스트를 허용할 경우 ‘%’를, 로컬 호스트만 허용할 경우 ‘localhost’를 입력합니다. 아래 예시를 참조하세요.

# 모든 호스트 접속을 허용
MariaDB [(none)]> create user 'hello'@'%' identified by '[Password]';
# 로컬 호스트 접속만 허용
MariaDB [(none)]> create user 'hello'@'localhost' identified by '[Password]';
# 특정 IP에 대한 접속 허용
MariaDB [(none)]> create user 'hello'@'192.168.1.123' identified by '[Password]';
MariaDB [(none)]> create user 'hello'@'192.168.%' identified by '[Password]';

 

다음으로 생성된 유저에 대한 접근 권한을 설정합니다.

MariaDB [(none)]> grant all privileges on [DatabaseName].* to '[UserName]'@'[HostName]';

특정 DB(또는 전체 DB)에 대한 전체 권한을 부여하는 명령입니다. 유저명과 호스트명은 위에서 설정한 유저와 호스트 정보를 그대로 사용합니다. 데이터베이스명이 mydb인 경우 아래와 같이 입력해주시면 됩니다.

grant all privileges on mydb.* to ‘hello’@’myhost’;

모든 데이터베이스에 대한 접근을 허용할 경우 mydb 대신 * 을 넣어주시면 됩니다.

 

위 내용이 모두 적용 되었는지 확인하려면 아래 명령어로 유저와 허용된 호스트를 확인할 수 있습니다.

MariaDB [(none)]> SELECT User, Host FROM mysql.user;
+-------+-------------------+
| User  | Host              |
+-------+-------------------+
| hello | 192.168.1.123     |
| hello | 127.0.0.1         |
| root  | 127.0.0.1         |
| root  | ::1               |
+-------+-------------------+
4 rows in set (0.00 sec)

 

이제 모든 설정이 적용되었다면, 변경된 접근 권한을 적용해야 합니다. 서비스를 재시작하거나 규칙을 다시 로드합니다.

// MySQL 또는 MariaDB에서 권한 초기화
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

// MySQL 또는 MariaDB 서비스를 재시작
$ sudo service mysql restart
또는
$ sudo systemctl restart mysql

위 과정이 모두 완료되었다면, 외부 프로그램 등을 이용하여 데이터베이스에 접근할 수 있는지 확인하시면 됩니다.

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

View Comments

Recent Posts

[iOS] Xcode ‘You do not have required contracts to perform an operation’ 해결

Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…

1개월 ago

[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 해결

INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…

7개월 ago

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

9개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

9개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

9개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

9개월 ago