Ubuntu 24.04에 MySQL 8.0 설치하고 외부 접속 허용하는 방법

Ubuntu 24.04 서버에 MySQL 8.0을 설치하고, 기본 보안 설정과 외부 접속용 사용자·데이터베이스를 만든 뒤, 내 PC에서만 접속할 수 있게 외부 접속 설정과 방화벽까지 설정합니다.

Ubuntu 24.04MySQL 8.0x86_64약 15분

검증된 문서입니다

클라우드 서버를 생성하여 이 문서의 명령을 처음부터 끝까지 그대로 실행하고 확인한 문서입니다.

운영체제
Ubuntu 24.04.5 LTS · x86_64
설치 버전
MySQL 8.0.46 (8.0.46-0ubuntu0.24.04.4)
테스트 서버
DigitalOcean · 1 vCPU / 1 GB RAM / 25 GB SSD (s-1vcpu-1gb, sgp1)
마지막 확인
2026-10-09

이 문서에는 제휴 링크가 포함되어 있습니다. 링크를 통해 가입하면 코드샌드가 일정 수수료를 받을 수 있으며, 문서 내용과 평가에는 영향을 주지 않습니다.

Ubuntu 24.04 서버에 MySQL 8.0을 설치하고, 기본 보안 설정과 외부 접속용 사용자·데이터베이스를 만든 뒤, 내 PC에서만 접속할 수 있게 외부 접속 설정과 방화벽까지 설정합니다.

1. 준비물

  • Ubuntu 24.04 LTS 서버 1대 (메모리 1GB 이상 권장)
  • sudo 권한이 있는 계정으로 SSH 접속
  • 외부에서 접속할 PC의 공인 IP 주소 (예: 203.0.113.10)

서버가 없다면 DigitalOcean의 가장 작은 Droplet(1 vCPU · 1GB)을 생성해 보세요. 이 Droplet으로도 충분히 MySQL 8.0을 설치할 수 있습니다. 이 문서의 모든 과정은 Droplet(1 vCPU · 1GB 메모리 · 25GB SSD · Ubuntu 24.04 · 싱가포르)으로 서버를 생성해 확인했습니다.

2. MySQL 설치

Ubuntu 24.04 기본 저장소에는 MySQL 8.0이 포함되어 있습니다. 패키지 목록을 갱신한 뒤 설치합니다.

sudo apt update
sudo apt install -y mysql-server

설치가 끝나면 설치된 버전을 확인합니다.

mysql --version
mysql  Ver 8.0.46-0ubuntu0.24.04.4 for Linux on x86_64 ((Ubuntu))

3. 서비스 상태 확인

설치가 끝나면 mysql 서비스가 자동으로 시작됩니다.

sudo systemctl status mysql --no-pager
● mysql.service - MySQL Community Server
     Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; preset: enabled)
     Active: active (running) since Fri 2026-10-09 11:41:25 UTC; 17s ago

어느 주소와 포트에서 접속을 받고 있는지 확인합니다.

sudo ss -tlnp | grep mysqld
LISTEN 0      70         127.0.0.1:33060      0.0.0.0:*    users:(("mysqld",pid=3339,fd=21))
LISTEN 0      151        127.0.0.1:3306       0.0.0.0:*    users:(("mysqld",pid=3339,fd=23))

3306은 일반 MySQL 클라이언트가 접속하는 포트이고, 33060은 MySQL Shell 등이 사용하는 X 프로토콜 포트입니다. 두 포트 모두 127.0.0.1에서만 열려 있어 지금은 서버 안에서만 접속할 수 있습니다. 이 문서에서는 3306 포트만 외부에 엽니다.

이제 MySQL에 접속되는지 확인합니다. 설치 직후에는 sudo mysql로 비밀번호 없이 root로 접속할 수 있습니다.

sudo mysql -e "SELECT VERSION();"
+-------------------------+
| VERSION()               |
+-------------------------+
| 8.0.46-0ubuntu0.24.04.4 |
+-------------------------+

비밀번호 없이 접속되는 이유는 MySQL 사용자 목록에서 확인할 수 있습니다.

sudo mysql -e "SELECT user, host, plugin FROM mysql.user;"
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | auth_socket           |
+------------------+-----------+-----------------------+

MySQL의 root는 auth_socket 방식으로 인증합니다. auth_socket은 비밀번호 대신 MySQL에 접속한 리눅스 계정 이름을 확인하는 방식이라, 리눅스 root 권한(sudo)으로 실행한 경우에만 MySQL의 root로 접속할 수 있습니다.

4. 기본 보안 설정

MySQL에는 기본 보안 설정을 질문 형식으로 진행하는 mysql_secure_installation 도구가 있습니다. 이 도구는 비밀번호 검사 기능 설정, root 비밀번호 설정, 익명 사용자 삭제, 외부에서 접속할 수 있는 root 삭제, test 데이터베이스 삭제를 차례로 묻습니다. 이 문서에서는 이 중 사용자와 데이터베이스를 정리하는 작업을 SQL로 직접 실행합니다. root는 auth_socket을 사용하므로 비밀번호를 설정하지 않습니다.

