DNS 질의가 TCP를 사용하는 경우

DNS 관련 포트 설정시 TCP 53번, UDP 53번을 허용해야 한다.
(다시 말해 네임서버 소프트웨어는 TCP도 지원을 할 필요가 있다)

[RFC1123 - 6.1.3.2]
DNS resolvers and recursive servers MUST support UDP, and SHOULD
support TCP, for sending (non-zone-transfer) queries.
https://tools.ietf.org/html/rfc1123#section-6.1.3.2

의무 사항은 아니나 권장이 되는 사항이다.



일반적인 DNS 질의는 UDP를 통해 이루어진다.
DNS 질의과정이 TCP를 쓰는 경우는 다음과 같다.

1. Zone-Transfer(AXFR/IXFR)

Master-Slave 구성시 Zone Transfer가 이루어지는데, 이때는 TCP를 사용하여 Zone File을 주고받는다.

전체 복사인 AXFR, 증분 복사인 IXFR 모두 TCP를 사용한다.



(BIND9 Zone-Transfer 로그)


2. 메시지가 512byte를 초과하는 경우

DNS 메시지에는 UDP 사용시 512byte 제한이 있다.

일반적인 DNS 메시지가 512byte를 초과하는 경우는 거의 없으나,
DNSSEC, IPv6 등에서 512byte를 초과하는 일이 종종 발생한다.

특히, NSEC3 레코드 등은 거의 필수적으로 512byte를 초과한다.


서버에서 주려는 응답이 512byte를 초과하는 경우,
TC Flag를 이용하여 DNS 질의자와 응답자는 TCP를 통해 질의 응답을 진행하게 된다.

(NSEC3 레코드는 사실상 512바이트를 초과할 수 밖에 없다)


요즘은 EDNS0 메커니즘에 의해,
EDNS0을 지원하는 조합이라면 512byte 이상의 UDP 메시지를 보낼 수 있다.
(권장되는 EDNS Payload는 512~4096byte이다)

하지만, 모든 클라이언트가 EDNS0을 지원하는 것은 아니며,
일부 오래된 방화벽이나 네트워크 정책 등에 의하여 512byte가 넘는 UDP 질의응답이 차단될 수도 있다.

댓글