이 글에 대해 궁금한 점이 있나요?
불분명한 부분이 있거나 더 자세한 내용이 필요하면 메일 주세요.
DDoS 주간 이후 남은 과제는 명확했습니다. 공인 IP가 그대로 노출된 구조로는 다음 공격도 버틸 수 없다는 것. 그래서 노드의 공인 진입점을 통째로 PAHIDC 보호 구간 뒤로 옮기는 작업을 했습니다.
새 경로
최종 구조는 이렇습니다. 외부 트래픽은 PAHIDC의 보호 주소로 들어와 GRE 터널을 타고 Oracle의 필터 호스트로 들어오고, 거기서 WireGuard 팬아웃(wg-pah)으로 각 노드에 전달됩니다. 노드 실IP는 뒤에 숨고, 클라이언트의 진짜 IP는 그대로 보존합니다.
진짜 IP 보존이 제일 까다로운 부분이었습니다. Docker 컨테이너가 답변할 때 출발지가 꼬이지 않게 connmark와 전용 라우팅 테이블을 썼고, 이 마크를 지우면 바로 답변이 끊기는 구조라 운영 문서에 "제거 금지"로 못 박아 두었습니다.
순서가 전부였다
노드 셋을 한 번에 옮기지 않았습니다.
- 새 경로를 먼저 만들고 외부에서 게임 포트, SFTP, 업로더까지 전부 검증했습니다.
- node1, node2를 먼저 DNS 전환했습니다.
- node3은 미뤘습니다. 전환 판단 시점에 established TCP 연결 38개가 살아 있었기 때문입니다. 연결이 살아 있는 노드를 끊지 않는 게 원칙이었습니다.
- 며칠 뒤 기존 경로의 node3이 실제로 타임아웃을 일으켰을 때, 이미 준비된 새 경로를 외부에서 다시 검증하고 그때 DNS를 옮겼습니다.
결과적으로 node3은 기존 경로가 죽는 순간까지 기다렸다가 가장 빠르게 복구된 노드가 됐습니다. "미리 만들어 둔 경로"와 "외부 검증"이 없었다면 그날은 장애 공지로 끝났을 겁니다.
배운 것
- 롤백 경로는 전환 이후에도 살려 두기. CodeLounge 경로는 지금도 롤백용으로 남아 있습니다.
- DNS는 마지막 단계지 첫 단계가 아니다. 경로가 먼저, 검증이 다음, DNS는 가장 나중.
- 살아 있는 연결 수 같은 운영 상태가 전환 타이밍을 결정해야 합니다. 캘린더가 아니라.



