마지막 Transit Gateway 시작!


 

Scenario 3. AWS Transit Gateway 구현 (중앙 허브 라우팅)

 

# Scenario 3을 수행하기 전 check

* 검증 한계: AWS TGW 서비스 자체를 활용한 로컬 DB 직접 연결은 하드웨어 제약으로 인해 불가함.

* 불가 사유: TGW는 엔터프라이즈 전용 서비스로, 일반 PC 환경에서는 BGP 피어링 및 물리적 터널 종단이 불가함.

* 대체 검증: 실제 TGW 서비스 대신 EC2(Hub) + Tailscale 조합으로 대체하여 '중앙 집중형 라우팅' 로직을 검증함.

* 실무 포인트: TGW의 핵심인 'Hub-and-Spoke' 설계 원리와 VPC 라우팅 테이블 제어 방식은 EC2 기반 라우터를 통해 100% 동일하게 재현 및 실무 검증 가능함.

 

- 목적 : 다수의 서브넷/VPC 트래픽을 특정 HubEC2(Tailscale Subnet Router) 로 모아, 온프레미스(Local DB)와 통신하는 중앙 집중형 확장 구조를 검증함.

 

- 검증 가설 : "개별 노드에 VPN을 설치하지 않아도, Private 서브넷의 Route Table을 수정하여 트래픽을 Hub 노드로 리다이렉션하면 외부 네트워크와 통합 통신이 가능하다."


- 검증 항목 :

  • EC2의 서브넷 라우터(Subnet Router) 설정 및 트래픽 중계 여부 확인
  • 중앙 집중형 라우팅 테이블 설정을 통한 다수 네트워크 간의 통신 통합성 확인

- 방법 :

  • AWS Console 작업
    1. Hub 인스턴스 생성: 퍼블릭 서브넷 내에 가상 라우터 역할을 수행할 중계용 EC2를 배치함.
                                       보안그룹 설정 시 백엔드 API 인스턴스에서 오는 요청을 받도록 인바운드 규칙 추가.
    보안그룹 인바운드 규칙 설정
    2. 소스/대상 확인(Source/Dest. Check) 중지: 인스턴스 네트워킹 설정에서 이 옵션을 반드시 '중지'해야 본인이 최종 목적지가 아닌 외부 패킷(백엔드→로컬DB)을 드랍하지 않고 전달할 수 있음.
    중계용 EC2 인스턴스는 소스/대상 확인 설정을 "중지"함
    3. VPC 라우팅 테이블(Route Table) 업데이트: 백엔드 API 서버가 속한 서브넷의 이정표를 수정함. 로컬 DB 사설 대역(192.168.x.x)으로 가는 Target을 '중계용 Hub EC2의 인스턴스 ID'로 지정하여 트래픽을 강제로 허브로 밀어넣음.
    Backend 서버용 라우팅 테이블 (DB 요청은 중계 EC2로)
    중계용 라우팅 테이블은 기존 public 테이블과 동일
    4. 백엔드 API 서버 DB connection 변경 : 백엔드 API 서버가 속한 서브넷의 talescale 을 정지 / DB 커넥션을 시나리오 1의 talescale 10.x IP가 아닌 로컬 사설 IP 192.x 로 .env 파일 변경

  • Local(Tailscale) 연동 구현
    1. 중계 서버(Hub EC2) IP Forwarding 활성화 : 리눅스 커널이 패킷을 가로채서 로컬로 넘겨주도록 허용함.
      ** 단순히 ip_forward만 켜면 보안 그룹 설정이 완벽해도 패킷이 증발할 수 있음. 리눅스 커널은 들어온 경로와 나가는 경로가 다른 패킷을 비정상으로 보고 차단하기 때문인데, rp_filter 설정을 0으로 바꿔줘야만 중계 서버(Hub EC2)가 패킷을 버리지 않고 정상적으로 로컬 DB까지 전달함 ** 
    echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
    echo 'net.ipv4.conf.all.rp_filter = 0' | sudo tee -a /etc/sysctl.conf
    echo 'net.ipv4.conf.default.rp_filter = 0' | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p

    2. Subnet Router 선언: Hub EC2에서 taliscale 설치 후 "tailscale up --advertise-routes=10.0.0.0/16 --accept-routes" 명령을 실행함.
    3. 로컬 PC 사설 대역 광고: 로컬 PC(온프레미스)에서도 자신의 대역을 등록함.
        "tailscale up --advertise-routes=192.168.0.0/24"
    4. Tailscale 관리자 페이지에서 승인 : Admin Console에서 중계용 EC2(10.0.0.0/16)와 로컬 PC(192.168.0.0/24)의 경로를 각각 'Approve' 처리함.
    5. 온프레미스 보안 설정: 로컬 PC 방화벽에서 AWS VPC 대역(10.0.0.0/16)에 대한 인바운드(TCP 3306, ICMP)를 허용함.
    6. 기술 매핑: 실제 TGW 서비스 대신 Tailscale이 깔린 EC2를 '가상 라우터'로 변신시켜 트래픽을 중계하는 기능을 동일하게 구현함.
    ** 설정 미반영 시 해결법: tailscale up 옵션을 변경했는데도 ip route나 관리자 콘솔에 즉시 반영되지 않는다면, tailscale down 후 다시 tailscale up 명령어를 실행하여 세션을 초기화함. ** 

