MariaDB 외부 접속 허용하기

By | 2024-01-22

MariaDB와 MySQL은 최초 설치시 기본적으로 외부접속을 허용하지 않는다. 하지만 외부에서 접속하기 위해 사용하는 TCP/3306 포트를 아예 Bind하지 않는 것은 아니었다. MariaDB 서버의 DBMS 데몬이 TCP/3306을 기본적으로 Bind한 다음 LISTEN 상태를 유지하고 있었다. 그런 다음 DBMS의 사용자 계정에 대해 외부에서의 접속을 허용할 것인지 권한 설정을 통해 통제하고 있었다. 그런데 언제부턴가 MySQL이나 MariaDB를 설치하면 기본적으로 TCP/3306 Bind하지 않고 있다. 심지어 localhost의 TCP/3306도 바인드하지 않는다.

그래서 아무리 mysql.user 테이블에 있는 계정에 외부접속 허용 권한을 부여해도 접속이 되지 않는 현상이 발생한다.

MariaDB 서버 버전 확인

TCP/3306을 바인드하지 않는 MariaDB서버의 버전이다. 어떤 버전부터 기본 설정이 변경되었는지는 알 수 없지만 지금 테스트를 위해 설치한 MariaDB서버의 버전에서는 TCP/3306을 바인드하지 않고 있다.

$ mariadb --version

MariaDB의 버전은 10.5.22 다. mysql이라면 mariadb라는 명령 대신 mysql 명령을 사용하면 되지 않을까?

MariaDB TCP 포트 바인드 확인

만약 MariaDB 설치 후 아무런 설정도 변경하지 않았는데 netstat 명령을 실행해 다음과 같이 아무런 내용도 출력되지 않거나 TCP가 아닌 TCP6 만 한줄 출력된다면 MariaDB서버가 TCP 접속을 통한 외부에서의 접속을 원천적으로 허용하고 있지 않는 것이다.

$ netstat -an | grep 3306

my.cnf 파일 찾기

MySQL 이나 MariaDB가 특정 TCP 포트를 통해 외부에서의 접속을 가능하게 하려면 my.cnf을 찾아 [mysqld] 라는 섹션에 2 라인을 넣어줘야 한다. 그러기 위해서는 먼저 my.cnf 파일을 찾아야 한다.

일반적으로 my.cnf 파일은 /etc 디렉토리에 위치한다. 하지만 설치 방법에 따라 다른 경로에 존재할 수도 있다. 최근에는 my.cnf 을 여러개의 파일로 분리하여 특정 디렉토리에 넣어두는 경우도 있다. MariaDB 10.x 버전이 그러했다.

위 화면처럼 /etc 디렉토리의 my.cnf 파일을 보면 /etc/my.cnf.d 디렉토리를 Include 한다고 선언되어 있고 그 외에는 아무런 내용도 없다. 이런 경우 /etc/my.cnf.d 디렉토리에 다음과 같이 여러개의 파일로 설정 내용이 분산 저장되어 있음을 알 수 있다.

Mariadb의 TCP 포트 바인드 설정

MariaDB나 MySQL이 특정 TCP 포트를 바인드한 다음 외부에서의 접속을 가능하게 하려면 mariadb-server.cnf 파일을 수정해야 한다. 만약 my.cnf에 [mysqld] 섹션이 있다면 my.cnf에 직접 추가해도 된다.

vi 명령 등으로 mariadb-server.cnf 파일을 열고 다음의 두 줄을 [mysqld] 섹션에 추가한다.

bind-address=0.0.0.0
port=4406

첫 번째 라인은 서버에 부여되어 있는 외부 접속이 가능한 모든 IP를 통해 외부에서 접속할 수 있다는 의미다. 서버에 랜 인터페이스가 다수일 때 특정 IP를 통해서만 외부에서 접속하게 하고 싶다면 해당 IP만 Bind 하도록 설정하면 된다.

두 번째 라인은 Listen할 TCP 포트번호다. 기본적으로는 3306이나 위 화면에서는 4406으로 변경한 사례다. 보안을 위해 이 포트는 변경하는 것을 권장한다. 특히 인터넷에 개방되어 있는 DB서버라면 특히~~!!

MariaDB 다시 시작하기

위의 두 라인을 mariadb-server.cnf 파일에 추가했다면 저장하고 다음의 명령으로 MariaDB나 MySQL을 재실행하면 된다. 운영체제의 종류에 따라 systemctl 대신 service 명령을 사용해야 할 수도 있다.

$ sudo systemctl restart mariadb

이렇게 하면 앞에서 실행했던 netstat -an | grep [포트번호] 명령으로 확인했을 때 port로 지정한 번호가 포함된 한 줄이 출력되어야 한다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다