OCI에서 WordPress 서버는 퍼블릭 서브넷에, MySQL은 프라이빗 서브넷에 두는 구성이 많습니다. 프라이빗 서브넷의 MySQL에는 인터넷에서 바로 접속할 수 없으므로 관리용 접속 경로가 따로 필요합니다. 이 글은 이미 SSH로 접속하고 있는 WordPress 서버를 점프 호스트로 삼아, PuTTY의 SSH 터널로 MySQL에 접속하는 방법을 정리합니다.
한눈에 보기
- 경로: 내 PC
127.0.0.1:3307→ (SSH 22) WordPress 서버 → (3306) MySQL 프라이빗 IP - 인터넷에 여는 포트: 기존 SSH(22)뿐입니다. MySQL 3306은 외부에 열지 않습니다.
- 필요한 것: PuTTY,
.ppk개인 키, MySQL 프라이빗 IP, 3306을 허용하는 보안 규칙 - 설정 단계: 준비를 마쳤다면 PuTTY에서 다음 4단계를 진행합니다.
WordPress 서버 구축은 Oracle Cloud로 무료 블로그 시작하기, MySQL HeatWave DB System 구성은 OCI MySQL HeatWave DB System 구성에서 다뤘습니다. 이 글은 2025년 9월 별도 블로그에 올렸던 글을 옮기면서 2026년 10월 기준으로 사실관계를 다시 확인하고 고친 것입니다.
어떤 방법을 쓸까
SSH 터널은 내 PC의 로컬 포트로 들어온 연결을 SSH 연결에 실어 WordPress 서버까지 보내고, WordPress 서버가 그 연결을 MySQL의 3306 포트로 넘겨 주는 방식입니다. 같은 목적에 쓸 수 있는 방법은 세 가지입니다. 요금과 제한은 2026년 10월 Oracle 공식 안내 기준이며, 바뀔 수 있으니 사용 전에 다시 확인하세요.
| 방법 | 추가 비용 | 세션 시간 | 이럴 때 적합 |
|---|---|---|---|
| WordPress 서버를 점프 호스트로 (이 글) | 없음(기존 서버 사용) | 제한 없음(SSH 연결 유지 동안) | 이미 SSH로 관리하는 퍼블릭 서버가 있을 때 |
| OCI Bastion 서비스 | 없음(Oracle 가격표상 무료) | 세션당 최대 3시간 | 퍼블릭 서버 없이 관리형 접속 경로가 필요할 때 |
| 별도 Bastion VM | VM 비용(Always Free 범위 안이면 0) | 제한 없음 | 여러 사람이 쓰는 전용 접속 서버가 필요할 때 |
주의: 점프 호스트 방식에서는 WordPress 서버의 SSH 접근 권한이 곧 DB로 가는 길이 됩니다. WordPress 서버의 SSH 키와 허용 IP를 더 엄격하게 관리해야 합니다.
준비할 것
| 항목 | 내용 |
|---|---|
| PuTTY | PuTTY 공식 배포 페이지에서 받습니다. |
| WordPress 서버 접속 정보 | 공인 IP와 SSH 사용자(Oracle Linux 이미지는 보통 opc) |
| SSH 개인 키 | PuTTY는 .ppk 형식을 씁니다. OCI에서 받은 .pem/OpenSSH 키는 PuTTYgen의 Load → Save private key로 변환합니다. |
| MySQL 접속 정보 | 프라이빗 IP(DB System이라면 콘솔의 엔드포인트 정보)와 DB 사용자 계정 |
| 보안 규칙 | MySQL 쪽 서브넷의 보안 목록 또는 NSG가 WordPress 서버의 프라이빗 IP(또는 서브넷)에서 오는 TCP 3306을 허용해야 합니다. |
PuTTY 터널 설정 4단계
1단계. 세션
Session 화면에서 다음과 같이 입력합니다.
- Host Name:
opc@<WordPress_공인_IP> - Port:
22 - Connection type: SSH
2단계. 개인 키
Connection → SSH → Auth → Credentials의 Private key file for authentication에 변환한 .ppk 파일을 지정합니다. 메뉴 위치는 PuTTY 버전에 따라 조금 다를 수 있습니다.
3단계. 터널
Connection → SSH → Tunnels에서 아래 값을 넣고 Add를 누릅니다.
- Source port:
3307 - Destination:
<MySQL_프라이빗_IP>:3306 - 방향: Local
내 PC에 MySQL이 설치돼 있으면 3306은 이미 쓰고 있을 수 있어서 예시에서는 3307을 씁니다.
4단계. 연결 유지와 저장
Connection 화면의 Seconds between keepalives를 30 정도로 두면 유휴 상태에서 연결이 끊기는 일을 줄일 수 있습니다. Session 화면으로 돌아가 Saved Sessions에 이름(예: wp-mysql-tunnel)을 넣고 Save를 누른 뒤 Open으로 접속합니다.
참고: 터널은 이 PuTTY 창이 열려 있는 동안만 동작합니다. 다음부터는 저장한 세션을 불러와 Open만 누르면 됩니다.
MySQL에 접속하기
PuTTY 창을 연 상태에서 내 PC의 MySQL 클라이언트로 로컬 포트에 접속합니다. 호스트는 localhost 대신 127.0.0.1로 적어야 소켓이 아니라 TCP로 연결됩니다.
mysql -h 127.0.0.1 -P 3307 -u <DB_사용자> -p
접속되면 실제로 원격 서버에 붙었는지 확인합니다. 내 PC의 로컬 MySQL이 아니라 원격 서버의 호스트명과 버전이 나오면 정상입니다.
SELECT @@hostname, @@version;
SHOW DATABASES;
MySQL Workbench를 쓴다면 새 연결의 Hostname에 127.0.0.1, Port에 3307, Username에 DB 사용자를 넣습니다. Workbench 자체의 Standard TCP/IP over SSH 연결 방식을 쓰면 PuTTY 없이도 같은 경로를 만들 수 있습니다.
보안 체크리스트
| 대상 | 확인할 것 |
|---|---|
| SSH(22) | 관리자 IP처럼 필요한 출발지만 허용 |
| MySQL(3306) | WordPress 서버의 프라이빗 IP나 서브넷에서만 허용, 인터넷(0.0.0.0/0)에는 열지 않음 |
| 개인 키 | 암호를 걸고, 본인 계정만 읽을 수 있는 위치에 보관 |
| DB 사용자 | 필요한 권한만 부여, 조회만 할 때는 읽기 전용 계정을 따로 사용 |
| 작업 후 | PuTTY 창을 닫아 터널 종료, 비밀번호를 명령줄이나 스크립트에 직접 적지 않음 |
보안 규칙, 호스트 방화벽, 서비스 리스너를 나눠 접속 문제를 진단하는 방법은 OCI 서버 접속 진단에서 자세히 다룹니다.
연결이 안 될 때
| 증상 | 먼저 볼 것 |
|---|---|
| PuTTY가 서버에 접속하지 못함 | 공인 IP, 22번 허용 출발지, .ppk 키 경로. 터널 이전 단계의 문제입니다. |
| MySQL 클라이언트에서 Connection refused / Lost connection | PuTTY 창이 열려 있는지, Tunnels의 Destination IP·포트, MySQL 쪽 보안 규칙이 WordPress 서버에서 오는 3306을 허용하는지 |
| Access denied | DB 사용자·비밀번호, 그리고 그 사용자가 WordPress 서버의 IP(또는 %)에서 접속하도록 허용돼 있는지 |
| 터널 포트를 열 수 없음 | 내 PC에서 3307을 이미 다른 프로그램이 쓰는지(netstat -ano | findstr :3307). 다른 포트로 바꿔도 됩니다. |
WordPress 서버에서 MySQL 포트까지 닿는지는 서버에 SSH로 접속해 확인할 수 있습니다. MySQL HeatWave DB System은 관리형 서비스라 DB 서버에 직접 로그인해 서비스 상태를 볼 수 없으므로, 상태는 OCI 콘솔에서 확인합니다.
# WordPress 서버에서 실행: 3306 포트 연결 확인
timeout 3 bash -c '</dev/tcp/<MySQL_프라이빗_IP>/3306' && echo "3306 open" || echo "3306 closed"
정리
이미 관리 중인 WordPress 서버가 있다면, PuTTY의 SSH 터널 하나로 MySQL 포트를 외부에 열지 않고 프라이빗 서브넷의 DB에 접속할 수 있습니다. 대신 WordPress 서버의 SSH가 DB로 가는 길이 되므로 키와 허용 IP를 더 엄격하게 관리해야 합니다. 퍼블릭 서버가 없거나 접속 이력을 OCI에서 관리하고 싶다면 무료인 OCI Bastion 서비스를 검토하세요.