- AWS 아키텍처 : 

 

 - 검증 결과:

  • 통합 라우팅 확인: 복잡한 개별 Peering 없이, 중앙 허브(TGW 역할을 하는 EC2) 설정을 통해 다수의 가상 네트워크 대역에서 단일 로컬 DB에 접근 가능한 통합 라우팅 체계를 확인함.

backend public IP로 db 연결 시 중계서버를 거쳐 응답이 옴

 


 

[총평]


이번 기술 검증을 통해, 물리적인 VPN 장비가 없는 로컬 환경에서도 Tailscale과 같은 Mesh VPN을 활용하면 실제 기업의 Site-to-Site VPN이나 Direct Connect 환경을 충분히 시뮬레이션할 수 있음을 확인함.

이어서 Direct Connect(DX) 도 검증!
아키텍처와 공통설정은 앞선 "Site-to-Stie VPN" 과 동일함.

 


 

Scenario 2. Direct Connect(DX) 구현 (P2P 경로 최적화 검증)

 

# Scenario 2을 수행하기 전 check

Direct Connect 방식은 물리적 전용 회선 인입이 필요한 설계 구조이므로, 본 시나리오에서는 AWS 콘솔 절차를 숙지한 후 Tailscale 기반 성능 비교로 기술 검증만 수행함.

 

- 목적 : 인터넷 중계 서버(Relay)를 배제하고 온프레미스와 AWS 간 1:1 P2P(Direct) 경로를 수립하여, 물리적 전용선(Direct Connect) 수준의 고성능/저지연 통신 환경을 재현함.

 

- 검증 가설 : "의도적으로 UDP 통신을 제한한 Relay 모드와 최단 경로인 Direct 모드의 레이턴시(ms) 차이를 비교함으로써, DX가 하이브리드 아키텍처에서 제공하는 '직결성'과 '저지연'의 기술적 타당성을 입증할 수 있을 것이다."


- 검증 항목 :

  • Relay 환경: tailscale의 relay-only 설정을 통해 중계 서버(DERP)를 경유하는 통신의 지연 시간 측정.
  • Direct 환경: P2P 수립 후 중계 서버를 거치지 않는 최단 경로의 성능 수치 측정.
  • 성능 격차: 두 모드 간의 지연 시간 차이 및 패킷 안정성 비교.

- 방법 :

  • AWS Console 작업
    ** 본 시나리오에서는 AWS 서비스 신규 생성 작업은  없음 ** 
    1. Direct Connect Connection: 전용선 신청 메뉴(Create Connection)를 통해 물리적 포트 할당 및 LOA-CFA 발급 절차를 분석하고, 이를 Tailscale 가상 인터페이스 설정과 논리적으로 매핑할 수 있도록 숙지함.
    2. Private VIF 생성: Virtual Interfaces 메뉴에서 사설 통신용 VIF 생성 절차(BGP ASN, VLAN ID 설정 등)를 숙지함.
  • Local(Tailscale) 연동 구현
    1. Direct 상태 확인 : tailscale status 명령어로 EC2와 로컬 PC 간 P2P 직결 여부 확인 (default가 direct mode)

    2. Relay 모드 설정 : UDP 41641 차단
    sudo iptables -A OUTPUT -p udp --dport 41641 -j DROP
    sudo iptables -A INPUT -p udp --sport 41641 -j DROP
    # -> Relay 전환 후 ping 측정 (평균 80~100ms)

    3. Direct 복구 : 차단 규칙 제거 후 Tailscale 재기동
    sudo iptables -D OUTPUT -p udp --dport 41641 -j DROP
    sudo iptables -D INPUT -p udp --sport 41641 -j DROP
    sudo tailscale down && sudo tailscale up
    # → Direct 재수립 후 ping 측정 (평균 15~20ms)

    4. 결과 정리 : Relay는 중계 경유로 지연 증가, Direct는 P2P 직결로 저지연 유지 → 직결 경로 성능 우위 확인

- AWS 아키텍처 : 시나리오 1과 동일


- 검증 결과
:

  • Relay 모드 : 평균 80~100ms, 중계 서버 경유로 지연 증가 및 응답 편차 발생
    relay 모드 결과
  • Direct 모드 : 평균 15~20ms, P2P 직결로 저지연 및 안정적 응답 유지
    direct 모드
  • 결론 : Direct 전환 시 약 4~6배 레이턴시 개선 확인 → 직결 경로 확보가 성능에 결정적 영향 미침을 실험적으로 검증

"1. 이론/설계"편에서 찾아본 AWS 하이브리드 네트워킹의 3가지 표준 모델을 내 로컬 PC(온프레미스)와 AWS VPC 간에 Tailscale을 활용하여 직접 구현하고 기술적 타당성을 검증해보자.

 