먼저 현재 데이터베이스 목록을 확인합니다.

sudo mysql -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

Ubuntu 패키지로 설치하면 위 사용자 목록과 데이터베이스 목록처럼 익명 사용자와 test 데이터베이스가 없고, root는 localhost에서만 접속할 수 있습니다. 다른 방법으로 설치했거나 설정을 바꾼 적이 있다면 아래 명령으로 같은 상태를 만듭니다. 이미 위와 같은 상태라면 실행해도 바뀌는 것이 없고, 출력도 없습니다.

sudo mysql -e "DELETE FROM mysql.user WHERE User='';"
sudo mysql -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
sudo mysql -e "DROP DATABASE IF EXISTS test;"
sudo mysql -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';"
sudo mysql -e "FLUSH PRIVILEGES;"

첫 줄은 이름이 없는 익명 사용자를, 둘째 줄은 서버 밖에서 접속할 수 있는 root를 삭제합니다. 셋째·넷째 줄은 test 데이터베이스와 그 접근 권한을 삭제하고, 마지막 줄은 바뀐 권한을 바로 적용합니다.

5. 사용자와 데이터베이스 만들기

애플리케이션에서는 관리자 계정인 root 대신 전용 사용자로 접속하는 것이 안전합니다. 데이터베이스 appdb와 사용자 appuser를 만듭니다. 비밀번호는 반드시 직접 정한 값으로 바꾸고, 203.0.113.10은 접속할 PC의 공인 IP로 바꾸세요.

sudo mysql -e "CREATE DATABASE appdb;"
sudo mysql -e "CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'change-this-password';"
sudo mysql -e "CREATE USER 'appuser'@'203.0.113.10' IDENTIFIED BY 'change-this-password';"
sudo mysql -e "GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost', 'appuser'@'203.0.113.10';"

MySQL은 사용자를 사용자 이름@접속하는 주소로 구분합니다. 'appuser'@'localhost'는 서버 안에서 접속할 때, 'appuser'@'203.0.113.10'은 내 PC에서 접속할 때 사용됩니다. 두 사용자 모두 appdb의 모든 권한만 가지고, 다른 데이터베이스에는 접근할 수 없습니다.

사용자가 만들어졌는지 확인합니다.

sudo mysql -e "SELECT user, host, plugin FROM mysql.user WHERE user = 'appuser';"
+---------+----------------+-----------------------+
| user    | host           | plugin                |
+---------+----------------+-----------------------+
| appuser | 203.0.113.10   | caching_sha2_password |
| appuser | localhost      | caching_sha2_password |
+---------+----------------+-----------------------+

서버 안에서 appuser로 접속해 봅니다. -p 옵션은 비밀번호를 입력받는다는 뜻이고, 마지막의 appdb는 접속할 데이터베이스입니다.

mysql -u appuser -p appdb -e "SELECT CURRENT_USER(), DATABASE();"
Enter password:
+-------------------+------------+
| CURRENT_USER()    | DATABASE() |
+-------------------+------------+
| appuser@localhost | appdb      |
+-------------------+------------+

6. 외부 접속 허용

기본 설정은 localhost 접속만 허용합니다. 외부 접속을 허용하려면 /etc/mysql/mysql.conf.d/mysqld.cnf의 bind-address를 0.0.0.0으로 바꿉니다. 0.0.0.0은 서버의 모든 IPv4 주소에서 접속을 받는다는 뜻입니다.

sudo sed -i 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
grep -n 'bind-address' /etc/mysql/mysql.conf.d/mysqld.cnf
31:bind-address = 0.0.0.0
32:mysqlx-bind-address	= 127.0.0.1

32번 줄의 mysqlx-bind-address는 X 프로토콜(33060 포트) 설정이므로 그대로 둡니다. MySQL을 다시 시작하고 3306 포트가 외부 주소에서도 열렸는지 확인합니다. 0.0.0.0:3306이 보이면 정상입니다.

sudo systemctl restart mysql
sudo ss -tlnp | grep mysqld
LISTEN 0      70         127.0.0.1:33060      0.0.0.0:*    users:(("mysqld",pid=4048,fd=21))
LISTEN 0      151          0.0.0.0:3306       0.0.0.0:*    users:(("mysqld",pid=4048,fd=23))

7. 방화벽(ufw) 설정

MySQL 설정과 별도로 방화벽에서도 내 PC의 IP만 3306 포트에 접속할 수 있게 허용합니다. 방화벽을 켜기 전에 반드시 SSH를 먼저 허용하세요. SSH를 허용하지 않고 방화벽을 켜면 서버 접속이 끊어집니다.

