리눅스에서 돌아가고 있는 MySQL DB 서버를 외부에서 접속하고 싶다.
애초에 그러려고 리눅스 DB 서버를 만든 것이니까 말이다.
윈도우에서는 생각보다 방화벽을 풀어주고, 인바운드 규칙을 만들어주는 과정이 꽤나 귀찮았는데
리눅스에서는 명령어로만 하니 오히려 더 쉽게 되는 느낌을 받았다.
오늘은 리눅스의 데이터베이스 서버를 외부에서도 접속할 수 있도록 하는 방법에 대해 다뤄보려 한다.

여러 네트워크에서 접속할 수 있도록 MySQL 설정 변경하기

MySQL 설정에는 기본적으로 TCP/IP 연결을 단일 주소(로컬 호스트, 127.0.0.1)에 바인딩되어 있다.
즉, 내 컴퓨터 외엔 접속이 안된다는 소리이다.
이 단일 연결로 되어 있는 바인딩을 풀어주어야 한다.
MySQL 설정 파일을 열어보자.

sudo nano /etc/mysql/mysql.conf.d/mysql.cnf

# 만약 없다면 아래 경로의 파일도 확인
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
ShellScript

파일을 조금 내리다 보면, bind-address 설정 부분이 있다.
해당 부분 앞에 “#” 문자를 넣어 주석으로 처리하고 저장한다.

‘bind-address’는 요청을 수신한 네트워크를 지정하는 설정인데,
이 것을 ‘127.0.0.1’로 해둔다면 MySQL 서버를 로컬 내에서만 사용하겠다는 의미이다.
즉, 주석 처리를 하지 않을 경우에는 외부에서 접속이 불가능하다.

저장은 Ctrl+X, Y, Enter를 차례로 입력하면 된다.
(이 글에서는 포트 번호를 ‘4306’으로 바꿨지만, 기본 포트는 ‘3306‘이다.)

리눅스에서 mysql의 설정 구성 파일인 mysqld.cnf 파일에 바인딩 되어 있는 단일 주소를 주석 처리한 예시 이미지

외부에서 MySQL을 접속할 수 있는 사용자 생성하기

외부 환경에서 MySQL에 로그인할 때,
루트 계정은 기본적으로 로컬 내에서만 접속을 허용하도록 되어 있기 때문에 외부에서 루트 계정에 바로 접속이 불가능하다.
이 글에서는 원격 접속 전용 사용자를 만들어 사용할 예정이다.
우선 사용자를 만들기 위해 MySQL에 접속하자.

sudo mysql -u root -p
ShellScript

원격 접속용 사용자를 생성하는 쿼리이다.
자신의 환경에 맞게 입력하여 사용자를 생성하자.

USE mysql;
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';
FLUSH PRIVILEGES;
SQL
  • 'username'@'%'  : username은 사용자의 이름, % 기호는 모든 IP 접근 허용 즉, 원격 접속을 허용하는 것을 의미한다. 보안을 위해 특정 IP로 제한할 수 있다. 그럴 땐 % 기호가 아닌 아이피를 입력하면 된다.
  • password  : 원격 접속용 사용자의 비밀번호를 입력한다.
  • *.*  : 데이터베이스의 모든 권한을 허용하겠다는 의미이다. 만약 특정 데이터베이스에 대한 모든 권한만 허용하고 싶다면, 데이터베이스명.*을 입력하면 된다.

만약, 새로운 사용자 생성 없이 root 계정을 이용하고 싶다면 ALTER 키워드를 이용하여 사용자의 정보를 수정하면 된다.

USE mysql;
UPDATE user SET host = '%' WHERE user = 'root' AND host = 'localhost';
FLUSH PRIVILEGES;
SQL

사용자가 정상적으로 생성되었는지, HOST 가 외부에서 접속 가능하도록 '%' 로 설정되었는지 확인해보자.

SELECT user, host FROM mysql.user;
SQL

리눅스 MySQL에서 사용자의 정보를 조회하는 예시 이미지