먼저 Site-to-Site VPN 부터!


[공통]

 

1.기술 스택 (Tech Stack)

  • Language: Java 17
  • Framework: Spring Boot 3.5.9
  • Database: MariaDB 11.4.9 (Local On-premises)
  • ORM: MyBatis (with mybatis-spring-boot-starter 3.0.5)
  • Connectivity: Tailscale (Mesh VPN 기반 가상 사설망)
  • Build Tool: Maven

2. 사전 환경설정

1) 가상 사설망(VPN) 구축: Tailscale 설정
- 실무의 AWS Site-to-Site VPN 역할을 대신할 가상 사설망 구축.
- 로컬 PC: Tailscale 설치 및 로그인 후 가상 사설 IP 확인.
- AWS EC2: 에이전트 설치 및 노드 등록 실행.
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
- 연결 확인: EC2 터미널에서 로컬 PC IP로 통신(ping) 여부 확인.

2) 온프레미스 DB 보안 및 네트워크 개방
- 사설망 경로는 확보되었으나 DB 및 OS 차원의 접근 허용 설정 필요.
- MariaDB 설정: bind-address를 0.0.0.0으로 수정하여 외부 접속 허용.
# my.ini 설정
bind-address = 0.0.0.0
- OS 방화벽: Windows/Mac 인바운드 규칙에서 3306/TCP 포트 개방.
- DB 사용자 권한: Tailscale 사설 대역(100.x.x.x)에 대한 접속 권한 명시.
CREATE USER 'USERNAME'@'TailscaleIP' IDENTIFIED BY 'PASSWORD';
GRANT ALL PRIVILEGES ON awslab.* TO 'USERNAME'@'TailscaleIP';
FLUSH PRIVILEGES;

3) 백엔드 어플리케이션 환경 변수 설정
- EC2에 배포된 앱이 사설망 경로를 통해 DB를 인식하도록 엔드포인트 수정.
# application.yml
spring:
  datasource:
    url: jdbc:mariadb://[로컬_Tailscale_IP]:3306/awslab
    username: [USERNAME]
    password: [PASSWORD]
    hikari:
      connection-timeout: 5000 # 하이브리드망 지연 고려 최적화

4) AWS EC2 인스턴스에 Tailscale 설치
# tailscale 설치 
curl -fsSL https://tailscale.com/install.sh | sh

# 서비스 구동
# 로그인 승인: 터미널에 출력된 https://login.tailscale.com/a/xxxx 링크를 복사하여 브라우저에서 [Connect] 버튼 클릭.
sudo tailscale up

# 사설 IP 할당 여부 및 통신 확인
tailscale ip -4

# 상호 통신 검증: EC2에서 로컬 PC의 Tailscale IP로 핑을 날려 네트워크 터널링 완성 여부 체크.
ping [로컬_PC_Tailscale_IP]

5) AWS EC2 인스턴스에서 Backend API 서비스 기동


- 이후 3가지 하이브리드 시나리오(VPN, DX, TGW) 검증 진행

 

Scenario 1. Site-to-Site VPN 검증 (보안 터널 및 차단 검증)

 

# Scenario 1을 수행하기 전 check

* 검증 한계: AWS 콘솔 내 리소스 등록 및 구성 파일 추출까지는 가능하나, 실제 Tunnel: UP(통신 가능) 상태 구현은 불가함.

* 불가 사유: 실제 하이브리드 연결에는 고정 공인 IP와 IPSec 하드웨어 장비가 필수이나, 일반 로컬 환경(유동 IP/NAT)은 이를 충족하지 못함.

* 실무 포인트: 본 시나리오는 실제 장비 연결 전, 클라우드 측의 설정값 생성 및 구성도 설계 역량을 검증하는 데 목적이 있음.

 

- 목적 : 인터넷망을 경유하되 IPSec 암호화 터널과 동일한 보안 통로를 생성하여, 외부 접근은 차단하고 내부 통신만 허용하는지 검증함.

 

- 검증 가설 : "AWS 보안 그룹에서 외부(Anywhere) 접속을 허용하는 인바운드 규칙이 전혀 없더라도, 가상 터널(Tailscale)을 통한 사설 통신은 보안 그룹의 제어 범위를 우회하여 정상 동작할 것이다."


- 검증 항목 :

  • 인바운드 규칙 공백 상태에서 외부 공인 IP를 통한 접속 차단 여부 (Default Deny 확인).
  • 동일 상태에서 Tailscale 사설 대역(100.x.x.x)을 통한 DB 데이터 호출 성공 여부.

