원격 데이터베이스 접속: 인터넷 전체에 노출하지 않는 방법
작업 컴퓨터에서 VDS의 데이터베이스에 접속하는 두 가지 방법인 SSH 터널과 제한을 둔 포트 개방을 비교하고, 무엇을 선택하고 어떻게 확인하는지 설명해요.
업데이트 2026년 8월 23일
0.0.0.0에서 수신 대기하고 비밀번호가 root인 데이터베이스는 첫 스캔까지만 버팁니다. 그리고 전체 주소 대역은 끊임없이 스캔되고 있어요. 동시에 노트북에서 클라이언트로 데이터베이스에 접속하는 것은 편리하고 자주 필요하기도 합니다. 방법은 두 가지가 있고, 그중 하나만 단점이 없어요.
방법 1: SSH 터널 (권장)
데이터베이스는 127.0.0.1에 바인딩된 채로 두고, 외부에는 SSH 외에는 아무것도 노출되지 않아요. 본인 컴퓨터에서:
ssh -L 5433:127.0.0.1:5432 root@YOUR_ADDRESS -N
ssh -L 3307:127.0.0.1:3306 root@YOUR_ADDRESS -N
이제 DBeaver, TablePlus 또는 psql에서 127.0.0.1:5433으로 접속하세요. 데이터베이스 입장에서는 로컬 연결로 보입니다.
대부분의 클라이언트는 터널을 스스로 설정할 수 있어요. 연결 설정에 “SSH” 탭이 있습니다. 제어판 /hosting/vds/m/<id>의 “Overview”에서 확인한 머신 주소와 본인의 키를 지정하세요.
이 방법의 장점은 데이터베이스나 방화벽 설정에서 아무것도 바꿀 필요가 없다는 점이에요.
방법 2: 제한을 둔 열린 포트
이것은 최후의 수단이에요. 고정 주소를 가진 외부 서비스가 접속할 때만 쓰세요. 아래의 모든 단계는 필수입니다:
ufw allow from 203.0.113.10 to any port 5432 proto tcp
PostgreSQL의 경우: listen_addresses = '*'와 pg_hba.conf의 hostssl all all 203.0.113.10/32 scram-sha-256 줄이에요. MySQL의 경우: bind-address = 0.0.0.0과 특정 주소에 바인딩된 사용자입니다:
CREATE USER 'app'@'203.0.113.10' IDENTIFIED BY 'long-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app'@'203.0.113.10';
TLS 없이는 이런 연결이 데이터를 평문으로 전송해요. 출발지를 지정하지 않은 ufw allow 5432가 바로 “인터넷 전체에 여는 것”이에요.
확인
다른 머신에서:
nmap -Pn -p 3306,5432,6379,27017 YOUR_ADDRESS
예상되는 응답은 모든 포트에서 filtered 또는 closed예요. 로컬에서는 무엇이 어디에서 수신 대기하는지 확인하세요:
ss -tulpn | grep -E '3306|5432|6379'
흔한 실수
| 증상 | 원인 |
|---|---|
| 클라이언트가 터널을 통해 접속되지 않음 | 로컬 포트가 사용 중 — 다른 포트를 고르세요 |
Host ... is not allowed to connect | MySQL 사용자가 localhost에 바인딩되어 있음 |
no pg_hba.conf entry for host | 본인 주소에 대한 규칙이 없음 |
| 포트는 열려 있는데 응답이 없음 | 데이터베이스가 127.0.0.1에서만 수신 대기 중 |
| 되다가 멈춤 | 제공자가 동적 주소를 부여함 — 터널을 써야 하는 또 하나의 이유 |
머신에는 IPv6도, 두 번째 주소도 없어요. “Overview”에 있는 단일 공인 IPv4 주소에 대해 모든 규칙을 작성하세요. 두 개의 스택으로 혼동할 일이 없어요.