본문 바로가기
DevOps

멀티클라우드 리버스 프록시 아키텍처 검토

by Rainbound-IT 2026. 4. 20.
반응형

 

1. 검토 배경

한 클라우드(Azure)의 VPN을 통해 접속한 사용자만 다른 클라우드(AWS)에 배포된 서비스에 접근하도록 제약해야 하는 상황. Site-to-Site VPN은 비용 부담으로 배제. 대안으로 "내부망 리버스 프록시 → 타 클라우드 Public ALB → Private 워크로드" 구조가 제시됨.

제안된 구조

[사용자 PC] ──(Azure VPN Client)──► [Azure VPN Gateway]
                                          │
                                          ▼
                                    [VNet 내부]
                                          │
                                          ▼
                              [Azure VM - nginx 리버스프록시]
                                  Private IP: 10.x.x.x
                                  Public IP: y.y.y.y (고정)
                                          │
                                          ▼ (공용 인터넷)
                              [AWS Public ALB + WAF]
                                  WAF 규칙: Source IP = y.y.y.y/32
                                          │
                                          ▼
                              [EKS Pod - Private Subnet]

검토자 의문

"보통 프록시를 public하게 설정하고 서비스를 private으로 설정하는데 반대로 되어 있다. 이게 맞는 구조인가?"

→ 날카로운 아키텍처적 지적. 본 문서는 이 질문에 대한 답을 정리함.


2. 전통적 3-tier 구조 vs 제안 구조

전통적 구조 (DMZ 모델)

[Internet] → [Public Proxy / DMZ] → [Private Backend]
              ↑ 공격 흡수            ↑ 네트워크 격리
  • Public Proxy: 인터넷에 노출, 공격 표면 흡수, WAF/IDS 집중 배치
  • Private Backend: 네트워크 레벨 격리, 프록시를 통해서만 도달 가능
  • 방어 원칙: 외곽은 단단하게, 내부는 부드럽게 (Defense in Depth의 고전형)

제안 구조

[VPN Users] → [Private Proxy] → [Public ALB + WAF] → [Private Backend]
              ↑ VPN만 접근      ↑ IP 화이트리스트로
                                  "논리적 private"
  • Proxy: VNet 내부, VPN 사용자만 도달 가능 (Private)
  • ALB: 공식적으로는 Public이지만 WAF로 프록시 IP 1개만 허용 (논리적 Private)
  • Backend: VPC 내부, ALB 통해서만 도달

차이점

 

항목  전통 구조  제안 구조
프록시 위치 Public Private
서비스 진입점 Private Backend Public ALB (WAF 제한)
방어 메커니즘 네트워크 레벨 격리 IP 기반 논리 격리
Fail-safe 기본 차단 (NSG/SG) 규칙 의존 (WAF 설정 실수 시 전면 공개)
Mental model 직관적 반전되어 어색함

→ 순서가 뒤집힌 게 맞음. 이 구조적 기형은 제약 조건에서 비롯됨.


3. 왜 이런 기형이 발생하는가

근본 원인: Shared Public ALB 재사용 제약

기업 환경에서 EKS/K8s 클러스터에 일반적으로 다음과 같은 ALB 구성이 존재:

 

ALB 유형  scheme  접근 방식
Private Shared ALB internal VPC 내부에서만 도달
Public Shared ALB internet-facing 인터넷에서 도달

특정 서비스만 VPN 사용자에게 제한하고 싶을 때:

  1. Private shared ALB 사용하려면: 두 클라우드의 네트워크 연결 필요 → S2S VPN 비용 부담
  2. Public ALB 사용하려면: 인터넷에서 누구나 접근 가능 → VPN 요구사항 위반
  3. Public shared ALB에 inbound-cidrs 걸면: 다른 서비스의 Security Group과 union되어 효과 없음
    • AWS Load Balancer Controller는 group.name이 같은 ingress들의 CIDR을 ALB의 SG에 합쳐서(union) 적용
    • 한 서비스만 제한하려 해도 다른 서비스의 0.0.0.0/0 허용이 동시에 적용되어 whitelist 무력화

우회책의 결과

"Public ALB + WAF로 IP 제한"이라는 논리적 Private 구성 → 프록시는 Private, 진입점은 Public이라는 역전된 구조 등장.


