본문으로 건너뛰기

[EC2] Bastion 호스트를 통한 SSH 터널링 설정 가이드

Prerequisite (전제조건)

본 가이드를 진행하기 전에 다음 항목이 준비되어 있어야 합니다:

  • Bastion 호스트가 Public Subnet에 생성되어 있어야 합니다
  • Bastion 호스트의 보안 그룹에서 SSH(22) 포트가 허용되어 있어야 합니다
  • Bastion 호스트의 Private Key(.pem 파일)를 보유하고 있어야 합니다
  • 접근하려는 VPC 내부 리소스(RDS, ElastiCache 등)의 엔드포인트 정보를 알고 있어야 합니다
  • 내부 리소스(RDS, ElastiCache 등)의 보안 그룹에서 Bastion 호스트로부터의 접근이 허용되어 있어야 합니다
  • 로컬 PC에 SSH 클라이언트가 설치되어 있어야 합니다
    • macOS/Linux: 기본 설치됨
    • Windows: Git Bash, WSL, 또는 PuTTY 필요

Process

1. Private Key 권한 설정 (macOS/Linux만 해당)

  1. 터미널을 열고 Private Key 파일이 있는 디렉토리로 이동합니다

    cd ~/.ssh

  2. Private Key 파일의 권한을 변경합니다

    chmod 400 bastion-key.pem

2. Bastion 호스트 연결 테스트

  1. 터미널에서 다음 명령어로 Bastion 호스트에 접속이 가능한지 테스트합니다

    ssh -i ~/.ssh/bastion-key.pem ec2-user@<Bastion-Public-IP>

  2. 접속이 성공하면 exit 명령어로 연결을 종료합니다

3. 대상 리소스 정보 확인

접근하려는 VPC 내부 리소스의 정보를 AWS 콘솔에서 확인합니다.

RDS의 경우:

  1. AWS 콘솔에서 RDS 서비스로 이동합니다

  2. 접근하려는 데이터베이스를 선택합니다

  3. 연결 & 보안 탭에서 다음 정보를 확인합니다:

    • 엔드포인트: my-database.xxxxxx.ap-northeast-2.rds.amazonaws.com
    • 포트: 5432 (PostgreSQL) 또는 3306 (MySQL)

ElastiCache의 경우:

  1. AWS 콘솔에서 ElastiCache 서비스로 이동합니다

  2. 클러스터를 선택하고 기본 엔드포인트 정보를 확인합니다

    • 엔드포인트: my-redis.xxxxxx.cache.amazonaws.com
    • 포트: 6379

4. SSH Config 파일 생성 및 설정

SSH Config 파일 열기

터미널에서 다음 명령어로 SSH Config 파일을 엽니다:

vi ~/.ssh/config

Bastion 호스트 설정 추가

파일의 가장 위에 Bastion 호스트 설정을 추가합니다.

Host bastion HostName 54.180.123.45 User ubuntu IdentityFile ~/.ssh/bastion-key.pem ServerAliveInterval 60 ServerAliveCountMax 3

  • HostName : 실제 배스쳔 호스트의 Public IP주소
  • IdentityFile : Private key 실제 경로

Bastion 설정 아래 터널 설정 추가

예) Postgres 터널

Host rds-tunnel HostName localhost User ubuntu IdentityFile ~/.ssh/bastion-key.pem ProxyJump bastion LocalForward 5432 my-database.xxxxxx.ap-northeast-2.rds.amazonaws.com:5432

  • LocalForward의 첫번째 숫자 : 로컬포트 (일반적으로 대상 서비스와 동일하게 사용)
  • 엔드포인트 : 대상의 엔드포인트 주소
  • 마지막 숫자 : 대상의 서비스 포트

멀티 터널을 설정하려는경우

Host multi-tunnel HostName localhost User ubuntu IdentityFile ~/.ssh/bastion-key.pem ProxyJump bastion LocalForward 5432 my-database.xxxxxx.rds.amazonaws.com:5432 LocalForward 6379 my-redis.xxxxxx.cache.amazonaws.com:6379 LocalForward 27017 my-docdb.xxxxxx.docdb.amazonaws.com:27017

5. SSH 터미널 실행

터미널에서 설정한 Host 이름으로 터널을 실행합니다.

ssh -N rds-tunnel

  • -N옵션은 원격 명령을 실행하지 않고 터널만 유지하는 옵션
  • 명령어 이후 아무 메세지가 출력되지 않고 대기상태로 유지되면 정상

백그라운드실행

-f옵션을 추가하여 백그라운드로 터널을 유지할 수 있습니다.

ssh -fN multi-tunnel

6. 로컬에서 리소스 접근

로컬에서는 localhost를 활용하여 로컬에서 접근하듯이 그대로 사용합니다.

예) postgres 접속

psql -h localhost -p 5432 -U myusername -d mydatabase


또 다른 질문이 있으십니까? 문의 등록