프로젝트를 진행하던 중 팀원들이 Bastion Host를 처음 접해본다고 해서, 정리할 겸 간단한 가이드를 작성하게 되었다. 같은 어려움을 겪고 있는 사람들에게도 도움이 되기를 바란다.

0. 요약

이런 내용입니다.

Bastion Host를 사용하는 이유

Private Subnet에 있는 EC2들은 인터넷 연결이 없어 외부에서 직접 SSH 접근이 불가합니다. 이를 해결하기 위해 Public Subnet에 Bastion Host EC2를 생성하고, Private EC2들의 보안그룹에서 Bastion으로부터 오는 SSH 트래픽만 허용합니다. SSH 설정이 완료되면 Bastion EC2를 중지하여 외부 접근을 차단합니다.

Cloudflare Tunnel을 적용한 이유

Bastion Host에 SSH로 접근하려면 인바운드 22번 포트를 열어야 합니다. 일반적으로는 현재 내 IP를 등록하지만, 장소나 네트워크 환경이 바뀌면 IP가 변경되어 접근이 차단되는 문제가 발생합니다.

이를 해결하기 위해 Bastion Host의 SSH 인바운드를 Cloudflare IP 대역으로만 허용하고, Cloudflare Tunnel을 연결하였습니다. 추가적으로 CloudFlare Access Control에 이메일 인증 Policy를 추가했습니다. 이를 통해 IP 변경과 무관하게 Cloudflare Access 이메일 인증만으로 안전하게 접근할 수 있습니다.

Private Subnet EC2 인바운드 규칙은 다음과 같이 Bastion Host에서 들어오는 SSH 트래픽 말고는 모두 차단해주세요. EC2 SG를 사용하시면 한결 수월합니다.  

1. 개요

Bastion Host는 Cloudflare Tunnel을 통해 접근합니다. IP 고정 없이 이메일 인증만으로 SSH 접속이 가능합니다.

접속 흐름:

로컬 → Cloudflare Access 인증 (이메일 OTP) → Tunnel → Bastion Host (EC2)

💡 22번 포트를 외부에 열지 않아도 접속 가능합니다. Cloudflare Tunnel이 보안 채널 역할을 합니다.

 


2. 사전 준비 (최초 1회)

2-1. cloudflared 설치

로컬 PC에 cloudflared를 설치해야 합니다.

Windows:

https://github.com/cloudflare/cloudflared/releases/latest
→ cloudflared-windows-amd64.msi 다운로드 후 설치

Mac: brew install cloudflare/cloudflare/cloudflared

설치 확인: cloudflared --version

 

2-2. SSH 키 등록

Bastion EC2 PEM 키 파일을 받아 로컬에 저장합니다.

Windows CMD:

ssh-agent

ssh-add "C:\본인이다운받은디렉토리\woowa-beavers-bastion-EC2-key.pem"

Mac/Linux:

ssh-add ~/.ssh/woowa-beavers-bastion-EC2-key.pem

등록 확인:

ssh-add -l

⚠️ PEM 키 파일은 외부에 공유하지 마세요. Git에 절대 올리지 마세요.

 

+ Private EC2 key도 같은 방식으로 저장해 주세요.

ssh-agent
ssh-add "C:\본인이다운받은디렉토리\woowa-beavers-keypair.pem"

 

 

2-3. SSH Config 설정 (선택, 편의용)

매번 긴 명령어 입력을 피하려면 SSH Config를 설정합니다.

Windows:

C:\Users\본인이름\.ssh\config 파일 생성 또는 편집

Mac/Linux:

~/.ssh/config 파일 생성 또는 편집

 

Host bastion.woowabeavers.cloud
ProxyCommand cloudflared access ssh --hostname %h
User ec2-user

💡 이 설정을 하면 이후 ssh bastion.woowabeavers.cloud 만으로 접속 가능합니다.

 


3. Bastion Host 접속

3-1. SSH 접속

SSH Config 설정한 경우:

ssh -A bastion.woowabeavers.cloud

SSH Config 없는 경우:

ssh -o ProxyCommand="cloudflared access ssh --hostname
bastion.woowabeavers.cloud" [email protected]

image-20260326-151314.png

이런 문구가 나오고 브라우저가 열리지 않으면 인터넷창에 복붙해서 붙여넣으면 됨

또한 최초 연결 시에는 token 사용해서 어쩌구저쩌구할 것이냐고 뜨는데 Access 클릭

그러면 이렇게 성공 페이지 나옴

3-2. 이메일 인증

  1. 브라우저에서 bastion.woowabeavers.cloud 접속
  2. 팀장에게 등록 요청한 이메일 입력
  3. 이메일로 받은 OTP 코드 입력
  4. 인증 완료

💡 인증은 브라우저에서 1회만 하면 터미널 접속도 가능합니다.

최초 인증 완료 시 뜨는 페이지

하얀 화면 나오면 접속 잘 된 것임

브라우저에서 하얀 화면 또는 최초 성공시 나오는 Success를 보고 접속하면
이렇게 bastion 서버 연결이 잘 됩니다.

3-3. 프라이빗 EC2 접속 (Bastion 경유)

Bastion에 접속한 후 프라이빗 EC2로 이동합니다.

서버

프라이빗 IP

역할

EC2-1

Public 서버에 있는 EC2. Bastion을 사용하지 않습니다.

상품 페이지

EC2-2

10.0.2.123

회원가입/로그인

EC2-3

10.0.2.33

재고

EC2-4

10.0.2.74

주문/결제

EC2-5

10.0.2.202

관리자

접속 명령어 (Bastion에서):

ssh -A ec2-user@<프라이빗 IP>

💡 -A 옵션은 SSH Agent Forwarding으로 로컬 키를 그대로 사용합니다.

Bastion에 키를 저장하지 않아도 됩니다.

image-20260326-153604.png

bastion → ec2-3로 들어온 모습.

 


4. 문제 해결

증상

해결 방법

이메일 인증 페이지 안뜸

브라우저에서 bastion.woowabeavers.cloud 직접 접속 후 인증

cloudflared 명령어 없음

cloudflared 설치 확인 (2-1 참고)

Permission denied

ssh-add로 키 등록 확인 (2-2 참고)

Connection timeout

Cloudflare Access 이메일 인증 먼저 진행