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 제거는 반드시 마지막 단계 |
설계의 기술적 토대 네 가지
- CONNECT는 통로 개설 요청이지 HTTP 요청 전달이 아니다. 200 응답 순간 그 커넥션은 HTTP이기를 멈추고 원시 바이트 릴레이가 된다. 그래서 gateway(A안)는 목적지를 모르고, TLS는 앱–origin 간 end-to-end로 성립한다.
- 신원은 인증서에만 실린다. AuthorizationPolicy의
source.namespaces매칭은 IP 조회가 아니라 클라이언트 인증서 SPIFFE ID 문자열 파싱이다. plain TCP에는 추출할 원료가 없다 — 홉 1을 day-one에ISTIO_MUTUAL로 만든 이유. - 강제력은 방화벽에서 나온다. egress gateway를 세우는 날이 아니라 워커노드 ACL을 제거하는 날 보안 이득이 실현된다. mesh 밖 경로(sidecar 미주입·hostNetwork)는 Calico GlobalNetworkPolicy로 이중 잠금.
- 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 Caliconets를 VIP 집합으로 정렬 - 2026-07-16 (v1) — 최초 게시
관련 문서
- HTTPS_PROXY 통신 흐름 실측 가이드 — CONNECT 이후 · 연결 재사용 · 재현 랩 (원문 HTML) — 이 설계서의 후속 실측. “동시 터널 수"가 용량 산정 단위인 이유를 5케이스 매트릭스로 증명
- HTTP Tunneling — CONNECT 기초·Squid 실습 — Part 01–02의 배경을 실습으로
- TLS 1.3 over Squid tunnel — 터널 안 TLS의 실측
- Egress 4-CRD 멘탈모델 — Part 04 객체 배선의 원리
- DNS GSLB 재현 랩 — 4.2 GSLB 가변 A레코드 대응의 실측 기반 (ServiceEntry resolution·플립 동작)
- ServiceEntry 리스너 매칭 — 다섯 명제와 재현 시나리오 — 4.2 본문이
se-listener-matching-verification.md라는 이름으로 참조하는 동반 검증 문서 (S1~S5 재현 절차) - Egress 리소스 관리 모델 — exportTo 중앙 관리와 목적별 Service 분리 (원문 HTML) — 이 설계서의 후속 운영 모델. 4.2·4.7을 전제로 CR을 몇 벌, 어디에 둘 것인가와 Service 분리 기준을 정의
- DB 연결은 egress 경유 제외 — excludeOutboundPorts 타당성 검토 (원문 HTML) — 이 설계서 체계의 적용 범위 결정. 외부 HTTPS는 이 설계대로 gateway 경유를 유지하되, DB(L4 장수명 커넥션)는 태우지 않는 근거
- Calico NP 기반 DB 접근 통제 — 구성·검증·운영 가이드 (원문 HTML) — Part 07의 Calico 이중 잠금과 같은 계층. mesh를 태우지 않는 경로(DB 직결)를 GNS·GNP·NP로 통제하는 구성 가이드
- Egress HTTPS 패턴 지도 — 이 설계(forward proxy 체이닝)가 기존 4패턴과 어떻게 다른지 비교할 기준점