← 목록
기타 2026-05-22 6KB 읽기 6분

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 서버 레코드 완성도

#작업결과
A1CAA 레코드 지원qt==257 처리. crowny.org CAA 0 issue/issuewild "letsencrypt.org" 응답. 자체 DNS가 CAA를 정확히 응답 → SERVFAIL 구조적 불가
A2TXT 레코드 지원qt==16 처리. SPF v=spf1 mx a ~all. DNS-01 챌린지 기반
A3MX 레코드 지원qt==15 처리. 10 mail.crowny.org 메일 라우팅
A4UDP 핸들러완료 — 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 — 안정성

#작업결과
B1DNS 서버 워치독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함수동작
853UDP버퍼수신(소켓,크기)recvfrom → buf_handle, 발신자는 udp_last_from에 기록
854UDP최근발신자()마지막 발신자 "IP:포트" 문자열
855UDP버퍼전송(소켓,주소,버퍼)sendto → 전송바이트
기존 string 기반 UDP수신(385)은 다중반환이라 고수준 한선씨에서 사용 불가 → 버퍼 기반 단일반환으로 신규.

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분 체크리스트 작성 완료.

다음 단계 우선순위

  1. CAA 레코드를 hosting.kr에 임시 추가 (자체 DNS 전환 전까지 13개 SERVFAIL 완화)
  2. 고정 IP 확보 → Phase D 전환 실행
  3. CAA 레코드를 hosting.kr에 임시 추가 (자체 DNS 전환 전까지 13개 SERVFAIL 완화)
  4. 고정 IP 확보 → Phase D 전환 실행