2026년 8월 6일
2분 분량
Migration
TeamWicked

살아있는 서비스의 인그레스를 갈아끼운 기록

CodeLounge에서 PAHIDC GRE + WireGuard 팬아웃으로의 전환. 서비스를 멈추지 않고 세 노드의 공인 진입점을 옮긴 과정을 정리했습니다.

이완우 (Ingwannu)
이완우 (Ingwannu)TeamWicked
살아있는 서비스의 인그레스를 갈아끼운 기록
실제로 돌아가는 시스템을 운영하며 쓴 기록입니다. 무언가 고장 난 뒤, 혹은 고친 직후에 씁니다.TeamWicked를 운영하고 OpenCodex를 개발하면서 쓴 글입니다. 다음 장애에 필요한 숫자, 순서, 실수를 그대로 남깁니다.
읽기 시작

DDoS 주간 이후 남은 과제는 명확했습니다. 공인 IP가 그대로 노출된 구조로는 다음 공격도 버틸 수 없다는 것. 그래서 노드의 공인 진입점을 통째로 PAHIDC 보호 구간 뒤로 옮기는 작업을 했습니다.

새 경로

최종 구조는 이렇습니다. 외부 트래픽은 PAHIDC의 보호 주소로 들어와 GRE 터널을 타고 Oracle의 필터 호스트로 들어오고, 거기서 WireGuard 팬아웃(wg-pah)으로 각 노드에 전달됩니다. 노드 실IP는 뒤에 숨고, 클라이언트의 진짜 IP는 그대로 보존합니다.

진짜 IP 보존이 제일 까다로운 부분이었습니다. Docker 컨테이너가 답변할 때 출발지가 꼬이지 않게 connmark와 전용 라우팅 테이블을 썼고, 이 마크를 지우면 바로 답변이 끊기는 구조라 운영 문서에 "제거 금지"로 못 박아 두었습니다.

순서가 전부였다

노드 셋을 한 번에 옮기지 않았습니다.

  1. 새 경로를 먼저 만들고 외부에서 게임 포트, SFTP, 업로더까지 전부 검증했습니다.
  2. node1, node2를 먼저 DNS 전환했습니다.
  3. node3은 미뤘습니다. 전환 판단 시점에 established TCP 연결 38개가 살아 있었기 때문입니다. 연결이 살아 있는 노드를 끊지 않는 게 원칙이었습니다.
  4. 며칠 뒤 기존 경로의 node3이 실제로 타임아웃을 일으켰을 때, 이미 준비된 새 경로를 외부에서 다시 검증하고 그때 DNS를 옮겼습니다.

결과적으로 node3은 기존 경로가 죽는 순간까지 기다렸다가 가장 빠르게 복구된 노드가 됐습니다. "미리 만들어 둔 경로"와 "외부 검증"이 없었다면 그날은 장애 공지로 끝났을 겁니다.

배운 것

  • 롤백 경로는 전환 이후에도 살려 두기. CodeLounge 경로는 지금도 롤백용으로 남아 있습니다.
  • DNS는 마지막 단계지 첫 단계가 아니다. 경로가 먼저, 검증이 다음, DNS는 가장 나중.
  • 살아 있는 연결 수 같은 운영 상태가 전환 타이밍을 결정해야 합니다. 캘린더가 아니라.