- 방법 :

  • AWS Console 작업
    1. Customer Gateway(CGW) 생성: [VPC] > [고객 게이트웨이]에서 내 로컬 PC의 공인 IP를 등록하여 온프레미스 접점을 정의함. (현업에선 기업의 VPN 서버 공인 IP를 등록)
    2. Virtual Private Gateway(VGW) 생성: [VPC] > [가상 프라이빗 게이트웨이] 생성 후, 현재 사용 중인 VPC에 'Attach' 하여 클라우드 측 종단점을 활성화함.
    3. VPN Connection 설정: 위 두 지점을 연결하고 '정적(Static) 라우팅'에 내 로컬 사설 대역을 입력함
    공인 IP 가 없는 한 사용은 불가함. 이번 시나리오에서는 작성만 해봄.
  • Local(Tailscale) 연동 구현
    1. 네트워크 통합: 로컬 PC와 EC2에 Tailscale을 설치하여 가상의 단일 사설망으로 묶음.
    2. 기술 매핑: 고가의 IPSec VPN 장비 대신, 테일스케일의 기반 기술인 WireGuard 프로토콜을 활용해 소프트웨어적으로 보안 터널을 생성함.

- 구축한 AWS 아키텍처 :

 

- 검증 결과:

  • 네트워크 격리: EC2 보안 그룹에 3306 포트 규칙이 부재함을 확인. 외부 스캐닝 및 공인 IP 접속 시 타임아웃(Timeout) 발생.
    인바운드 규칙 설정

    연결불가
  • 사설 경로 유효성: 가상 인터페이스(tailscale0)를 통해 유입되는 트래픽은 SG 필터링 레이어를 거치지 않고 OS 커널로 전달되어, 사설 IP 기반의 DB 연동이 성공함.

EC2 인스턴스에서 tailscale 기동 후 IP 확인 & 온프레미스 DB의 tailscale IP가 있는 설정파일
EC2 인스턴스에서 온프레미스 DB 통신 성공

 

 

본 포스팅에서는 대규모 엔터프라이즈 환경에서 표준으로 채택하는 '하이브리드 클라우드(Hybrid Cloud)' 아키텍처를 로컬 환경에서 재현해보고 기술적 타당성을 검증(PoC)한 과정을 담았다.

(실무에서는 보안과 성능 이슈로 AWS 환경으로 서비스를 이전하더라도 DB는 온프레미스에 두는 경우가 많다.)


