DNS 존 파일 검사기
존 파일은 표처럼 생겼지만 프로그램처럼 동작합니다. 줄이 공백으로 시작한다는 이유만으로 앞줄의 소유자 이름을 물려받고, 끝에 마침표가 없는 이름에는 현재 오리진이 조용히 덧붙어 `www IN CNAME example.com`이 example.com.example.com.으로 바뀝니다. 파일 중간의 $ORIGIN이나 $TTL 지시자는 그 아래 모든 줄의 의미를 바꾸고, 괄호로 여러 줄에 걸쳐 쓴 레코드는 들여쓰기와 무관하게 한 개의 레코드입니다. 이 도구는 RFC 1035 5장이 정의한 그대로 파일을 해석합니다. 따옴표 문자열, 주석, 역슬래시 이스케이프, 괄호 연결, BIND 8 스타일 TTL 단위, 소유자 상속 규칙을 모두 처리한 뒤 파일이 실제로 기술하는 존을 보여 줍니다. 소유자 이름은 완전한 형태로, TTL은 서버가 실제로 응답할 값으로, 타입별 개수와 함께 표시됩니다. 해석에 더해 파서가 굳이 하지 않는 검사도 수행합니다. 마침표가 빠져 오리진이 덧붙는 이름, RFC 1034가 금지하고 대부분의 서버가 로드 자체를 거부하는 CNAME과 다른 레코드의 이름 충돌, 스스로에게 되돌아오는 CNAME 사슬, 존 안에 있으면서 주소 레코드가 없는 MX·NS·CNAME 대상, TTL 0, 중복 레코드, 조용히 버려지는 오리진 밖 이름, 날짜 형식이 아닌 시리얼, 오타를 며칠씩 캐시에 남길 만큼 긴 네거티브 캐시 TTL을 각각 해당 줄 번호와 함께 알려 줍니다. 해석 실패도 마찬가지로 줄 번호와 그 줄의 내용을 함께 보여 줍니다. 다만 이 도구는 존의 내용이 사실인지는 알 수 없습니다. 네트워크에 질의하지 않으므로, 적어 둔 주소가 그 호스트의 실제 주소인지, 위임한 네임서버가 정말 응답하는지, 붙여넣은 TXT 값이 사업자가 기대하는 값과 같은지는 확인하지 못합니다. 또한 실행 중인 존이 아니라 파일을 검사하므로 데이터베이스에서 생성되는 레코드, 질의 시점에 확장되는 와일드카드, 다른 존에 있는 CNAME 대상은 시야 밖입니다. 실제 응답은 DNS 조회 도구로 확인하고, 이 도구는 파일을 올리기 전 마침표 하나가 아직 아무 대가도 요구하지 않을 때 쓰세요.
아래 표의 소유자 이름은 모두 완전한 형태로 펼쳤고, TTL은 서버가 실제로 응답할 값입니다.
레코드
14
이름
7
타입
8
지적 사항
5
파일 끝에서의 $ORIGIN
example.com.
기본 TTL
3600 ($TTL에서)
주 네임서버
ns1.example.com.
MNAME입니다. 보조 서버가 존을 전송받는 마스터이자 NOTIFY를 보내는 서버입니다.
관리자 메일 주소
hostmaster@example.com
도메인 이름 형태로 적은 RNAME이며, 첫 레이블이 주소의 로컬 파트입니다.
시리얼
2026090301
이 값이 커질 때만 보조 서버가 존을 다시 전송받습니다. 32비트 시리얼 산술로 비교합니다.
Refresh
7200 (2h)
NOTIFY가 도달하지 못했을 때 보조 서버가 시리얼을 다시 확인하는 주기입니다.
Retry
3600 (1h)
갱신에 실패한 보조 서버가 다시 시도하기까지 기다리는 시간입니다.
Expire
1209600 (2w)
이 시간 동안 전송에 한 번도 성공하지 못하면 보조 서버는 해당 존에 응답을 중단합니다.
네거티브 캐시 TTL
300 (5m)
RFC 2308 이후 이 값은 NXDOMAIN 응답을 캐시하는 시간의 상한입니다. 존의 기본 TTL이 아닙니다.
- 오류줄 19끝에 마침표가 없어 오리진이 뒤에 붙습니다example.com → example.com.example.com.
- 오류줄 20끝에 마침표가 없어 오리진이 뒤에 붙습니다shops.myprovider.net → shops.myprovider.net.example.com.
- 경고줄 19대상이 이 존 안에 있지만 주소 레코드가 없습니다CNAME → example.com.example.com.
- 경고줄 20대상이 이 존 안에 있지만 주소 레코드가 없습니다CNAME → shops.myprovider.net.example.com.
- 경고줄 21TTL이 0이면 이 레코드는 전혀 캐시되지 않습니다old.example.com. A
| 소유자 | TTL | 클래스 | 타입 | 데이터 |
|---|---|---|---|---|
| example.com. | 3600 | IN | SOA | ns1.example.com. hostmaster.example.com. 2026090301 7200 3600 1209600 300 |
| example.com. | 3600 | IN | NS | ns1.example.com. |
| example.com. | 3600 | IN | NS | ns2.example.com. |
| example.com. | 3600 | IN | A | 192.0.2.10 |
| example.com. | 3600 | IN | AAAA | 2001:db8::10 |
| example.com. | 3600 | IN | MX | 10 mail.example.com. |
| example.com. | 3600 | IN | TXT | "v=spf1 mx -all" |
| example.com. | 3600 | IN | CAA | 0 issue "letsencrypt.org" |
| ns1.example.com. | 3600 | IN | A | 192.0.2.1 |
| ns2.example.com. | 3600 | IN | A | 192.0.2.2 |
| mail.example.com. | 3600 | IN | A | 192.0.2.3 |
| www.example.com. | 3600 | IN | CNAME | example.com.example.com. |
| shop.example.com. | 3600 | IN | CNAME | shops.myprovider.net.example.com. |
| old.example.com. | 0 | IN | A | 192.0.2.9 |
모든 처리는 브라우저 안에서 이루어집니다. 파일은 업로드되지 않고 네트워크 조회도 하지 않습니다.
사용법
- 존 파일을 상자에 붙여넣습니다. 내용은 브라우저 안에만 남고 업로드나 조회는 일어나지 않습니다.
- 파일이 $ORIGIN으로 시작하면 오리진 칸은 비워 둡니다. 그렇지 않다면 서버 설정에 적힌 존 이름을 그대로 입력하세요. 같은 파일도 오리진이 다르면 의미가 달라집니다.
- 해석에 실패하면 줄 번호와 그 아래 출력된 줄을 확인하세요. 오류는 파서가 포기한 위치에 표시되므로, 닫히지 않은 따옴표나 괄호는 실수한 줄보다 한 줄 뒤로 나올 수 있습니다.
- SOA 패널을 확인하세요. 관리자 주소는 이메일 형태로 바꿔 보여 주고, 각 타이머는 초 값과 사람이 읽기 쉬운 형태를 함께 표시합니다.
- 지적 사항을 위에서 아래로 처리하세요. 오류, 경고, 참고 순으로 정렬되며 각 항목의 줄 번호로 문제 레코드를 바로 찾을 수 있습니다.
자주 묻는 질문
- CNAME이 왜 example.com.example.com.으로 바뀌나요?
- 대상 이름 끝에 마침표가 없었기 때문입니다. 마스터 파일에서 마침표로 끝나지 않는 이름은 모두 현재 오리진에 대한 상대 이름이고, 파서는 "example.com"이 완전한 도메인 이름을 의도한 것인지 존 안의 example.com이라는 호스트를 뜻하는지 알 방법이 없습니다. 이 규칙은 CNAME뿐 아니라 모든 이름 필드에 적용되어 MX·NS·SRV 대상과 SOA의 주 서버에도 똑같이 오리진이 붙습니다. 존 밖을 가리키는 이름에는 항상 마침표를 찍고, 존 안의 이름은 레이블만 쓰는 습관이 사고를 막아 줍니다.
- $TTL이 없는 파일은 오류인가요?
- 꼭 그렇지는 않습니다. RFC 1035에는 $TTL 지시자 자체가 없었고 RFC 2308이 이를 추가하며 필수로 정했지만, dnspython을 포함한 대부분의 파서는 여전히 TTL이 없는 레코드에 SOA의 minimum 값을 사용합니다. SOA가 첫 레코드라면 SOA 자신의 TTL도 minimum에서 옵니다. 반대로 SOA와 $TTL이 모두 나오기 전에 TTL 없는 레코드가 나오면 물려받을 값이 없으므로 진짜 오류입니다. 이 도구는 그런 대체를 참고 항목으로 알리고 실제로 쓰인 값을 보여 줍니다.
- 이름과 타입이 같은 레코드의 TTL이 서로 다르면 어느 쪽이 이기나요?
- 엄밀히 말하면 어느 쪽도 아닙니다. 이름과 타입이 같은 레코드들은 하나의 RRset을 이루고 RRset은 하나의 TTL로 응답되므로, 파일이 여러 값을 주면 로더는 가장 작은 값을 남기고 로그에 경고도 남기지 않습니다. 결과적으로 60초짜리 레코드 옆의 86400초짜리 레코드도 60초가 되며, 대개 작성자의 의도와 정반대입니다. 이 도구는 표에 실제 적용될 TTL을 보여 주고, 값이 덮인 줄마다 표시를 남깁니다.
- 존 밖 이름의 레코드가 왜 표에 없나요?
- 그 레코드가 존에 들어가지 않기 때문입니다. 로더는 소유자 이름이 존 오리진과 같거나 그 아래인 레코드만 보관하고, 나머지는 존 밖 데이터로 보아 거부하지 않고 조용히 버립니다. 정방향 존에 붙여넣은 PTR 레코드나 $ORIGIN 줄 뒤에 남은 이전 오리진 기준 레코드가 파일은 정상으로 로드되는데도 사라지는 이유가 이것입니다. 이 도구는 버려지는 이름을 지적 사항으로 나열해 최소한 눈에 보이게 합니다.
- TXT 레코드는 255자를 넘길 수 있나요?
- 레코드 전체는 넘길 수 있지만 그 안의 문자열 하나는 넘길 수 없습니다. DNS의 character-string은 길이를 1옥텟으로 표현하므로 255가 절대 한계이고, 더 긴 따옴표 문자열은 잘리는 것이 아니라 문법 오류가 됩니다. 긴 DKIM이나 SPF 값은 한 레코드 안에 여러 조각으로 나눠 "앞부분" "뒷부분"처럼 쓰면 서버가 사이에 아무것도 넣지 않고 이어 붙입니다. 리졸버는 조각을 애플리케이션에 그대로 전달하므로 임의의 지점에서 잘라도 복원되지만, 순서가 맞아야 합니다.
- 문법이 맞으면 DNS가 잘 동작한다는 뜻인가요?
- 아닙니다. 해석이 성공했다는 것은 문법이 맞다는 뜻이고 여기 추가 검사는 내부 일관성 일부를 확인할 뿐입니다. 상위 존이 내 네임서버로 위임하는지, 그 서버들이 이 버전을 로드했는지, 주소에 실제로 닿는지, 올린 시리얼이 보조 서버가 가진 값보다 정말 큰지는 파일만으로 알 수 없습니다. 특히 시리얼 비교는 32비트 순환 산술이라, 날짜를 잘못 입력해 값이 작아지면 숫자가 충분히 한 바퀴 돌 때까지 보조 서버가 옛 존에 머무를 수 있습니다.
관련 도구
DNS 레코드 참조
DNS 레코드 타입 검색 가능한 치트시트 — A·AAAA·CNAME·MX·TXT·NS·SOA·PTR·SRV·CAA·DNSSEC·SVCB / HTTPS — 예시 포함.
TXT 레코드 분할기 (255바이트 청크)
긴 SPF·DKIM·DMARC TXT 레코드를 DNS 프로토콜이 요구하는 255바이트 청크로 분할 — BIND·일반 zone 파일·Cloudflare·Route 53 문법 출력.
DKIM 레코드 빌더 & 파서
DKIM DNS TXT 레코드를 만들거나 분석 — 공개키와 selector·키 타입·해시·플래그를 넣으면 전체 레코드와 255자 초과용 청크 버전까지 나옵니다.
CAA 레코드 빌더 (DNS 인증 기관 권한 제한)
CAA (Certificate Authority Authorization) DNS 레코드 생성 — 신뢰하는 CA만 도메인의 TLS 인증서를 발급할 수 있도록 제한.
정적 라이브러리(.a) 분석기
.a 아카이브를 브라우저에서 읽습니다. 멤버의 크기와 날짜, 각 오브젝트가 정의하고 필요로 하는 심볼, 그리고 심볼 인덱스가 낡았는지까지 보여줍니다.
TZif(zoneinfo) 파일 검사기
컴파일된 zoneinfo 파일을 브라우저에서 엽니다. 헤더, 지역 시간 타입, 모든 전이, 윤초, POSIX TZ 푸터까지 해석합니다.