4. 보안상 평가

실제 방어 효과

  • WAF IP 규칙이 정상 동작하면 실질 공격 표면은 전통 구조와 거의 동일
  • 클라우드 관리형 ALB/WAF는 자체 운영 nginx보다 보안 패치 관리가 우수
  • 결론: 기능적으로는 안전함

그러나 3가지 이유로 전통 구조가 여전히 우월

 

이유  설명
Mental model 일치 운영팀 누구나 직관적 이해, 인수인계 용이
Fail-closed 기본 전통 구조는 네트워크 기본 차단 → 설정 실수해도 안전. WAF 기반은 규칙 오설정 시 전면 공개
복잡도 대비 이득 레이어 증가 = 디버깅 포인트 증가, TLS 인증서 2곳, 모니터링 대상 다수

치명적인가?

  • ❌ 기능상 치명적이지 않음
  • ⚠️ 하지만 "찝찝함"은 실재하는 위험 신호 — 가볍게 넘기면 안 됨

5. 보안 규칙 미적용 시 리스크 분석

시나리오: WAF/whitelist 없이 Public ALB 공개 운영

앱 자체 인증(bcrypt, JWT, rate limit)이 있다면 즉시 뚫리는 수준은 아님. 그러나 "VPN으로만"이라는 원래 요구사항 자체를 포기하는 결정이며, 공격 표면이 크게 증가함.

규칙 없을 때 증가하는 리스크

 

리스크  규칙 있음 규칙 없음
로그인 폭격 VPN 통과 후만 가능 인터넷 누구나 시도 (rate limit만 의존)
의존성 CVE 노출 내부자만 접근 가능 zero-day 즉시 공격 대상
업로드 엔드포인트 차단됨 인증 전 경로 있으면 위험
피싱/크리덴셜 스터핑 낮음 로그인 UI 공개 → 직원 타게팅 용이
서비스 존재 노출 CT 로그만 스캐너 상시 탐지
컴플라이언스 "내부용" 주장 성립 "인터넷 노출" 기록

실제 발생 가능 시나리오

  • 인증 프레임워크 CVE로 인증 전 RCE (JWT 라이브러리, multer 등 이력 존재)
  • 파일 파싱 라이브러리(폰트/이미지/PDF)는 out-of-bounds read/write 취약점 빈번
  • 유출된 비밀번호 재사용 공격은 rate limit으로 완전 차단 불가

규칙 없이 갈 때 최소 안전장치

  1. 강력한 비밀번호 정책 + MFA 추가
  2. User-Agent/Referer 기반 basic 필터 (봇 90% 차단)
  3. robots.txt disallow + X-Robots-Tag: noindex

6. 대안 아키텍처 비교

A. 동일 클라우드 내 VPN + Private ALB ⭐

[User] ──► [AWS OpenVPN / Client VPN] ──► [Private ALB] ──► [Backend]
  • Azure VPN 포기, AWS OpenVPN 또는 Client VPN 사용
  • 전통 구조 완전 성립
  • 비용: AWS OpenVPN(EC2 자체 호스트 시) 거의 $0, Client VPN은 ~$72/월
  • 기존 Private ALB 패턴 그대로 활용

B. 타 클라우드 VPN 유지 + 전용 Public ALB

[Azure VPN] → [Private Proxy VM] → [전용 Public ALB (inbound-cidrs)] → [Backend]
  • Shared ALB 사용하지 않고 서비스 전용 ALB 신설
  • inbound-cidrs가 독립 SG에 적용 → whitelist 효과 보장
  • 프록시 위치는 여전히 Private이지만, dedicated ALB가 "내 서비스만의 공개 진입점" 역할 명확
  • 비용: ALB ~$22/월 추가

C. 현재 검토 중 (Private Proxy + Shared Public ALB + WAF)

  • Shared ALB 재활용, 기존 VM 재활용으로 추가 비용 최소
  • 구조 역전 (위 2장 참조)
  • 비용: WAF ~$10/월

D. Site-to-Site VPN + Private Shared ALB

  • 전통 구조, 네트워크 레벨 격리
  • 비용 부담으로 배제되는 경우 많음 ($50+/월)

비교표

  