[하이브리드 클라우드(Hybrid Cloud)' 아키텍처 구현 방식]

** 현업에 따라 다를 수 있음. 참고만!

 

1. AWS Site-to-Site VPN (가성비 & 중소규모 표준)

  • 인터넷 망을 사용하지만, 암호화 기술(IPSec)을 이용해 전용 통로를 만드는 방식 (물리적 연결 없음)
  • 구축 방법:
    ** 서비스/메뉴명: [VPC] -> [Virtual Private Network (VPN)]
    1. [AWS Console] 클라우드 엔지니어가 Customer Gateway(CGW)를 생성하여 온프레미스 방화벽의 IP를 등록함.
    2. [AWS Console] Virtual Private Gateway(VGW) 생성 후 연결할 VPC에 부착(Attach)함.
    3. [AWS Console] 위 두 지점을 잇는 VPN Connection(Site-to-Site VPN Connections)을 생성하고 설정 파일(구성값)을 다운로드함.
    4. [인프라 작업] 네트워크 엔지니어가 실물 방화벽 장비(L4/L7)에 접속하여 다운로드한 설정값(IPSec 키 등)을 입력하여 터널을 개통함.
    5. [AWS Console] VPC 라우팅 테이블에서 온프레미스 대역으로 가는 경로를 VGW로 지정함.
  • 장점: 구축 비용이 저렴하고, 설정이 상대적으로 빠름.
  • 단점: 인터넷 품질에 따라 속도가 불안정할 수 있으며, 암호화 연산으로 인한 CPU 부하 발생.
  • 용도: 보조 백업 회선, 또는 트래픽이 크지 않은 서비스 연동.

2. AWS Direct Connect (대기업/엔터프라이즈 표준)

  • 인터넷을 거치지 않고 데이터 센터와 AWS 사이를 물리적인 광케이블로 직접 연결하는 방식
  • 구축 방법:
    ** 서비스/메뉴명: [Direct Connect]
    1. [AWS Console] 클라우드 엔지니어가 Direct Connect 연결을 신청(Connections)하고 LOA-CFA(권한 증서)를 발급받음.
    2. [인프라 작업] 통신사(KT/LG 등) 직원이 전산실까지 실물 광케이블을 인입하고 패치 패널에 연결함.
    3. [AWS Console] 연결이 활성화되면, 그 선 위에 가상 인터페이스(Private VIF)를 생성함.
    4. [인프라 작업] 네트워크 엔지니어가 전산실 라우터 장비에서 BGP 피어링(경로 공유) 설정을 완료하여 사설 IP 통신을 시작함.
    5. [AWS Console] VPC 라우팅 테이블에 전용선 경로를 추가함.
  • 장점: 일관된 네트워크 성능(저지연), 최고 수준의 보안, 대량 데이터 전송 시 비용 절감.
  • 단점: 초기 구축 비용이 매우 높고, 설치까지 2~4주 이상의 시간이 소요됨.
  • 용도: 금융권 결제 시스템, 대규모 ERP 연동, 실시간 데이터 동기화.

 

3. AWS Transit Gateway (중앙 집중형 허브)

  • 최근 대기업들이 가장 선호하는 아키텍처로, 수많은 VPC와 여러 온프레미스 지점을 중앙에서 하나로 관리 (가상 라우터 설정)
  • 구축 방법:
    ** 서비스/메뉴명: [VPC] -> [Transit Gateways]
    1. [AWS Console] 클라우드 엔지니어가 중앙 허브 역할인 Transit Gateway(TGW)를 생성함.
    2. [AWS Console] 각 서비스 VPC들과 VPN/Direct Connect를 TGW에 Attachment(부착)함.
    3. [AWS Console] TGW 라우팅 테이블에서 "어느 VPC가 온프레미스 DB로 갈 수 있는지" 정책을 일괄 설정함.
    4. [AWS Console] 공유 서비스 VPC(보안/로깅용)를 별도로 두어 모든 트래픽을 검사하도록 설계함.
  • 장점: 확장성이 매우 뛰어남(수백 개의 VPC 연결 가능), 복잡한 네트워크 구조를 단순화.
  • 단점: 데이터 처리량에 따라 TGW 비용이 추가로 발생.
  • 용도: 계열사가 많거나 서비스 규모가 큰 대기업의 전사적 클라우드 표준 아키텍처.

[실무에서 발생할 수 있는 이슈들 정리]

 

1. IP 대역 충돌 이슈 (IP Address Overlap)

  • 실무에서 가장 빈번하고 치명적인 문제
  • 실무 이슈: AWS VPC 대역(예: 10.0.0.0/16)과 온프레미스 사무실 대역(예: 10.0.0.0/16)이 똑같으면, 서버는 패킷을 어디로 보낼지 몰라 통신이 불가능해짐
  • PoC에서 겪어보기: 내 로컬 사설 IP 대역과 EC2 VPC 대역을 일부러 겹치지 않게 설정해 보고, 라우팅 테이블이 어떻게 변하는지 관찰
  • 해결 방안: 설계 단계에서 서로 겹치지 않는 사설 IP 대역(CIDR) 할당

2. 레이턴시와 타임아웃 (Latency & Timeout)

  • 로컬 테스트는 네트워크가 아주 빠르지만, 하이브리드는 물리적 거리가 있음
  • 실무 이슈: DB 쿼리 하나에 평소보다 10~50ms가 더 걸림. 트래픽이 몰리면 Connection Pool(HikariCP)이 고갈되거나 Read Timeout이 발생
  • PoC에서 겪어보기: DB connection설정에서 connectionTimeout을 극단적으로 짧게(예: 500ms) 잡아보고 어떤 에러가 나는지 확인
  • 해결 방안: 하이브리드 환경에선 일반적인 내부 통신보다 Timeout 값을 여유 있게 설정하고, Connection Pool 크기를 최적화 함

3. MTU 및 패킷 유실 이슈 (Path MTU Discovery)

  • 실무 이슈: VPN 터널을 타면 암호화 헤더 때문에 한 번에 보낼 수 있는 데이터 크기(MTU)가 줄어듦. 큰 데이터를 조회할 때 패킷이 쪼개지다가 유실되어 연결이 뚝 끊기는 현상이 발생
  • PoC에서 겪어보기: DB에서 아주 큰 이미지 데이터나 긴 텍스트(LongText)를 한 번에 조회해보기
  • 해결 방안: 네트워크 장비에서 MSS Clamping 설정을 하거나, 애플리케이션에서 패치 사이즈(Fetch Size)를 조절해야 함

4. 보안 그룹 및 DB 권한 유지 (Hardening)

  • 실무 이슈: PoC 때는 편의상 모든 포트를 열지만(0.0.0.0/0), 실무에선 최소 권한 원칙을 지켜야 함
  • PoC에서 겪어보기: Tailscale IP 중에서도 딱 EC2의 사설 IP 1개만 DB 접속이 가능하도록 제한 (ACL 설정)
  • 해결 방안: IP Whitelist 관리 프로세스를 미리 수립해야 함

 

이어서 2편에서는 로컬에서 하이브리드 설계를 구축해보자


1. 보안 그룹 (Security Group)

- 정의: 인스턴스(ENI) 단위에 적용되는 가상 방화벽 (L4 레이어 제어)
- 관리 위치: EC2 > 네트워크 및 보안 > 보안 그룹
- 기술적 특징

  • Stateful(상태 유지): 인바운드 허용 시 아웃바운드 응답 자동 허용 (반대도 동일)
  • Whitelist 방식: 기본 설정은 모든 트래픽 차단, 필요한 규칙만 추가
  • 논리적 그룹화: 원본(Source)에 IP 대역뿐만 아니라 다른 보안 그룹 ID 참조 가능
  • 실무 용도: 개별 서버(EC2, RDS 등)의 서비스 포트(SSH, HTTP, DB 포트 등) 정밀 제어

2. 네트워크 ACL (Network ACL)

- 정의: 서브넷(Subnet) 경계에 적용되는 네트워크 계층 방화벽 (L3/L4 레이어 제어)

- 관리 위치: VPC > 보안 > 네트워크 ACL

- 기술적 특징

  • Stateless(상태 비저장): 인바운드와 아웃바운드 규칙을 각각 명시적으로 허용해야 통신 가능
  • 규칙 순위: 규칙 번호 순으로 평가하며, 조건 일치 시 하위 번호는 무시함
  • Deny(거부) 지원: 특정 IP 대역에 대한 명시적 차단 규칙 설정 가능
  • 실무 용도: 특정 국가 IP 대역 차단, 서브넷 간 통신 전면 통제 등 광범위한 경계 방어

3. 핵심 비교 

항목 보안 그룹 (SG) 네트워크 ACL (NACL)
적용 대상 인스턴스 (네트워크 인터페이스) 서브넷 (Subnet)
상태 저장 Stateful (응답 트래픽 추적) Stateless (왕복 규칙 각각 필요)
허용/차단 허용(Allow) 규칙만 지원 허용 및 차단(Deny) 규칙 지원
참조 방식 IP 주소 및 타 보안 그룹 ID IP 주소(CIDR)만 가능
적용 시점 모든 규칙 평가 후 최종 결정 규칙 번호 순서에 따른 즉시 적용

 

4. 실무 구축 가이드

  • 보안 그룹 운용:
    - 보안 그룹 ID 참조(Chaining)를 기본으로 하여 IP 변동에 유연하게 대응함
    - 동일 규칙을 중복 없이 하나의 보안그룹에 여러 AWS 리소스를 적용할 수 있음 (보안 정책 변경 시, 해당 보안 그룹만 적용하면 됨. 관리포인트 축소) 
  • NACL 운용: 특수한 차단 목적이 없는 한 기본 규칙(All Allow) 유지 권장 (관리 복잡도 감소)
  • 임시 포트(Ephemeral Ports): NACL 설정 시 아웃바운드에 고번호 포트(1024-65535) 개방 여부를 반드시 확인해야 통신 장애 발생을 방지함
  • 이중 방어: 외부 접점(Public) 서브넷에는 NACL로 최소한의 IP 필터링을 수행하고, 내부 자원은 보안 그룹으로 세부 제어하는 아키텍처 구성

 

# 적용 예 

private subnet 의 경우 

1) SSH 접근은 Bastion Host가 속한 보안그룹에게 허용  

