DNS 자체 전환 준비 — hosting.kr 의존 제거
날짜: 2026-05-22
대상: /Users/ef/CrownyOS/crownyc/DNS서버v3.한선, /Users/ef/crowny-gateway/
원칙: 근본 해결 — 13개 도메인 CAA SERVFAIL의 근본 원인(hosting.co.kr NS 간헐 장애)을 자체 DNS 전환으로 제거. 완전히 세분화해 작은 단위로 하나씩 완성.
배경
게이트웨이 인증서 갱신 시 13개 도메인이 acme:error:caa — DNS problem: SERVFAIL looking up CAA 로 실패. 원인은 hosting.co.kr 네임서버의 간헐적 CAA SERVFAIL. 임시방편(CAA 레코드 추가, 재시도)이 아닌 근본 해결 = 자체 DNS 전환을 택하고, 이를 세분화해 진행.
작업 내역 (Phase A/B/C)
Phase A — DNS 서버 레코드 완성도
| # | 작업 | 결과 |
|---|---|---|
| A1 | CAA 레코드 지원 | qt==257 처리. crowny.org CAA 0 issue/issuewild "letsencrypt.org" 응답. 자체 DNS가 CAA를 정확히 응답 → SERVFAIL 구조적 불가 |
| A2 | TXT 레코드 지원 | qt==16 처리. SPF v=spf1 mx a ~all. DNS-01 챌린지 기반 |
| A3 | MX 레코드 지원 | qt==15 처리. 10 mail.crowny.org 메일 라우팅 |
| A4 | UDP 핸들러 | 완료 — crownyc.c에 버퍼 UDP opcode 3개(853 UDP버퍼수신/854 UDP최근발신자/855 UDP버퍼전송) 추가. DNS서버v3는 소켓폴링으로 TCP+UDP 동시 처리. UDP는 앞 2바이트 패딩으로 TCP 포맷 정규화. 검증 8/8 (UDP 6 + TCP 2) |
| A5 | 존 자동 동기화 | dns-zone-sync.sh — gateway.yaml의 151개 도메인(crowny.org+crownybus.com+tiomta.com)을 DNS서버v3 존 배열로 자동 생성. 54→151 |
| A6 | 비-crowny 도메인 | A5에 흡수 — crownybus.com/tiomta.com 계열 명시 등록 완료 |
Phase B — 안정성
| # | 작업 | 결과 |
|---|---|---|
| B1 | DNS 서버 워치독 | dns-watchdog.sh — crownyc VM SIGTRAP(~8000틱) 대비 자동 재시작. crowny/hybrid 모드에서만 작동, 재시작 폭주 방지(1분 5회 제한) |
| B2 | 헬스 모니터링 통합 | gateway-watchdog.sh에 자체 DNS 상태 추가 (text/brief/json/alert 전 모드) |
Phase C — 전환 인프라
| # | 작업 | 결과 |
|---|---|---|
| C1 | 전환 인프라 점검 | dns-switch.sh — status 도메인 수 동적화(151), pf 포트포워딩 안내 강화(TCP+UDP, pf.conf 통합법), 워치독 프로세스 패턴 불일치 수정 |
긴급 대응 — config 로더 강건화
다른 세션들이 gateway.yaml에 중복 도메인 4개(crd/song/code/game.tiomta.com)를 추가 → 게이트웨이 전체 다운(도메인 중복 throw). 근본 수정: validate()가 중복 시 throw 대신 해당 서비스만 스킵+경고. 144→138개로 정상 가동. 이제 중복 1개가 전체를 죽이지 않음. JS(config.js) + 한선씨(config.한선) 동시 수정.
검증 결과
✓ CAA: crowny.org CAA → 0 issue/issuewild "letsencrypt.org"
✓ TXT: crowny.org TXT → v=spf1 mx a ~all
✓ MX: crowny.org MX → 10 mail.crowny.org
✓ 존 동기화: 151개 도메인, 컴파일 OK
✓ 비-crowny: crownybus.com/tiomta.com 명시 응답
✓ 게이트웨이: 138 서비스 OK, 0 down
✓ DNS 워치독: hosting 모드 게이트 정상
A4 완료 — crownyc 버퍼 UDP opcode
crownyc.c에 버퍼 기반 단일반환 UDP opcode 3개 추가 (소켓 영역 만석 → 853~855 사용):
| opcode | 함수 | 동작 |
|---|---|---|
| 853 | UDP버퍼수신(소켓,크기) | recvfrom → buf_handle, 발신자는 udp_last_from에 기록 |
| 854 | UDP최근발신자() | 마지막 발신자 "IP:포트" 문자열 |
| 855 | UDP버퍼전송(소켓,주소,버퍼) | sendto → 전송바이트 |
DNS서버v3는 소켓폴링(poll 래퍼)으로 UDP+TCP 동시 멀티플렉싱. UDP 수신 버퍼는 앞 2바이트 패딩으로 TCP 포맷(위치 14)에 정규화 → 기존 파싱 함수 재사용.
빌드: cc -O2 -o crownyc crownyc.c -framework Security -framework CoreFoundation (TLS 심볼 링크 필요).
검증: dns-switch.sh test 8/8 통과 — UDP 6(A/CAA/TXT/MX/NS/와일드카드) + TCP 2.
변경된 파일
/Users/ef/CrownyOS/crownyc/
├── DNS서버v3.한선 CAA/TXT/MX 레코드 + 존 151개 + TCP/UDP 동시
├── crownyc.c UDP 버퍼 opcode 853~855
└── hanseonc_high.c UDP버퍼수신/최근발신자/버퍼전송 등록
/Users/ef/crowny-gateway/
├── lib/config.js 중복 도메인 강건화 (throw→skip)
├── lib/config.한선 동일 (한선씨 동반)
├── lib/trident.js 헬스체크 롤링 분산 + 라우터 exact Map
├── scripts/dns-zone-sync.sh 신규 — 존 자동 동기화
├── scripts/존동기화.한선 신규 — 한선씨 동반
├── scripts/dns-watchdog.sh 신규 — DNS 서버 워치독
├── scripts/gateway-watchdog.sh DNS 헬스 섹션 추가
├── scripts/게이트웨이감시.한선 DNS 항목 추가
└── scripts/dns-switch.sh status 동적화 + test UDP/TCP + 패턴 수정
남은 작업 — Phase D (전환 실행, 고정 IP 필요)
기술 블로커는 전부 해결됨. 남은 것은 고정 IP 확보 후 실제 전환:
dns-switch.sh crowny <고정IP> → 공유기 53(UDP+TCP) 포워딩 → hosting.kr NS 레코드 변경 → 전파 검증. 30분 체크리스트 작성 완료.
다음 단계 우선순위
- CAA 레코드를 hosting.kr에 임시 추가 (자체 DNS 전환 전까지 13개 SERVFAIL 완화)
- 고정 IP 확보 → Phase D 전환 실행
- CAA 레코드를 hosting.kr에 임시 추가 (자체 DNS 전환 전까지 13개 SERVFAIL 완화)
- 고정 IP 확보 → Phase D 전환 실행