DNS 문제 해결 · 8 min read · Oct 03, 2025
일반 DNS 잘못 구성 오류 문제 해결
일반 DNS 잘못 구성 오류 문제 해결
DNS (도메인 이름 시스템)는 인터넷을 사용하는 대부분의 사람들에게는 잘 알려져 있지 않지만, 모든 사람이 숫자와 IP를 보는 것이 아니라는 점에서 인터넷을 구동하는 실제 보이지 않는 힘입니다. 도메인 이름의 전체 의미는 오늘날 DNS 덕분에 존재합니다.
소개
DNS를 한 줄로 설명하는 가장 간단한 방법은 도메인 이름을 IP 주소에 매핑하는 것입니다. 누가 IE/Firefox에 도메인 이름을 입력할 때 브라우저가 ISP(인터넷 서비스 제공자)의 리졸버에 IP 주소를 요청하는 DNS 요청을 전달하고, 리졸버가 루트 서버에 연락하여 몇 밀리초 만에 IP 주소를 체계적으로 검색하는지 아는 사람이 얼마나 될지 확신할 수 없습니다.
DNS와 그 작동 방식을 이해하는 것은 가장 어려운 컴퓨터 공학 주제 중 하나이며, 대부분의 경험이 풍부한 네트워크 관리자도 DNS 존 파일 작성에 관해서는 이 주제에서 어려움을 겪습니다.
이 기사를 진행하기 전에, 다음은 기억해야 할 가장 중요한 사항입니다. 그렇지 않으면 조금도 이해하지 못할 것입니다.
기억해야 할 사항
- A 레코드는 항상 IP 주소를 포함해야 합니다 (호스트를 IP에 매핑)
A 레코드를 지정할 때는 항상 오른쪽에 IP 주소를 포함해야 합니다. A 레코드는 DNS에서 매우 중요하며, 호스트 이름을 IP에 매핑하는 의미가 없게 됩니다. 그러니 이 점을 기억하세요!
CNAME(별칭)는 호스트 이름을 포함해야 합니다. 여기에는 IP가 없습니다.
NS 및 MX 레코드는 호스트 이름을 포함해야 합니다. IP는 허용되지 않습니다.
DNS 존 파일에서 도메인 이름을 지정할 때는 항상 끝에 점을 사용하세요. 이 점은 매우 중요하며, 이를 잊으면 DNS 구성에 악몽을 겪게 될 것입니다.
예를 들어
example.com. IN NS ns1.example.com.
왜 점이 필요할까요? 단순히 루트 서버에서 쿼리를 시작하라는 것을 알려주기 때문입니다(점으로 표시됨).
- MX 레코드(메일 서버용)는 호스트 이름을 포함해야 하며 IP는 포함하지 않아야 합니다.
일반 DNS 용어 및 그 의미
(i) 글루 레코드
글루 레코드는 NS 레코드와 연결된 A 레코드로, NS 레코드 이름 서버에 “부트스트래핑” 정보를 제공합니다. (RFC 1912 섹션 2.3 참조)
domain.com. IN NS ns1.domain.com.
domain.com. IN NS ns2.domain.com.
ns1 IN A 11.33.55.77
ns2 IN A 22.44.66.88
위의 예에서 우리는 각 NS 레코드를 IP 주소(A 레코드)에 매핑하여 이름 서버를 IP에 바인딩하고 있습니다(즉, 그들을 글루합니다).
(ii) LAME 이름 서버 위임
비권위적 응답을 제공하는 이름 서버는 일반적으로 ‘LAME’이라고 불립니다. 모든 도메인은 최소한 2개의 이름 서버를 가져야 하며, 각 이름 서버에 요청하면 도메인 존 정보가 있는 경우 권위 있는 응답을 받을 수 있습니다. 그렇지 않으면 ‘lame delegation’입니다. RFC 1912 섹션 2.8을 참조하세요.
lame delegation의 예는 다음과 같습니다.
domain.com IN NS ns1.domain.com
domain.com IN NS ns2.example-server.net
ns1.domain.com은 도메인에 대한 존 정보가 있도록 구성되어 있지만 ns2.exserver.net은 제대로 구성되지 않았으며 도메인에 대한 정보가 없습니다. 따라서 ns1은 권위 있게 응답하지만 ns2는 그렇지 않으며, 이는 제대로 설정될 때까지 ‘lame’입니다.
더 깊이 이해하기 위해, dig 도구를 사용하여 example.com을 살펴보겠습니다.
- 먼저 example.com의 이름 서버를 찾습니다:
dig example.com NS;; 응답 섹션:
example.com. 158240 IN NS a.iana-servers.net.
example.com. 158240 IN NS b.iana-servers.net.
- 두 개의 이름 서버를 받았으므로 각 이름 서버가 권위 있는 응답을 제공하는지 확인합니다. 권위 있는 경우 응답에서 ‘aa’ 플래그가 설정됩니다(‘aa’는 권위 있는 응답입니다).
dig @b.iana-servers.net example.com NS
dig @a.iana-servers.net example.com NS
;; 응답을 받았습니다:
;; ->>헤더<<- 작업: 쿼리, 상태: NOERROR, id: 60896
;; 플래그: qr aa rd; 쿼리: 1, 응답: 2, 권한: 0, 추가: 0
;; 질문 섹션:
;example.com. IN NS
;; 응답 섹션:
example.com. 172800 IN NS a.iana-servers.net.
example.com. 172800 IN NS b.iana-servers.net.
플래그를 확인하세요.
플래그: qr aa rd
응답에서 ‘aa’가 설정되어 있으므로 example.com의 두 이름 서버 모두 권위 있는 응답을 제공합니다. 만약 lame delegation이라면 권위 있는 응답을 받지 못할 것입니다.
주의:
CNAME(별칭)를 NS 레코드와 함께 사용하지 마십시오. 이는 대부분의 리졸버를 혼란스럽게 하여 루프를 발생시키고 종종 ‘lame’ delegation으로 이어집니다.
domain.com. IN NS ns1.domain.com.
domain.com. IN NS ns2.domain.com.
domain.com. In CNAME ns9.example-server.net
따라서 NS 레코드와 함께 CNAME을 사용하지 마십시오.
(iii) 스텔스 이름 서버
스텔스 이름 서버(또는 숨겨진 이름 서버)는 도메인 내의 이름 서버와 루트 수준에서 존재하는 불일치/충돌하는 이름 서버입니다.
이를 설명하기 위해, 부모 서버에 도메인에 대한 NS 레코드를 요청할 때 루트 수준에서 다음과 같은 응답을 받습니다.
ns0.domain.com
s2.domain.com
s3.domain.com
하지만 도메인의 이름 서버에 대한 쿼리를 할 때 NS 레코드는 동일하지 않으며 다음과 같이 나타납니다.
ns0.domain.com
s2.domain.com
s.example-dns.net
ns.example-dns.net와 ns3.domain.com이 숨겨져 있으므로 둘 다 ‘스텔스 이름 서버’입니다. 잘못된 것은 없지만, 루트 수준과 DNS 서버 모두에서 스텔스 이름 서버를 두지 않는 것이 좋습니다.
루트 서버 수준에서 NS 레코드를 조회하려면 dig 명령을 사용할 수 있습니다.
dig +trace @K.root-servers.net example.com NS그리고 도메인의 이름 서버 중 하나에 요청합니다.
dig @ns0.domain.com example.com NS두 쿼리 간의 NS 불일치를 확인하세요. 루트 수준에서 이름 서버가 누락된 경우, 누락된 이름 서버를 도메인 등록 기관에 추가하십시오. 도메인 수준에서 누락된 이름 서버가 있는 경우, 도메인의 존 파일에 이름 서버를 추가하고 모든 보조 이름 서버를 업데이트하십시오.
(iv) 오픈 DNS 서버
DNS 서버를 ‘오픈’ 상태로 실행하는 것은 큰 보안 위험입니다. 내부 및 외부 네트워크 모두에서 재귀 쿼리에 응답하기 때문입니다. 이는 누구나 IP 주소에 대한 쿼리를 할 수 있으며, DNS 서버가 응답하게 됨을 의미합니다.
이를 설명하기 위해, example.com 도메인에 대해 bind를 실행하는 두 개의 이름 서버가 있습니다.
ns1.example.com
s2.example.com
ns1.example에 google.com 외부 도메인을 해결하도록 요청하고 응답 섹션에서 IP 주소(A 레코드)를 받으면, 이는 ‘오픈 DNS 서버’임을 의미합니다.
dig @ns1.example.com google.com
dig @ns2.example.com google.com
;; 전역 옵션: printcmd
;; 응답을 받았습니다:
;; ->>헤더<<- 작업: 쿼리, 상태: SERVFAIL, id: 12107
;; 플래그: qr rd; 쿼리: 1, 응답: 0, 권한: 0, 추가: 0
;; 질문 섹션:
;google.com. IN A
;; 쿼리 시간: 32 msec
응답 섹션이나 IP 주소가 없으므로 두 이름 서버 모두 오픈 DNS 서버를 구성하지 않습니다.
bind8 이상을 실행하는 경우, 모든 작업은 ‘recursion no’를 옵션 내에 설정하여 DNS 서버가 재귀 쿼리에 응답하지 않도록 비활성화하면 됩니다.
options {
….
recursion no;
}
(v) 존 전송 (AXFR 요청)
존 전송은 보조 이름 서버가 마스터 또는 기본 이름 서버로부터 도메인에 대한 최신 및 업데이트된 존 정보를 검색하기 위해 수행됩니다. 존 전송은 보조 이름 서버에만 제공되어야 하며, 오픈 세계에는 제공되지 않아야 합니다. 이는 큰 보안 위험이며 공격자에게 네트워크 내부를 노출할 수 있습니다.
example.com에 대한 존 전송을 요청하려면 먼저 마스터 이름 서버에 요청해야 합니다. 아래의 예를 dig로 확인하세요.
dig @ns1.example.com example.com전체 존 파일이 출력되면 존 전송을 비활성화해야 합니다. 대부분의 경우 연결 실패 또는 REFUSED가 표시되며, 이는 존 전송이 허용되지 않음을 의미하며 좋은 일입니다.
존 파일 작성 시 일반 DNS 오류
1. NS 레코드를 가리키는 CNAME 없음
domain.com. IN NS ns1.domain.com.
domain.com. IN NS ns2.domain.com.
domain.com. In CNAME ns9.example-server.net —–> 잘못됨
CNAME을 NS와 함께 배치하면 모든 이름 서버가 실패하고 lame delegation이 발생합니다. 그렇게 하지 마십시오!
RFC1912 2.4 및 RFC2181 10.3을 참조하세요.
2. 동일한 서브넷(/24) 또는 동일한 서버에서 DNS 서버 실행 피하기
DNS의 전체 목적은 이름 서버가 서로 다른 지리적 위치에 분산되어 있어야 하므로 하나의 DNS가 실패하면 다른 DNS가 작동할 수 있도록 하는 것입니다. 두 이름 서버를 동일한 서버나 서브넷에서 실행하는 것은 매우 일반적인 관행이지만, 이는 내결함성을 제공하지 않습니다. 서버가 실패하면 이름 서버도 실패하고 사이트가 로드되지 않습니다.
ns1 IN A 75.33.22.xx —–> 동일한 서브넷 /24
ns2 IN A 75.33.22.xx —–> 동일한 서브넷 /24
3. 적절한 GLUE
항상 A 레코드를 사용하여 NS 레코드에 IP 주소에 대한 글루를 추가하십시오. 그렇지 않으면 이름 서버 중 하나가 실패합니다.
domain.com. IN NS ns1.domain.com.
domain.com. IN NS ns2.domain.com.
ns1 IN A 1.2.3.4 —–> GLUE
ns2 IN A 2.4.6.9 —–> GLUE
RFC1912를 참조하세요.
4. 중복 MX 레코드 없음
domain.com. IN MX mail.domain.com.
domain.com. IN MX mail.domain.com —-> 중복
5. UDP 및 TCP 연결 모두에 대해 포트 53 허용
방화벽을 사용하는 경우 DNS TCP 및 UDP 요청에 대해 포트 53을 차단하지 않도록 하십시오. 기본적으로 DNS 조회는 UDP 프로토콜을 사용하고 존 전송 및 알림은 포트 53의 TCP 프로토콜을 사용합니다.
포트 53 UDP = DNS 요청
포트 53 TCP = 존 전송
6. CNAME은 MX 호스트와 공존할 수 없습니다.
MX 레코드를 가리키는 CNAME 또는 별칭을 지정하지 마십시오.
domain.com. IN MX 10 mail.domain.com.
mail IN CNAME domain.com. ———-> 잘못됨
대신 A 레코드를 사용하여 IP 주소에 직접 매핑하십시오.
mail IN A 11.33.55.77 —> 올바름
RFC1912를 참조하세요.
7. MX 레코드는 IP 주소를 포함해서는 안 됩니다.
domain.com. IN 10 MX mail.domain.com. —-> 올바름
domain.com. IN 20 MX 11.22.33.44 —–> 잘못됨
이것을 올바르게 수행하는 방법은 MX 호스트를 A 레코드에 글루하는 것입니다.
domain.com. IN MX 10 mail.domain.com. —–> 올바름
mail IN A 11.33.55.77 ———-> 올바름
8. NS 레코드는 IP 주소를 포함해서는 안 됩니다.
항상 NS 레코드로 도메인에 대한 이름 서버를 지정하십시오. 이름이어야 하며 IP 주소가 아니어야 합니다.
domain.com. IN NS dns0.domain.com. —–> 올바름
domain.com. IN NS 75.xx.xx.xx ———–> 잘못됨
메일 배달을 위한 리버스 DNS
적절한 메일 배달을 위해 다음의 안티 스팸 방법은 이메일이 사용자 수신함에 배달되도록 보장하는 데 매우 중요합니다. 대부분의 공용 이메일 서비스 제공업체인 yahoo, hotmail 및 gmail은 이러한 매개변수를 사용하여 이메일이 스팸인지 아닌지를 표시합니다.
(i) 메일 서버에 대한 리버스 IP를 DNS에서 PTR로 설정합니다(전용 IP 필요)
(ii) DNS에서 SPF 레코드를 설정합니다
(iii) 도메인 키를 설정합니다
공유 호스팅 계획을 사용하는 경우, 대부분의 이메일이 사용자 수신함의 스팸/대량 폴더에 도착하는 경우를 여러 번 보았습니다. 따라서 전용 서버를 사용하십시오.
메일 서버 IP에 대한 리버스 IP 설정
리버스 IP를 설정하려면 먼저 호스팅 제공업체에 요청을 제출해야 합니다(그들이 IP 주소를 소유하므로) 및 메일 서버에 대한 리버스 IP를 설정해 달라고 요청하십시오. 완료되면 도메인 존 파일에 PTR을 사용하여 한 줄을 추가해야 합니다.
리버스 IP 조회를 테스트하려면:
host 리버스 DNS의 출력을 보여줍니다.
SPF 레코드 설정
SPF 레코드는 DNS 존 파일에서 TXT 레코드를 사용하여 설정됩니다. 아래에 표시된 것처럼 보입니다. 설정 및 구성에 대한 자세한 내용은 http://openspf.org를 방문하십시오.
domain.com. IN TXT “v=spf1 a mx ip4:11.33.55.77 -all”
dig를 사용하여 SPF 레코드를 쿼리하려면:
dig domain.com TXT도메인 키
기본적으로 선택자와 선택자가 없는 두 개의 레코드가 TXT 아래에 생성된 공개 키와 함께 배치됩니다.
‘sel’은 선택자이며 선택자 이름이 될 수 있습니다.
BIND9를 사용하여 도메인에 대한 DNS 이름 서버 설정 방법
리눅스 콘솔로 가서 다음 명령을 입력하십시오.
yum install bind도메인에 대한 새 존 파일을 만들고 샘플 존 파일을 삽입하십시오(아래 참조). domain.com, serial 및 email 매개변수를 변경해야 합니다.
nano /var/named/domain.com.db
/etc/named.conf를 열고 다음 줄을 추가합니다:
zone “domain.com” {
type master;
file “/var/named/domain.com.com.db”;
};
파일에 변경 사항을 저장하고 bind를 재시작합니다.
service named restart BIND용 샘플 DNS 존 파일
이 파일을 사용하여 BIND9에서 도메인과 이름 서버를 설정하십시오:
;=================================================================
;샘플 BIND DNS 존 파일
;모든 도메인에 대해 (domain.com을 사이트로 변경하기만 하면 됩니다)
;================================================================
; 시작하기 전에 점과 시리얼 증가를 잊지 마십시오
$TTL 14400
$ORIGIN domain.com.
; SOA 레코드
; 기본 이름 서버 ns1.domain.com 지정
; 시리얼은 업데이트마다 증가해야 합니다
@ 14400 IN SOA ns1.domain.com. webmaster.domain.com. (
2009092902 ; YYYYMMDDXX 형식의 시리얼 (XX는 증가)
10800; 새로 고침 초
3600; 재시도
604800; 만료
38400; 최소
);
; A 레코드에 지정된 웹사이트 IP 주소
IN A xx.xx.xx.xx
; 최소 2개의 DNS 이름 서버 이름
IN NS ns1.domain.com.
IN NS ns2.domain.com.
; 모든 이름 서버와 해당 IP에 대한 매핑 (GLUE)
ns1 IN A xx.xx.xx.xx
ns2 IN A xx.xx.xx.xx
; CNAME 레코드를 사용하여 여기에서 모든 하위 도메인 및 www 항목을 지정하십시오
www IN CNAME domain.com.
ftp IN CNAME domain.com.
server IN CNAME domain.com.
webmail IN CNAME domain.com.
; MX 레코드 설정 (우선 순위가 있는 메일 교환기)
domain.com. IN MX 10 mail.domain.com.
; 메일에 대한 A 레코드 설정
mail IN A xx.xx.xx.xx;====================================
저자 소개
Mr.Balakrishnan은 인터넷 기업가이자 PHP 프로그래밍 및 리눅스 애플리케이션에 관심이 있는 리눅스 관리자입니다. 그는 자신의 블로그 사이트 corpocrat.com 또는 트위터 페이지에서 연락할 수 있습니다.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.