2) HTTP 접근은 ALB가 속한 보안그룹에게 허용 

=> 해당 보안그룹에 속한 AWS 리소스들에게 권한 허용하는 것임

 

 

1. 인터넷 게이트웨이(Internet Gateway)

- VPC와 외부 인터넷 간의 통신을 가능하게 하는 논리적 연결 통로 (VPC 당 IGW 하나)

- 주요 기능

  • 인터넷 접속 허용: VPC 내부 자원이 인터넷에 연결되거나, 외부에서 VPC 내부(주로 ALB나 Public EC2)로 접속할 수 있게
  • 주소 변환(NAT): 인스턴스의 사설 IP와 공인 IP를 1:1로 매핑하여 트래픽을 중계함

- 설정 값 (매칭)

  • Target: 라우팅 테이블(Route Table)에서 0.0.0.0/0의 대상(Target)을 igw-xxxxxxxx로 지정하여 경로를 생성
  • VPC 연결: 하나의 IGW는 하나의 VPC에만 연결(Attach)할 수 있음

- 퍼블릭 서브넷이 외부 트래픽을 받기 위해서는 인터넷게이트 웨이 연결이 되어 있어야 함 (Inbound)

- 퍼블릭 서브넷이 외부에 응답을 보내기 위해서는 라우팅테이블을 생성하여 0.0.0.0/0 일 때 igw를 찾아갈 수 있도록 함(Outbound) 


 

2. NAT 게이트웨이

- 외부 인터넷에서 서브넷으로 접근할 수는 없지만 서브넷에서 외부 인터넷으로 접근할 수 있게 해주는 장치

  (서브넷 당 NAT 게이트웨이 하나)

   => ‘서브넷 → 외부 인터넷’의 방향으로만 통신이 가능
   =>  서브넷에 포함된 EC2 인스턴스에서 외부 API(ex. 날씨 API, OpenAI API 등)를 호출하거나 외부 라이브러리 설치 시 등

- NAT 게이트웨이는 퍼블릭 서브넷에 연결 / 프라이빗 서브넷의 라우팅 테이블은 NAT 게이트웨이를 연결

 

** 트래픽 체인 ** 

[프라이빗 EC2] → (라우팅 테이블: NAT행) → [NAT 게이트웨이] → (퍼블릭 라우팅 테이블: IGW행) → [인터넷 게이트웨이] → [외부 인터넷]

 

# 헷갈리는거 정리