대안 구조   직관성 월 비용 기존 VPN 유지  레이어 수
A. 동일 클라우드 VPN ✅ 완전 전통형 $0~$72 2
B. 전용 Public ALB 🟡 유사 전통형 ~$22 4
C. 현재 검토 ❌ 역전됨 ~$10 5
D. S2S VPN ✅ 전통형 $50+ 3

7. 멀티클라우드 프록시 패턴의 업계 현황

질문

"보통 S2S VPN으로 뚫고 진행하는데, 프록시 방식은 얼마나 흔한가?"

답: 드물지 않지만 주류는 아님

프로덕션 멀티클라우드 환경에서는 S2S VPN / ExpressRoute + Direct Connect가 압도적 주류. "프록시 VM으로 크로스 클라우드 접근"은 특정 상황의 우회책으로 사용됨.

실제 사용되는 5가지 컨텍스트

  1. 스타트업/중소기업 비용 절감형
    • S2S VPN 비용 부담, 크로스 클라우드 서비스 1-2개만 필요
    • 내부 툴 한정 접근 용도
  2. 클라우드 마이그레이션 브릿지
    • 온프레 → 클라우드, A 클라우드 → B 클라우드 이전 중 임시 운영
    • 완료 후 프록시 제거
  3. ZTNA (Zero Trust Network Access) 초기형
    • Cloudflare Access, Google Cloud IAP, Teleport, Pomerium
    • 현재 논의 구조는 이를 저가 자체 구현한 셈
  4. 컴플라이언스/감사 요구
    • 금융/의료에서 모든 크로스 클라우드 트래픽을 단일 지점에서 로깅
    • 프록시가 TLS 종단하여 감사 로그 생성
  5. SaaS 게이트웨이
    • VPN 사용자만 특정 외부 SaaS 접근 허용
    • Squid/nginx forward proxy 방식

주류가 아닌 이유

 

이유  설명
지연 2개 클라우드 경유로 latency 증가
SPOF 프록시 장애 = 서비스 접근 불가 (네이티브 네트워킹은 클라우드 자체가 HA)
대역폭 병목 프록시 VM 스펙 한계 (GB 단위 업로드 시 특히)
운영 복잡도 VM, 인증서, 모니터링 등 추가 관리 요소
확장성 서비스 수 증가 시 감당 불가 → 결국 S2S로 수렴

공개 사례

  • Cloudflare Tunnel: 본질적으로 같은 개념. Fortune 500 다수 사용
  • 클라우드 마이그레이션 중 임시 브릿지: 다수 공개 사례 존재
  • 중견기업의 Azure AD + AWS 워크로드 조합: 종종 사용
  • 게임사의 빌드/CI 툴 크로스 클라우드 접근: 내부 관리 툴 용도

"처음 해본 느낌"의 진짜 원인

  1. 대기업/프로덕션은 이미 S2S VPN 보유 → 프록시 쓸 일 없음
  2. 소규모에서 쓰긴 하는데 임시/내부용이라 공론화 드묾
  3. 공식 문서·교과서에 잘 안 나옴 → 경험 없으면 낯설게 느껴짐

8. 아키텍처 결정 기준

의사결정 플로우

VPN 요구사항이 반드시 특정 클라우드 VPN이어야 하는가?
├─ NO → 대안 A (동일 클라우드 VPN) ⭐ 최적
└─ YES → 서비스 규모 / 사용자 수 평가
         ├─ 단일 서비스, 소수 사용자, 비용 민감
         │   ├─ 구조 직관성 중시 → 대안 B (전용 Public ALB)
         │   └─ 비용 최우선 → 대안 C (Shared + WAF) ⚠️
         └─ 다수 서비스, 다수 사용자 또는 장기 운영
             └─ 대안 D (S2S VPN) 또는 ZTNA 솔루션

주요 trade-off 포인트

 

관점  권장
구조 정합성 A > D > B > C
비용 A ≈ C < B < D
운영 단순성 A > D > B > C
Mental model 일관성 A > D > B > C
확장성 D > A > B > C

의사결정 시 유의점

  • "한 번도 못 해본 구조"라는 감각은 경고 신호
  • 처음 하는 인프라는 최대한 정석에 가깝게 진행해야 인수인계/장애 대응 용이
  • 아키텍처 선택은 기술 결정이 아니라 제품 결정 — VPN 요구사항의 본질부터 재확인
  • "찝찝함"은 미래의 운영 부담이 현재로 투영된 신호

