2025-09-21 19:38

  • AWS 포트 포워딩은 외부에서 직접 접근할 수 없는 프라이빗 서브넷의 EC2, RDS 등 리소스에 안전하게 접속하기 위한 기술.

  • 전통적인 SSH 터널링 방식과 더불어, 보안과 관리가 용이한 AWS Systems Manager(SSM) 세션 매니저 방식이 널리 사용.

  • 로컬 포트, Bastion 호스트(Jump Box), 타겟 리소스를 연결하는 가상의 파이프라인을 만들어 로컬에서 원격 서비스에 접근.

AWS 포트포워딩 완벽 정복 A부터 Z까지

클라우드 환경, 특히 AWS를 사용하다 보면 필연적으로 ‘보안’이라는 큰 산을 마주하게 됩니다. 중요한 데이터베이스나 애플리케이션 서버를 아무나 접근할 수 있는 퍼블릭 공간에 두는 것은 상상할 수 없는 일이죠. 그래서 우리는 대부분의 리소스를 외부 인터넷과 격리된 ‘프라이빗 서브넷(Private Subnet)‘에 배치합니다.

하지만 여기서 딜레마가 발생합니다. 개발자나 관리자는 이 프라이빗 리소스에 접속해서 작업을 해야 하는데, 어떻게 접근해야 할까요? 집 안에 있는 금고를 열어야 하는데, 열쇠는 집 밖에 있는 상황과 비슷합니다. 이때 필요한 ‘비밀 통로’를 만들어주는 기술이 바로 **포트 포워딩(Port Forwarding)**입니다.

이 핸드북에서는 AWS 환경에서 포트 포워딩이 왜 필요한지, 어떤 원리로 동작하는지, 그리고 가장 대표적인 두 가지 방법인 SSH 터널링AWS Systems Manager(SSM) 세션 매니저를 활용하는 방법을 A부터 Z까지 상세하게 다룹니다.

1. 포트 포워딩은 왜 만들어졌나 (탄생 배경)

포트 포워딩은 네트워크 보안과 운영 편의성이라는 두 마리 토끼를 잡기 위해 탄생했습니다.

  • 보안 강화: 해커의 직접적인 공격으로부터 핵심 리소스를 보호하기 위해, 데이터베이스(RDS), 내부 API 서버(EC2) 등을 프라이빗 서브넷에 배치합니다. 이곳은 인터넷에서 직접 IP 주소로 접근할 수 없는 안전지대입니다.

  • 운영 편의성: 하지만 개발자는 로컬 PC에서 데이터베이스 관리 툴(DBeaver, DataGrip)로 DB에 접속하거나, 테스트를 위해 내부 서버에 API 요청을 보내야 합니다. 매번 서버에 접속해서 명령어를 치는 것은 비효율적입니다.

  • 해결책: 이 두 가지 요구사항의 충돌을 해결하기 위해 ‘포트 포워딩’이 등장했습니다. 포트 포워딩은 유일하게 외부와 통신이 허용된 서버(보통 Bastion Host 또는 Jump Box라 부름)를 경유하여, 내 로컬 PC의 특정 포트와 내부 리소스의 포트를 1:1로 연결하는 기술입니다. 마치 내 노트북에 프라이빗 리소스로 향하는 전용 파이프라인을 연결하는 것과 같습니다.

2. 포트 포워딩의 핵심 구조

AWS 포트 포워딩은 크게 3가지 요소로 구성됩니다.

  1. 내 로컬 머신 (My Local Machine): 실제 작업이 이루어지는 개발자의 PC 또는 노트북.

  2. 게이트웨이 (Gateway / Bastion Host): 외부(Public Subnet)와 내부(Private Subnet)를 연결하는 유일한 관문. Public IP를 가지고 있으며, SSH 접속이 가능해야 합니다. 이 서버의 보안을 철저히 하는 것이 매우 중요합니다.

  3. 타겟 리소스 (Target Resource): 최종적으로 접속하려는 프라이빗 서브넷에 위치한 EC2 인스턴스, RDS 데이터베이스 등.

포트 포워딩은 **내 로컬 머신**의 특정 포트로 들어오는 모든 요청을 **게이트웨이**를 통해 **타겟 리소스**의 지정된 포트로 전달해주는 방식으로 동작합니다.