1. private subnet은 어떻게 연결해서 들어가는가? aws 에서도 UI로 연결되지 않음

- public subnet을 통해 접근 가능 (동일 vpc 면 통신가능하기 때문)

 

  step1. 퍼블릭 서버로 키 복사
    - 로컬(내 컴)에 있는 키를 퍼블릭 서버로 복사해야 그 안에서 다시 프라이빗 서버로 들어갈 수 있음

    - 파워 쉘 실행 후 아래 script 실행

     * 사용자 계정은 os 마다 다름

       Ubuntu: ubuntu
       Amazon Linux 2 / 2023: ec2-user
       Debian: admin

# 내 컴퓨터 파워쉘에서 실행
scp -i "public-server.pem" "web-pri-server.pem" ec2-user@<퍼블릭_서버_공인IP>:~/

 

  step2. public ec2 접속(AWS UI 또는 파워쉘에 이어서 script 실행) 후 private ec2로 접속  

# 1. 퍼블릭 서버 접속
ssh -i "public-server.pem" ec2-user@<퍼블릭_서버_공인IP>
# 파일 권한을 '나만 읽기 가능'으로 변경
chmod 400 <프라이빗_서버_사설IP>

# 2. 퍼블릭 서버 안에서 프라이빗 서버로 접속 (전달받은 키 사용)
ssh -i "web-pri-server.pem" ec2-user@<프라이빗_서버_사설IP>


 

3. Bastion Host

- 사설망(Private Subnet) 자원 관리를 위한 외부 관문 서버

- 별도 서비스가 아니라 일반적인 EC2 인스턴스를 Bastion Host라는 역할을 보안그룹으로서 부여한 것

  => 보통 사양을 많이 타지 않아 t3.nano나 t3.micro 같은 저렴한 사양을 씀
  => 22번 포트를 내 IP에만 열어주고, 다른 서버들로 연결될 수 있는 '입구' 역할을 하도록 설정한 EC2임.


1) 존재 이유
- 사설망(Private Subnet) 내부 인스턴스에 접근하기 위한 단일 진입점. (퍼블릭 서브넷도 SSH 포트를 배스천 호스트에게만 오픈하는 것을 권장)

- 핵심 목적: 모든 서버의 SSH(22번) 포트를 외부에 열지 않고, 오직 배스천 한 대만 관리하여 공격 면적(Attack Surface)을 최소화함.


2) 위치 및 네트워크 구성
- 반드시 퍼블릭 서브넷에 배치하며 공인 IP를 보유해야 함.
- 배스천 호스트는 인터넷 게이트웨이(IGW)를 통해 외부 관리자와 통신함.

3) 보안 그룹(Security Group) 설정 정석
- 배스천 호스트 SG: 인바운드 22번(SSH) 포트를 관리자의 특정 공인 IP로만 제한함. (0.0.0.0/0 개방 금지)
- 내부 인스턴스 SG: 인바운드 22번(SSH) 포트의 소스를 IP가 아닌 배스천 호스트의 보안 그룹 ID로 설정함.

4) 2026년 최신 보안 트렌드 (중요)
- 포트리스(Port-less) 접속: 최근 AWS는 배스천의 22번 포트조차 열지 않는 방식을 권장함.
- AWS Systems Manager(SSM) Session Manager: 배스천 호스트 없이, 또는 배스천의 22번 포트를 닫은 상태에서 AWS 내부망을 통해 안전하게 셸 접속을 수행함. (가장 안전한 방식)

5) 요약
-  SSH 접속을 배스천으로 단일화하여 관리
다만, 최근에는 배스천의 22번 포트조차 노출하지 않고 IAM 권한으로 접속하는 방식이 공식 권장 사항임.

 

6) 접속 단계 (2단계 과정)

1차 접속: 내 PC에서 퍼블릭 서브넷에 떠 있는 배스천 호스트(EC2)로 SSH 접속을 수행함. (이때 내 IP만 허용된 상태여야 함)
2차 접속: 배스천 호스트에 접속된 터미널 창 안에서, 다시 ssh [대상 서버 IP] 명령어를 입력해 프라이빗 혹은 퍼블릭 서브넷에 있는 다른 EC2로 들어감.

 


# !최종 정리! 아래와 같은 아키텍처로 구축 시 순서

  • VPC 및 IGW: VPC 생성 및 Internet Gateway 연결.
  • Subnets: 가용 영역별 Public Subnet 2개, Private Subnet 2개 생성.
  • NAT Gateways: Public Subnet A, B 각각에 NAT Gateway 생성 (EIP 필요).
  • Routing Tables:
    • Public RT: 0.0.0.0/0 -> IGW (Public A, B 서브넷 연결).
    • Private RT A: 0.0.0.0/0 -> NAT GW A (Private A 서브넷 연결).
    • Private RT B: 0.0.0.0/0 -> NAT GW B (Private B 서브넷 연결).
  • Security Groups:
    • Bastion SG: 22번 포트 허용 (내 IP만).
    • Web Server SG: 80/443 포트 허용(ALB로부터), 22번 포트 허용 (Bastion SG로부터).
  • EC2 Instances: * Public Subnet에 Bastion Host 생성.
    • Private Subnet에 Application Server 생성.
  • Load Balancer (선택이나 권장): Public Subnet에 ALB 생성 후 서버들과 연결.

 

 

