---
status: OUTBOUND_PEER_OVERLAY_DEFAULT_OFF_STAGED
candidate_version: 1.4.84-outbound-peer-overlay-default-off-locked
candidate_bytes: 513317
candidate_sha256: e6b071b2af7f47c60c23eb49bb10d410163d99bc699178b6ddd0850a4d6f6093
production_enabled: false
rollout_policy_written: false
router_mapping_performed: false
operator_signing_used: false
validator_changed: false
current_continuity: false
---

# NAT 독립 outbound peer overlay 준비

## 목적

실제 UPnP canary에서 확인한 `UPNP_IGD_NOT_DISCOVERED`, CGNAT, 서로 다른 private LAN 문제를 피하기 위해 NAT 뒤 PC가 공개 PC gateway에 먼저 연결하는 overlay를 PC Sync 후보에 구현했다. 대상 PC에는 inbound 포트 개방이 필요하지 않다.

이번 단계는 source와 합성 검증만 완료한 default-OFF 단계다. 후보 배포, live overlay 연결, 메인 서버 차단은 실행하지 않았다.

## 인증과 lease

- 기존 DPAPI 보호 Ed25519 RPC identity를 그대로 사용한다.
- session 등록, poll, response를 각각 node key로 서명한다.
- relay는 admitted node key만 받고 세션을 메모리에만 저장한다.
- session lease는 최대 180초다.
- poll과 response의 128-bit nonce 재사용을 거부한다.
- response status, content type, body SHA-256과 body를 서명 claim에 결합한다.
- 정책이 꺼지거나 만료되면 worker와 relay endpoint가 모두 비활성화된다.
- bootstrap 뒤에는 기존 peer attestation cache의 public URL을 재사용할 수 있다.

## 데이터 경로

relay는 외부 요청을 target node의 queue에 넣고, NAT 뒤 target이 3초 간격 outbound poll로 가져간다. target은 자신의 loopback gateway에서 요청을 처리한 뒤 서명된 response를 relay에 돌려준다.

허용된 경로는 health, RPC certificate, capsule manifest/execute, directory proposal/vote/read, service shell뿐이다. 파일 쓰기, DB, 복구 실행, transaction submission, validator 제어 경로는 전달할 수 없다.

main-host-loss 전용 2-domain canary에서는 하나의 공개 ingress 아래 세 node-bound virtual gateway URL을 사용할 수 있다. 이는 메인 호스트 상실만 시험하며, 한 ingress/WAN 상실을 견딘다는 증거로 사용하지 않는다. 3-domain WAN-loss 등급은 계속 세 개의 독립 ingress를 요구한다.

## 검증

- outbound overlay protocol self-test 통과
- Ed25519 session binding 통과
- signed poll replay 거부 통과
- unsafe write path 거부 통과
- 기존 PC 후보 protocol self-test 9개 통과
- 기존 3-relay directory·capsule·service-shell 합성 교환 통과
- 2-domain main-host-loss에서 단일 ingress/3 virtual node profile 합성 검증 통과
- production의 2-domain downgrade 거부 유지

## 남은 live gate

1. 별도 finite rollout에서 3개 PC에 `1.4.84`를 배포한다.
2. 기존 public PC에 두 NAT 노드의 Ed25519 session이 등록되는지 확인한다.
3. virtual health에서 각 target node key가 정확히 반환되는지 확인한다.
4. 세 RPC certificate, 세 directory vote, 세 capsule, 세 shell을 overlay로 교환한다.
5. false policy 후 180초 안에 session과 virtual route가 사라지는지 확인한다.
6. 그 뒤에만 별도 승인으로 메인 서버 격리 E2E를 수행한다.

증거: `evidence/outbound-peer-overlay-stage-redacted.json`