예시용으로 ‘eunbyeol’ 사용자를 생성하였다. root와 함께 이제 외부에서 접속이 가능하다.
MySQL을 나와 쉘로 이동하자. (Ctrl+Z를 누르면 된다.)
변경 사항을 적용하기 위해 MySQL 서비스를 재시작하자.

sudo systemctl restart mysql
ShellScript

리눅스 운영체제의 방화벽에서 MySQL 허용하기

MySQL의 포트를 외부 접속이 가능하도록 허용해주어야 한다.
기본적으로 MySQL의 포트는 3306이다.
만약 MySQL의 포트를 변경해서 사용하고 싶거나,
기본 포트를 사용하지 않는데 기억이 나지 않는다면 아래의 글을 참고하자.

✅ 같이 보면 좋은 글

방화벽에 MySQL을 허용해주는 명령어는 아래와 같다. 자신이 사용하는 방화벽에 포트 번호를 추가해주면 된다.
자신의 방화벽이 무엇인지 모르겠다면 리눅스 ubuntu를 사용할 경우라면
운영체제가 ufw를 기본 방화벽으로 사용하고 있으니 ufw를 이용하면 된다.

# UFW를 사용하는 경우
sudo ufw enable # UFW 활성화
sudo ufw allow 3306/tcp # MySQL 포트 추가
sudo systemctl restart ufw # 설정을 적용하도록 방화벽 재시작

# iptables를 사용하는 경우
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
ShellScript

이 글에서는 기본 방화벽인 ufw를 이용하여 방화벽에서 MySQL을 사용할 수 있도록 허용해주었다.
확인해보자.

sudo ufw status
# ------------------------------------------------------ #
Status: active

To                         Action      From
--                         ------      ----
3306/tcp                   ALLOW       Anywhere
4306                       ALLOW       Anywhere
4306/tcp                   ALLOW       Anywhere
3306/tcp (v6)              ALLOW       Anywhere (v6)
4306 (v6)                  ALLOW       Anywhere (v6)
4306/tcp (v6)              ALLOW       Anywhere (v6)
ShellScript

모든 설정이 끝났다. 이제 외부에서도 접속이 가능한 상태가 되었다.

MySQL Workbench를 이용하여 새로 구축한 리눅스 DB 서버의 정보를 입력하고, 접속 시도를 해보았다.

MySQL Workbench에서 새로 구축한 리눅스 MySQL DB 서버의 정보를 입력하는 예시 이미지

접속이 잘 되는 것을 볼 수 있다.
이제 이 MySQL 서버를 외부에서 가지기 놀기 더 수월해졌다! ‘ㅅ’

MySQL Workbench에서 리눅스 DB 서버의 접속이 성공되었다고 출력되는 알림 메시지 예시

❗만약 접속이 되지 않는다면?

만약 MySQL의 Workbench에서 접속이 되지 않고 아래와 같이 뜰 경우가 있다.

Failed to Connect to MySQL at ~ with user
Unable to connect to localhost
SQL
  1. 리눅스 DB 서버를 재부팅해보자. MySQL 설정과 서비스가 적용이 안되었을 수도 있다.
  2. 접속하는 유저의 호스트가 localhost 인지 외부 접속이 가능한 % 인지 확인해보자. localhost 는 외부 접속이 안된다. 본문을 다시 읽어서 호스트를 변경하자.
  3. MySQL 포트 번호를 착각했을 수도 있다. MySQL의 설정 파일에서 설정한 포트를 확인하자.
  4. 방화벽에서 MySQL에서 사용하는 포트를 허용하지 않을 경우, 외부에서 접속을 할 수가 없다. 설정한 MySQL의 포트를 허용해주자.
  5. 만약 4번까지 해봤는데도 안된다면, 공유기를 사용하고 있을 가능성이 매우 높다. 공유기에서 포트포워딩을 설정해주어야 한다.
    ✅ 관련글 : MySQL – 외부에서 로컬 DB 서버 접속하기 (DB 서버 구축)외부 포트 허용하기 (포트 포워딩) 챕터 참고

sudo systemctl restart ufw

Similar Posts

댓글 남기기