AWS 네트워크 계층 구조 
- 리전 (Region): 지리적 위치 (예: 서울 리전)
- VPC (Virtual Private Cloud): 리전 안에 생성하는 가상 네트워크 
- 가용 영역 (Availability Zone, AZ): 리전 안에 떨어져 있는 물리적인 데이터 센터 단지 (보통 리전당 3~4개)
- 서브넷 (Subnet): 특정 가용 영역(AZ) 안에 할당하는 IP 주소 범위


 

1. VPC

- AWS 클라우드 내에서 사용자 전용으로 격리된 가상 네트워크 공간

- VPC를 활용하면 외부에서 직접 접근할 수 없는 독립적인 네트워크 환경을 구성할 수 있어서 보안적으로 안전

- VPC는 할당할 수 있는 여러 개의 IP를 가지고 있음

   => VPC 생성 시 IP 주소의 범위를 CIDR 표기 방식을 통해 설정함

 

2. VPC 핵심 요소

 

  • 서브넷 (Subnet): VPC 내부의 IP 주소 범위를 더 작은 단위로 쪼갠 네트워크
                              외부 인터넷과 연결되는 퍼블릭 서브넷과 보안을 위해 격리된 프라이빗 서브넷으로 구분
  • 라우팅 테이블 (Routing Table): 네트워크 트래픽이 어디로 향해야 하는지 결정하는 이정표
  • 인터넷 게이트웨이 (IGW): VPC 내의 자원들이 외부 인터넷과 통신할 수 있게 해주는 통로
  • 보안 그룹 (Security Group) & NACL: 네트워크에 드나드는 트래픽을 허용하거나 차단하는 가상 방화벽

3. 서비스 흐름 예시

사용자가 웹사이트에 접속하면 인터넷 게이트웨이를 통과
라우팅 테이블의 안내에 따라 퍼블릭 서브넷에 있는 웹 서버 또는 로드밸런서로 연결
로드밸런서가 있다면 대상 그룹을 보고 실제 서버로 연결
대상 그룹 서버는 보안을 위해 프라이빗 서브넷에 숨겨진 서비스(DB 등)와 통신하여 데이터를 가져옴


 

1. 서브넷

- 하나의 큰 네트워크(VPC 등)를 작은 네크워크 단위로 나눈 것

- VPC는 여러 서브넷으로 나뉘어짐

- 용도에 따라 네트워크를 분리해서 사용 가

 

2. 퍼블릭 서브넷 / 프라이빗 서브넷

- VPC를 여러개의 서브넷으로 나눌 때 가장 많이 활용하는 방식이 외부에서 접근이 가능한 네트워크(퍼블릭 서브넷)와 외부에서 접근이 불가능한 네트워크(프라이빗 서브넷)로 나누는 방식

- 두 서브넷의 차이 : 인터넷 게이트웨이의 연결 여부

 

# 헷갈려서 정리 # 

1) pub/pri 서브넷을 만들 때 가용영역을 어떻게 나누는가?

- 보통 실무에서는 가용영역에 배포되는 서비스들을 다른 가용영역에 이중화하여 관리함 

  => ex. A 가용영역 : pub - web server / pri - api server, db  일 때, B 가용영역에도 동일하게 세팅하여 운영 안정성 보장 

 

2) inbound 와 outbound 규칙은 어떻게 정의되는가?

** 외부 사용자의 요청이 들어왔을 때, AWS 사설 네트워크 망에 접속하기 위해서는 인터넷 게이트웨이가 매핑되어 있어야 함.

    => inbound 설정

** AWS 서비스에서 외부로 응답하기 위해서도 별도 설정이 필요한데, 이것을 수행하는 것이 라우팅 테이블임

    => outbound 설정

 

3) 서브넷 생성 시 기본으로 할당되는 라우팅 테이블을 사용하지 않고 신규 생성하는 이유?

- pub/pri 서브넷을 생성한 뒤 pub에 igw를 연결하고 나서, 별도의 설정을 위한 라우팅테이블을 별도로 생성하는 것을 추천

    => default로 매핑된 라우팅 테이블은 동일 VPC 요청일 때 local 로 응답하라는 것으로 보통은 건드리지 않고 별도로 라우팅 테이블을 생성하여 관리함. private subnet에 영향을 줄 수 있음.

 

4) 아래와 같은 라우팅 테이블 설정일 때 우선순위는 어떻게 되는가? 

- 10.0.0.5 로 보낼 경우, 라우팅 1로 선택되어 local로 보내짐.

- AWS의 라우팅 테이블 규칙에 따르면, 라우팅 테이블은 목적지 주소가 더 구체적으로 명시된 규칙을 먼저 선택하기 때문

 

 

+ Recent posts