PuTTY SSH 터널로 OCI 프라이빗 서브넷의 MySQL에 접속하기

PuTTY SSH 터널 대표 이미지: 노트북에서 점프 호스트를 거쳐 프라이빗 DB로

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 VMVM 비용(Always Free 범위 안이면 0)제한 없음여러 사람이 쓰는 전용 접속 서버가 필요할 때

주의: 점프 호스트 방식에서는 WordPress 서버의 SSH 접근 권한이 곧 DB로 가는 길이 됩니다. WordPress 서버의 SSH 키와 허용 IP를 더 엄격하게 관리해야 합니다.

준비할 것

항목내용
PuTTYPuTTY 공식 배포 페이지에서 받습니다.
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 connectionPuTTY 창이 열려 있는지, Tunnels의 Destination IP·포트, MySQL 쪽 보안 규칙이 WordPress 서버에서 오는 3306을 허용하는지
Access deniedDB 사용자·비밀번호, 그리고 그 사용자가 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 서비스를 검토하세요.

위로 스크롤