sudo ufw allow OpenSSH
sudo ufw allow from 203.0.113.10 to any port 3306 proto tcp
sudo ufw --force enable
sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
3306/tcp                   ALLOW       203.0.113.10
OpenSSH (v6)               ALLOW       Anywhere (v6)

8. 내 PC에서 접속 확인

PC에 mysql 클라이언트가 없다면 Docker로 MySQL 클라이언트를 실행해 접속할 수 있습니다. 203.0.113.20은 서버의 IP로 바꾸세요. --rm 옵션을 붙였기 때문에 명령이 끝나면 컨테이너는 자동으로 삭제됩니다. -it는 비밀번호를 입력할 수 있도록 터미널을 연결하는 옵션입니다.

docker run --rm -it mysql:8.0 mysql -h 203.0.113.20 -u appuser -p appdb -e "SELECT CURRENT_USER(), DATABASE();"
Enter password:
+------------------------+------------+
| CURRENT_USER()         | DATABASE() |
+------------------------+------------+
| appuser@203.0.113.10   | appdb      |
+------------------------+------------+

appuser@ 뒤에 내 PC의 IP가 표시되면 외부 접속이 정상입니다. 접속이 암호화되었는지도 확인합니다.

docker run --rm -it mysql:8.0 mysql -h 203.0.113.20 -u appuser -p appdb -e "SHOW STATUS LIKE 'Ssl_version';"
Enter password:
+---------------+---------+
| Variable_name | Value   |
+---------------+---------+
| Ssl_version   | TLSv1.3 |
+---------------+---------+

TLSv1.3은 접속이 TLS로 암호화되었다는 뜻입니다. MySQL 8.0은 처음 시작할 때 자체 서명 인증서를 만들고, 클라이언트는 서버가 지원하면 암호화된 접속을 사용합니다.

9. 문제 해결

ERROR 1698 (28000): Access denied for user 'root'@'localhost'

MySQL의 root는 auth_socket 방식이라 비밀번호로는 접속할 수 없습니다. 서버에서 sudo mysql로 접속하세요. 애플리케이션이나 외부 도구에서는 5단계에서 만든 appuser를 사용하세요.

ERROR 2003 (HY000): Can't connect to MySQL server on '203.0.113.20:3306' (111)

MySQL이 외부 주소에서 접속을 받지 않고 있다는 뜻입니다. bind-address를 바꾸기 전에 외부에서 접속하면 이 오류가 납니다. 괄호 안의 111은 접속 거부(Connection refused)를 뜻합니다. grep -n 'bind-address' /etc/mysql/mysql.conf.d/mysqld.cnf로 0.0.0.0인지 확인하고, 바꾼 뒤에 sudo systemctl restart mysql을 실행했는지 확인하세요.

ERROR 1045 (28000): Access denied for user 'appuser'@'203.0.113.10' (using password: YES)

비밀번호가 틀렸거나, 접속한 사용자@주소 조합의 사용자가 없다는 뜻입니다. 이 문서의 설정에서 외부 PC로 root에 접속해도 Access denied for user 'root'@'203.0.113.10'로 같은 오류가 납니다. 집이나 회사의 공인 IP가 바뀌었다면 sudo mysql -e "SELECT user, host, plugin FROM mysql.user WHERE user = 'appuser';"로 등록된 주소를 확인하세요.

10. 삭제하기

MySQL과 데이터를 모두 삭제하려면 아래 명령을 실행합니다. 데이터베이스 파일까지 모두 삭제되므로 필요한 데이터는 먼저 mysqldump로 백업하세요.

sudo DEBIAN_FRONTEND=noninteractive apt purge -y 'mysql-*'
sudo apt autoremove -y
sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql

DEBIAN_FRONTEND=noninteractive는 패키지를 삭제하는 동안 설정 질문 화면을 띄우지 않고 기본값으로 진행하는 옵션입니다. 'mysql-*'를 따옴표로 감싼 것은 셸이 *를 파일 이름으로 바꾸지 않고 apt에 그대로 전달하게 하기 위해서입니다. 실행하면 Package 'mysql-server-5.7' is not installed, so not removed처럼 설치되지 않은 패키지 이름이 여러 줄 표시되는데, 이름이 mysql-로 시작하는 패키지를 모두 확인하기 때문이며 정상입니다.

방화벽에 추가한 3306 포트 규칙도 삭제합니다.

sudo ufw delete allow from 203.0.113.10 to any port 3306 proto tcp
Rule deleted

MySQL 패키지가 남아 있지 않은지 확인합니다. 0이 표시되면 모두 삭제된 것입니다.

dpkg -l | grep -c mysql
0

직접 해 보기

서버가 없다면 아래 업체에서 몇 분이면 Ubuntu 서버를 만들 수 있습니다. 이 문서는 DigitalOcean 에서 검증했습니다.