9. 제안 구조(대안 C) 채택 시 운영 고려사항

비용 제약으로 구조 역전을 수용하는 경우, 다음 사항을 준수하면 실무적으로 수용 가능한 수준으로 운영 가능.

구축 단계별 검증 순서

  1. Backend Pod만 먼저 배포 + 임시 관리자 IP로 ALB 제한 → 정상 동작 확인
  2. WAF 규칙 추가 + 프록시 VM의 고정 공인IP 허용 → VM에서 curl 테스트
  3. 프록시 nginx 구성 + 내부 DNS → VPN 붙은 PC에서 브라우저 접근
  4. 각 단계마다 다음 단계 진행 전 반드시 검증

운영 필수 설정

  • 관리자 비상 접근 루트: WAF 규칙에 관리자 IP(/32) 추가 한 자리 확보
  • 로그 수집 통합: 각 레이어에서 로그 수집 (VPN, nginx, WAF, ALB, Backend)
  • 요청 추적: X-Request-ID 헤더로 전 레이어 추적
  • TLS 인증서 자동 갱신: Let's Encrypt 갱신 실패 알림
  • 프록시 IP 변동 방지: 고정 EIP + IaC 관리

업로드가 큰 서비스 주의사항

  • nginx client_max_body_size 명시적 설정 (기본값 1M)
  • proxy_request_buffering off 설정 → VM 디스크/메모리 절약
  • proxy_read_timeout, ALB idle timeout 조정

장애 진단 체크리스트

 

증상  진단 순서
접근 불가 (타임아웃) VPN 연결 → 프록시 상태 → WAF 로그 → ALB target health
업로드 실패 (413) nginx client_max_body_size 확인
업로드 끊김 (504) nginx proxy_read_timeout, ALB idle timeout 확인
전체 차단 (403) WAF IP 규칙의 프록시 공인IP 매칭 여부 확인

10. 참고 자료

같은 개념의 상용/오픈소스 구현

  • Cloudflare Zero Trust - 상용 ZTNA
  • Google Cloud IAP (Identity-Aware Proxy) - GCP 네이티브
  • Teleport - 오픈소스, VPN+프록시+audit 통합
  • Pomerium - 오픈소스 identity-aware proxy

AWS 공식 가이드

  • AWS "Secure Hybrid Connectivity" 패턴 문서
  • AWS Client VPN 관리자 가이드
  • AWS WAF IP set 설정 가이드

검색 키워드

  • 한국어: "VPN 리버스 프록시 크로스 클라우드", "멀티클라우드 프록시 패턴"
  • 영어: "cross-cloud reverse proxy", "VPN gated proxy", "zero trust network access"

11. 핵심 교훈

  1. Shared 리소스의 제약은 아키텍처 왜곡을 유발
    • Shared ALB의 SG 공유 특성 때문에 서비스별 차별 제약이 어려움
    • 이런 제약이 "Private proxy → Public ALB" 같은 역전된 구조의 원인
  2. "찝찝함"은 가볍게 볼 신호가 아님
    • 아키텍처적 위화감은 대개 실제 운영상 문제로 이어짐
    • 숙련자의 직관이 경고하는 시점에 대안 검토 필수
  3. VPN 요구사항의 출처 확인이 아키텍처 결정의 출발점
    • "어떤 VPN이든 상관없다" → 훨씬 단순한 구조 가능
    • "특정 클라우드 VPN 강제" → 제약 조건이 되어 복잡도 증가
    • 기술 논의 전에 비즈니스/정책 요구 재확인 필요
  4. "한 번도 못 해본 구조"라는 감각은 정보 신호
    • 드물게 쓰이는 이유가 있음
    • 공론화 안 된 패턴은 레퍼런스·커뮤니티 지원 부족
    • 장기 운영 시 인수인계/문서화 부담 증가
  5. 저비용 우회책은 "이해한 상태로" 선택해야 함
    • 비용 절감 자체는 정당한 결정
    • 단, trade-off를 명확히 인지하고 선택한 것과 모르고 빠진 것은 다름
    • 본 문서의 역할은 "알고 선택할 수 있도록" 맥락 제공
반응형

댓글