예를 들어, 내 로컬 PC의 3306 포트를 프라이빗 RDS MySQL 데이터베이스의 3306 포트로 포워딩했다면, 이제 로컬 DB 관리 툴에서 localhost:3306으로 접속하는 것만으로도 안전하게 프라이빗 RDS에 연결할 수 있습니다.

3. 방법 1: 전통적이지만 강력한 SSH 터널링

가장 고전적이면서도 널리 사용되는 방법은 SSH 프로토콜의 터널링 기능을 이용하는 것입니다. 로컬 포트 포워딩이라고도 불립니다.

준비물

  • Bastion Host 역할을 할 EC2 인스턴스의 Public IP 주소

  • Bastion Host에 접속하기 위한 SSH 키 페어 (.pem 또는 .ppk 파일)

  • 접속하려는 타겟 리소스의 Private IP 주소 또는 엔드포인트 주소

  • 보안 그룹 설정:

    • Bastion Host 보안 그룹: 내 IP에서 22번 포트(SSH)로의 인바운드 규칙이 허용되어야 합니다.

    • 타겟 리소스 보안 그룹: Bastion Host의 Private IP 또는 보안 그룹 ID로부터 타겟 포트(예: MySQL 3306, PostgreSQL 5432)로의 인바운드 규칙이 허용되어야 합니다.

사용법 (Local Port Forwarding)

터미널이나 PowerShell에서 아래 명령어를 실행합니다.

ssh -L [로컬 포트]:[타겟 리소스 주소]:[타겟 포트] [유저명]@[Bastion Host IP] -i [SSH 키 경로]

명령어 옵션 해설

  • -L: 로컬 포트 포워딩(Local Port Forwarding)을 사용하겠다는 옵션. [Local Port]:[Target Address]:[Target Port] 형식.

  • -i: 사용할 SSH 키 파일의 경로를 지정.

  • -N: 원격 서버에서 셸 명령을 실행하지 않도록 설정. 터널링 목적에만 사용하므로 이 옵션을 추가하는 것이 깔끔.

  • -f: 명령을 백그라운드에서 실행. 터널을 연결해두고 다른 작업을 계속할 수 있음.

실제 사용 예시

프라이빗 RDS for MySQL(엔드포인트: my-db.xxxxxxxx.ap-northeast-2.rds.amazonaws.com, 포트: 3306)에 내 로컬 PC의 3306 포트를 통해 연결하고 싶다. Bastion Host의 IP는 13.125.10.20이고, 유저명은 ec2-user, 키 파일은 ~/keys/my-key.pem이다.

ssh -f -N -L 3306:my-db.xxxxxxxx.ap-northeast-2.rds.amazonaws.com:3306 ec2-user@13.125.10.20 -i ~/keys/my-key.pem

이제 이 터미널은 그대로 둔 채, DBeaver 같은 DB 툴을 열고 서버 주소에 localhost (또는 127.0.0.1), 포트에 3306, 그리고 DB 사용자 정보만 입력하면 마법처럼 프라이빗 RDS에 접속됩니다.

4. 방법 2: 더 안전하고 현대적인 AWS Systems Manager (SSM)

SSH 터널링은 강력하지만 단점도 명확합니다. Bastion Host에 22번 포트를 열어둬야 하므로 보안 위협에 노출될 수 있고, SSH 키를 관리하는 것도 번거롭습니다.

AWS는 이러한 단점을 해결하기 위해 Systems Manager(SSM)의 세션 매니저 기능을 제공합니다. 이 방식은 Bastion Host가 필요 없으며, 인바운드 포트를 전혀 열지 않고도 안전하게 포트 포워딩을 구현할 수 있습니다.

SSM 방식의 장점

  • 향상된 보안: EC2에 인바운드 포트를 열 필요가 없습니다. 모든 통신은 AWS 내부의 안전한 SSM 채널을 통해 이루어집니다.

  • 중앙 관리: IAM 역할(Role)을 통해 인스턴스 접근 권한을 세밀하게 제어할 수 있습니다. SSH 키를 배포하고 관리할 필요가 없습니다.

  • 감사 및 로깅: 모든 세션 연결 및 명령어 기록이 CloudTrail과 CloudWatch에 로깅되어 추적이 용이합니다.

