← 글 목록

notes

서버 대장 구조 — LB 인바운드 · NAT 아웃바운드

서버 대장 구조에서 LB 인바운드·NAT 아웃바운드 트래픽 흐름 정리.


1. 이 그림 전체를 뭐라고 부르나

원본 스케치의 형식은 L7 로드밸런싱 + Private 서버 2대 + NAT 아웃바운드 다. 이름을 붙이면 아래와 같다.

AWS - VPC 의 3-Tier 그림에서 ALB + Private EC2 + NAT Gateway 족만 따 낸 편이다. CloudFront·S3·Aurora는 여기 없다.


2. 원본 스케치

사장님이 본 토폴로지. 위 아래가 반대라 인바운드 / 아웃바운드다.

original sketch

3. 상세 다이어그램 (SVG)

원본과 같은 토폴로지에 Public / Private 서브넷, SG, 리스너, 헬스체크, SNAT를 주석으로 보강한 버전.

  • 파란 = INBOUND (80/443)
  • 초록 = OUTBOUND (NAT)
  • 보라 점선 = VPC 경계

흐름 (메르마이드)

flowchart TB
  subgraph IN["INBOUND"]
    INET_IN["INTERNET<br/>클라이언트 · DNS A → LB"]
    LB["LB<br/>Public IP :80 / :443"]
  end
  subgraph VPC["VPC · Private"]
    S1["Server1<br/>Private IP · no public IP"]
    S2["Server2<br/>Private IP · no public IP"]
  end
  subgraph OUT["OUTBOUND"]
    NAT["NAT Gateway<br/>Public IP · SNAT"]
    INET_OUT["INTERNET<br/>Outbound only"]
  end
  INET_IN -->|"TCP 80 / 443"| LB
  LB -->|"forward health-ok"| S1
  LB -->|"forward health-ok"| S2
  S1 -->|"yum/apt · API · webhook"| NAT
  S2 -->|"yum/apt · API · webhook"| NAT
  NAT -->|"conntrack return"| INET_OUT

4. 트래픽 경로 두 개

인바운드 (파란)

  • 클라이언트 → DNS A레코드 = LB Public IP
  • TCP :80 이면 :443 리다이렉트 (권장)
  • TCP :443 → LB가 TLS 종료 (권장: SSL terminate)
  • 타겟 그룹 Server1 / Server2 중 헬스 OK 노드로만 forward
  • 앱은 Private IP :3000 (포트는 운영값. 원본에는 앱 포트 미표시)
  • 서버 Public IP로 80/443을 열면 이 그림을 깨는 것.

    아웃바운드 (초록)

  • Server1 · Server2 default route = NAT Gateway
  • NAT가 Private IP → NAT Public IP 로 SNAT
  • 외부 API, 패키지, webhook, yum/apt는 이 경로만
  • 응답은 conntrack 로 요청한 서버에만 돌아온다
  • 밖에서 NAT Public IP로 새 inbound 세션 시작 불가
  • 서버에 IGW 기본 경로를 달면 Private가 부서진다.

    5. 구성 요소

    5-1. LB (Public IP, :80 / :443)

    왜 LB만 열나

    • 서버 IP를 감춤. 증설·교체를 LB에서 동일하게 관리
    • 1대 중지 때 다른 1대로 자동 이전
    • WAF / rate limit / HTTP 헤더 정책을 앞단에만 걸기

    5-2. VPC

    • CIDR 예: 10.0.0.0/16 (원본에 없음. 주석용)
    • Public subnet: LB, NAT, IGW 경로
    • Private subnet: Server1, Server2. IGW로의 디폴트 라우트 없음
    • 인바운드의 유일 입구 = LB. 서버 SG / NACL에서 인터넷 0.0.0.0/0 직접 allow 금지

    5-3. Server1 · Server2 (Private IP)

    두 대가 동일 역할. Active-Passive가 아니라 Active-Active. 한쪽이 죽어도 LB 헬스가 다른 한쪽으로 붙인다.

    5-4. NAT Gateway (Public IP)


    6. 서브넷 · 라우트 · SG (실무 매핑)

    라우트 테이블

    Security Group

    NACL은 서브넷 단위 보조. 기본 allow + 에페메럴 포트 반환(1024-65535) 열어 두면 된다. 실제 허용목록은 SG가 주.


    7. 이 그림을 깨는 실수


    8. 점검 체크리스트

    • DNS A / Alias가 LB를 가리킨다 (서버 IP 아님)
    • 인터넷에서 서버 Private IP :80/:443 timeout
    • 인터넷에서 LB :443 200 (헬스 경로 포함)
    • Server1 중지 테스트 시 트래픽이 Server2로만 간다
    • 서버에서 curl ifconfig.me 결과 = NAT Public IP (서버 IP 아님)
    • 서버 SG inbound source = LB SG
    • Private 라우트 기본 = NAT Gateway

    9. SVG에 넣은 주석 (원본에 없던 것)

    원본은 노드 이름·Public/Private·포트만 있다. 아래는 운영 시 채우는 값.


    10. 이름 빠르게

    한 문장: 인터넷은 LB만 보고, 서버는 NAT만 보고, 서로 직접 만나지 않는다.