homelab89 Docs Logs Legacy Files ☰ TOC 🌓
guideistio 2026-07-16egresssquidforward-proxyhttp-connectegress-gatewayauthorization-policymigration

Outbound 집약 설계서 — Istio Egress Gateway로 Squid 경로 일원화

원본은 스타일링된 HTML 설계서

이 글의 본체는 설계서 전문이다. 색 규약(amber = 프록시가 읽는 구간, teal = 프록시에 불투명한 구간) 기반 다이어그램 7종, 실측 바이트 캡처, 트러블슈팅 표를 포함한다.

→ 전문 보기 (egress-gateway-squid-consolidation-guide.html)

이 페이지는 핵심 요약본.

한 문단 요약

바꾸는 것은 경로이지, 프록시가 아니다. GW존 Squid와 앱의 HTTP_PROXY 설정은 그대로 두고, 각 워커노드에서 GW존으로 직행하던 CONNECT 트래픽을 sidecar가 가로채 전용 egress 노드의 egress gateway를 경유시킨다. 완료 조건은 워커노드 → GW존 방화벽 ACL 제거 — 방화벽 대상이 “클러스터 전체"에서 “egress 노드 몇 대"로 줄어든다. 체이닝은 A안(앱이 CONNECT를 그대로 만들고 gateway는 squid:3128로 가는 TCP 경유지)을 채택했다. Istio 공식 지원 패턴이라 EnvoyFilter가 필요 없고 앱 무변경이다. 대가는 gateway가 최종 목적지를 전혀 모른다는 것 — 도메인 정책은 계속 Squid팀 ACL의 영역이고, gateway 층은 “누가 이 경로를 쓰는가”(AuthorizationPolicy, SPIFFE 신원)만 담당한다. 이 역할 분리가 조직 구조와 1:1로 일치한다.

구성

주제 핵심
00 요약과 결정사항 결정 5건과 근거 표
01 forward proxy와 HTTP_PROXY env는 OS 기능이 아니라 라이브러리 관례, 등록소 부재, NO_PROXY는 예외 목록
02 CONNECT의 실제 평문/암호화 두 국면, 실측 바이트, 프록시가 보는 것과 못 보는 것
03 목표 아키텍처 경로 집약(Squid 대체 아님), A안 vs B안 비교
04 Istio 구성 상세 객체 4종(ServiceEntry·DR·Gateway·VS)의 홉별 배선 · SE 매칭/발신 두-테이블 모델 · 층위 읽기 · exportTo 정합 + 검증 명령
05 워크로드 단위 통제 신원은 인증서에만 실린다 — mTLS가 AuthorizationPolicy의 전제
06 무장애 전환 절차 9단계, VirtualService 삭제 = 즉시 롤백인 구간 설계
07 운영 유의사항 Calico 이중 잠금, 타임아웃 3층, 감사 추적 단절, 에러 시그니처
08 부록 트러블슈팅 표 · 용어집

핵심 결정 5건

항목 결정 근거
체이닝 방식 A안 — 앱 CONNECT 유지, gateway는 TCP 경유지 공식 패턴 · 앱 무변경 · 무장애 원칙
gateway 홉 보안 ISTIO_MUTUAL, day-one 적용 워크로드 단위 통제의 유일한 전제. 롤백 안전판이 살아있는 초기가 검증 비용 최저
워크로드 통제 AuthorizationPolicy는 맨 마지막, 관찰된 실사용 신원으로 작성 dry-run 부재 → “관찰 → 작성 → 적용"이 사실상의 dry-run
역할 분리 목적지 정책 = Squid팀 ACL · 사용 주체 정책 = 플랫폼팀 조직 구조와 기술 경계가 1:1
롤백 원칙 기존 노드 ACL 생존 중 VirtualService 삭제 = 즉시 원경로 복귀 따라서 ACL 제거는 반드시 마지막 단계

설계의 기술적 토대 네 가지

  1. CONNECT는 통로 개설 요청이지 HTTP 요청 전달이 아니다. 200 응답 순간 그 커넥션은 HTTP이기를 멈추고 원시 바이트 릴레이가 된다. 그래서 gateway(A안)는 목적지를 모르고, TLS는 앱–origin 간 end-to-end로 성립한다.
  2. 신원은 인증서에만 실린다. AuthorizationPolicy의 source.namespaces 매칭은 IP 조회가 아니라 클라이언트 인증서 SPIFFE ID 문자열 파싱이다. plain TCP에는 추출할 원료가 없다 — 홉 1을 day-one에 ISTIO_MUTUAL로 만든 이유.
  3. 강제력은 방화벽에서 나온다. egress gateway를 세우는 날이 아니라 워커노드 ACL을 제거하는 날 보안 이득이 실현된다. mesh 밖 경로(sidecar 미주입·hostNetwork)는 Calico GlobalNetworkPolicy로 이중 잠금.
  4. DNS의 답은 발신에만 유입된다. sidecar 안에는 테이블이 둘 — 리스너(매칭, 키는 사람이 적는 addresses)와 클러스터(발신, resolution: DNS가 STRICT_DNS 주기 해석). 매칭 키를 DNS로 만들 수 없는 이유는 DNS에 전칭 질의가 없기 때문이다. GSLB 가변 A레코드 대응(VIP 집합 열거)의 출발점이자, addresses 생략이 0.0.0.0:3128 와일드카드 하이재킹이 되는 이유.

개정 이력

  • 2026-07-22 (v2) — Part 04 대폭 확장. ① 4.2: 단일 IP 고정 전제를 GSLB VIP 집합으로 교체하고, addresses(매칭)와 resolution: DNS(발신)의 두-테이블 모델·addresses 부재의 3상태(공존/와일드카드 하이재킹/정의 충돌)·GSLB 대응 3택과 드리프트 감지 스크립트 추가 ② 4.6 신설: Gateway의 TLS는 홉② 포장 — 프록시 대화를 HTTP로 읽는 주체는 전 구간에서 Squid뿐 ③ 4.7 신설: exportTo 세 객체(SE·VS·DR) 정합 규칙과 "."이 불변 멤버인 이유(gateway 자신이 홉③의 SE 소비자) ④ 트러블슈팅 표에 “mTLS 성공 직후 종료 = SE exportTo "." 누락” 추가 ⑤ 7.1 Calico nets를 VIP 집합으로 정렬
  • 2026-07-16 (v1) — 최초 게시

관련 문서

Files