준비물

  • 로컬 PC에 AWS CLISession Manager Plugin 설치.

  • 타겟 EC2 인스턴스에 SSM Agent가 설치 및 실행 중이어야 함 (최신 Amazon Linux AMI에는 기본 설치됨).

  • EC2 인스턴스에 SSM 사용 권한이 있는 IAM 인스턴스 프로파일 연결 (AmazonSSMManagedInstanceCore 정책 포함).

  • (권장) VPC 엔드포인트: EC2 인스턴스가 외부 인터넷 접근 없이 SSM 서비스와 통신할 수 있도록 VPC 엔드포인트를 설정하는 것이 보안상 가장 좋습니다.

사용법

AWS CLI를 통해 아래 명령어를 실행합니다.

aws ssm start-session \
    --target [타겟 EC2 인스턴스 ID] \
    --document-name AWS-StartPortForwardingSessionToRemoteHost \
    --parameters '{"host":["'타겟 리소스 주소'"],"portNumber":["'타겟 포트'"],"localPortNumber":["'로컬 포트'"]}'

실제 사용 예시

프라이빗 서브넷의 EC2(i-0123456789abcdef)를 경유하여, RDS for PostgreSQL(엔드포인트: my-pg-db.xxxxxxxx.ap-northeast-2.rds.amazonaws.com, 포트: 5432)에 내 로컬 PC의 15432 포트로 연결하고 싶다.

aws ssm start-session \
    --target i-0123456789abcdef \
    --document-name AWS-StartPortForwardingSessionToRemoteHost \
    --parameters '{"host":["my-pg-db.xxxxxxxx.ap-northeast-2.rds.amazonaws.com"],"portNumber":["5432"],"localPortNumber":["15432"]}'

명령을 실행하면 Waiting for connections... 메시지와 함께 세션이 시작됩니다. 이제 DB 툴에서 서버 주소를 localhost, 포트를 15432로 설정하면 프라이빗 PostgreSQL DB에 안전하게 접속할 수 있습니다.

5. SSH 터널링 vs SSM 세션 매니저 비교

항목SSH 터널링 (Bastion Host)AWS SSM 세션 매니저
보안Bastion Host에 SSH(22) 포트 개방 필요인바운드 포트 개방 불필요. 더 안전함.
인증 방식SSH 키 페어 (.pem)IAM 역할(Role) 및 정책
인프라Bastion Host용 EC2 인스턴스 별도 관리별도 Bastion Host 불필요 (비용 절감)
감사/로깅OS 레벨에서 별도 설정 필요AWS CloudTrail/CloudWatch와 자동 통합
설정 복잡도상대적으로 간단하고 전통적인 방식초기 IAM, VPC 엔드포인트 등 설정 필요
추천 상황간단한 환경, 기존 방식에 익숙할 때보안이 중요하고, 중앙 관리가 필요한 모든 프로덕션 환경

6. 심화 내용 및 문제 해결

  • Connection refused: 포트 포워딩은 성공했지만 접속이 거부된다면, 타겟 리소스의 보안 그룹이 Bastion Host(SSH) 또는 경유 EC2(SSM)로부터의 트래픽을 허용하는지 확인해야 합니다.

  • SSH 키 권한 오류: permissions are too open 오류가 발생하면 chmod 400 [SSH 키 경로] 명령으로 키 파일의 권한을 수정해야 합니다.

  • SSM Agent: EC2 인스턴스가 SSM 콘솔에 나타나지 않는다면, SSM Agent가 실행 중인지, IAM 역할이 제대로 연결되었는지, 네트워크(VPC 엔드포인트 또는 NAT Gateway) 연결에 문제가 없는지 확인해야 합니다.

결론

AWS 포트 포워딩은 보안과 편의성 사이의 균형을 맞추는 핵심적인 기술입니다. 간단한 개발 환경에서는 전통적인 SSH 터널링이 빠르고 유용할 수 있지만, 보안, 감사, 확장성을 고려해야 하는 모든 프로덕션 환경에서는 AWS Systems Manager(SSM) 세션 매니저를 사용하는 것이 강력하게 권장됩니다.

SSM을 사용하면 더 이상 SSH 키를 주고받거나, 위험하게 포트를 열어두거나, 접속 기록을 남기기 위해 별도의 솔루션을 도입할 필요가 없습니다. 이 핸드북을 통해 여러분의 AWS 환경을 한 단계 더 안전하고 효율적으로 운영하는 데 도움이 되기를 바랍니다.