DNS 쿼리는 항상 UDP를 통해 이동합니까?


33

나는이 주제를 연구하는 데 약간의 시간을 보냈으며 정확한 답변을 찾을 수없는 것처럼 보이므로 중복되지 않으며 상당히 안전하다고 생각합니다. 내 질문은 보안 요구 사항을 기반으로하지만 여전히 안전하다고 생각합니다. 여기로 문의하되 보안 커뮤니티로 옮겨야하는지 알려주십시오.

기본적으로 DNS 쿼리는 TCP를 사용합니까? 그렇다면 어떤 시나리오가 발생할 수 있습니까? 다시 한 번 나는 쿼리에 대해서만 이야기하고 있습니다. 그들이 TCP를 통해 여행 할 수 있습니까? 도메인의 최대 길이가 253 바이트이고 UDP 패킷의 크기가 512 바이트 일 수있는 경우 쿼리가 항상 UDP처럼 나오지 않습니까? 해결 가능한 쿼리가 TCP 사용을 요구할만큼 충분히 클 수 있다고 생각하지 않았습니다. DNS 서버가 253 바이트보다 큰 도메인에 대한 요청을받은 경우 서버가이를 삭제하거나 시도하지 않습니까? 나는 여기에 약간의 잘못된 가정을했다고 확신한다.

상황에 따라 보안 그룹과 협력하여 DNS 쿼리를 보안 모니터링 도구에 내장하고 있으며 여러 가지 이유로 DNS 서버 및 도메인 컨트롤러에서 표준 패킷 ​​캡처를 통해이 트래픽을 캡처하기로 결정했습니다. 핵심 요구 사항은 모든 DNS 쿼리를 캡처하여 클라이언트가 어떤 도메인을 확인하려고 시도했는지 식별 할 수 있도록하는 것입니다. 이 요구 사항을 기반으로, 우리는 DNS 응답 또는 영역 전송과 같은 다른 트래픽 캡처와 관련이 없으며 가능한 한 로그 볼륨을 제한해야한다는 사실에 기인합니다. 따라서 DNS 서버로 향하고 UDP를 통해 전송되는 DNS 쿼리 만 캡처 할 계획입니다. 더 많은 맥락 (여기서는 다양한 질문 범위가 등장)에서 보안을 확장해야 할 필요성이 제기되었습니다. ' 가시성을 통해 DNS를 통해 실행되는 비밀 채널 (DNS 응답 및 TCP 트래픽을 캡처해야 함)과 같은 활동을 모니터링 할 수 있습니다. 그러나 그런 종류의 시나리오에서도 아웃 바운드 DNS 트래픽은 조회 ​​/ 쿼리의 형태가 될 것이며 악성 소스에서 온 경우에도 UDP를 통해 발생한다고 생각했습니다 (첫 번째 단락의 추론 때문에). 따라서 몇 가지 추가 질문이 있습니다.

  • 내가 설명한 접근 방식으로 대화의 절반을 캡처하고 있습니까? 아니면 클라이언트가 쿼리 형식이 아닌 DNS 트래픽을 전송합니까? (DNS 서버의 응답에 대한 일종의 응답과 같으며 TCP를 통해 끝날 수 있습니다)

  • TCP를 사용하도록 DNS 쿼리를 수정할 수 있습니까? DNS 서버가 TCP를 통해 오는 DNS 쿼리를 수락하고 응답합니까?

관련성이 있는지 확실하지 않지만 DNS 요청을 승인 된 DNS 서버로 제한하고 포트 53을 통해 아웃 바운드 된 다른 모든 트래픽을 차단합니다. 확실히 신인이므로 내 질문에 부합하지 않으면 죄송합니다. 어떻게 수정해야합니까?


2
@Alnitak에게 페이징, 우리는 당신의 아기를 논의하고 있습니다. :)
Andrew B

기본 DNS 쿼리가 TCP 모드에서 작동하도록하려면 어떻게해야합니까? . 일부 모드가 포함 된 OS X / macOS q / a이지만 Linux / Windows에서도 작동합니다.
klanomath

물론 오늘날 HTTPS를 통한 DNS와 TLS를 통한 DNS 및 곧 DNS를 통한 QUIC와 함께 ...
Patrick Mevzek

모든 DNS 쿼리를 선택한 (a) 선택한 DNS 서버로 리디렉션하지 않으시겠습니까?
크레이그

답변:


38

일반 DNS 쿼리는 UDP 포트 53을 사용하지만 더 긴 쿼리 (> 512 옥텟)는 '잘린'응답을 수신하므로 전체 쿼리를 쉽게 보내고받을 수있는 TCP 53 대화가 생성됩니다. 또한 DNS 서버는 포트 53에 바인딩되지만 쿼리 자체는 포트 53으로 전송 된 임의의 높은 번호의 포트 (49152 이상)에서 발생합니다. 포트 53에서 동일한 포트로 응답이 반환됩니다.

DNS가 사용하는 네트워크 포트 | Microsoft 문서

따라서 네트워크의 DNS 쿼리에 대해 보안 스누핑을 수행하려는 경우 위의 사항을 고려해야합니다.

조회되지 않은 트래픽의 경우 DNS는 영역 전송 (쿼리 유형 AXFR)을 사용하여 다른 DNS 서버를 새 레코드로 업데이트합니다. 중간 공격에있는 사람은 이러한 전송으로 시작하여 DDOS에서 기본 이름 서버를 작성하여 업데이트 된 레코드를 요청하는 보조에 응답하기에는 너무 바쁩니다. 그런 다음 해커는 동일한 기본 서버를 스푸핑하여 '중독 된'레코드를 보조 서버에 공급하여 인기있는 DNS 도메인을 손상된 호스트로 리디렉션합니다.

따라서 보안 감사는 쿼리 유형 AXFR에주의를 기울여야하며 DNS 시스템은 특정 IP 주소의 AXFR 교환 만 허용해야합니다.

SANS Institute InfoSec 독서실 | sans.org


1
고마워 조지, 정말 유용한 것들! 첫 번째 문장을 빨리 설명하기 위해 UDP 패킷은 512 바이트에 맞을 수 있습니다. 따라서 DNS 쿼리가 512보다 크면 게이트에서 TCP를 통해 시작하지 않습니까? wireshark를 실행하고 nslookup을 사용하여 큰 도메인을 해결하여 직접 테스트했지만 200 자보다 큰 도메인을 시도하지 못하게하는 것 같습니다 (정확한 숫자는 아니지만 요점은이 시나리오를 완전히 테스트 할 수 없다는 것입니다) .
Caderade

3
"쿼리"가 아니라 512 바이트를 초과하는 "응답"이고 클라이언트는 "응답"이 무엇인지 알지 못할 것입니다.
AbraCadaver

7
@Caderade 예, TCP 또는 UDP 일 수 있지만 영역 전송 만 TCP로 시작됩니다. 클라이언트 쿼리는 절단 비트가 설정된 서버로부터 응답을받지 않는 한 UDP입니다. 그런 다음 TCP를 사용할 수 있습니다.
AbraCadaver

1
클라이언트가 작은 응답에 TCP를 사용할 수 있습니까?
Mehrdad

2
"UDP 패킷은 512 바이트 만 수용 할 수 있습니다."아니오, 클라이언트의 버퍼는 512 바이트 만 수용 할 수 있으며 이는 서버가 이런 식으로 동작하도록하는 것입니다. EDNS를 사용하여 더 긴 버퍼를 서버에 알릴 수 있습니다.
Bryan

28

이것은 George의 답변에 대한 주석으로 시작되었지만 시간이 오래 걸렸습니다. 더 큰 그림은 일부 역사를 이해해야하기 때문에 다소 복잡합니다.

  • RFC 1035는 원래 UDP 조각화를 피하기 위해 512 바이트 제한을 요구했습니다. DNS 트랜잭션의 오버 헤드를 최소화하기 위해 조각난 UDP 데이터 그램과 TCP를 최후의 옵션으로 선택했습니다. 영역 전송은 본질적으로> 512 바이트를 차지하므로 영역 전송은 항상 TCP를 사용합니다. (UDP로 시작하기에는 대역폭 낭비가 될 것입니다)

  • 절단시 TCP 재 시도는 1989 이후 RFC 1123 에 지정된대로 널리 지원됩니다 .

  • EDNS (0)은 RFC 6891 (2013)에 의해 정의되었으며 그 이전에는 1999 년으로 거슬러 올라간 제안 된 표준으로 존재했습니다 . 클라이언트와 서버가 512보다 큰 UDP 크기를 협상 할 수있는 메커니즘을 정의합니다. EDNS (0)의 새로운 기능으로 인해 많은 하드웨어 어플라이언스는 호환 패킷을 버리는 DNS 패킷의 구조에 대해 가정합니다. 가장 빈번한 이유는 512 바이트가 넘는 DNS 메시지가 유효하지 않다고 가정하기 때문입니다.

이를 관찰 된 동작으로 분류하면 :

  1. 회신이 너무 커서 처음에는 알 수없는 경우가 아니면 DNS 쿼리는 일반적 으로 UDP로 시작합니다. (존 전송)
  2. 회신은 할 수 잘린 응답이 보이는 경우 클라이언트에서 TCP 재시을 트리거합니다. 이것은 상당히 잘 지원됩니다.
  3. 512 바이트 초과의 UDP 응답이 있다 클라이언트가 더 큰 페이로드를 광고 (0)를 사용한 경우 EDNS 보이는, 수 수신 서버가 지원 그것. 이는 두 하드웨어 사이에있는 하드웨어가 방해를받지 않고 패킷이 손실되거나 엉망 이되는 경우 에만 발생 합니다 .
  4. 클라이언트 응답이 보이지 않으면 광고 페이로드가 더 작은 EDNS (0) 쿼리를 다시 시도하도록 선택할 있지만 구현에 따라 세부 사항이 다를 수 있습니다.
    • 마지막으로 응답하는 응답이 요청 된 크기에 맞지 않을 수 있으므로 위의 동작 # 2가 발생할 수 있습니다. (예전 TCP 재시도)
    • 클라이언트 측은 최종적으로 성공한 크기를 기억하도록 선택할 있습니다. 이를 통해 불필요한 쿼리를 다시 조사하지 않아도됩니다. 그렇지 않으면 특히 최종 결과에 TCP 폴 백이 필요한 경우 상당히 낭비가됩니다.

RFC 7766은 TCP를 통한 연결 재사용을 허용 하며 TCP를 통한 쿼리 파이프 라이닝이 발생할 있음을 명심해야합니다 . 일부 도구 TCP 세션에서 처음 보이는 것 이상으로 DNS 쿼리를 감지 하지 못합니다 . dnscap은 그러한 예입니다.


잘라 내기 비트를 설정하는 이유 중 하나는 RRL (Response Rate Limiting)입니다. DNS 증폭 완화 기술로서 서버는 잘린 패킷을 보내 잘 동작하는 클라이언트를 TCP로 전환하여 가짜 주소의 패킷에 대한 회신을 막을 수 있습니다.
Edheldil

연결 재사용 : 리졸버에게 scantycladladies.com을 요청하기 전에 먼저 google.com을 요청하도록 지시하면 dnscap은 알 수 없습니다. ;-)
Lenne

6

이다 RFC 7766는, TCP를 통해 DNS 운송 - 구현 요구 사항 .

  1. 소개

대부분의 DNS [ RFC1034 ] 트랜잭션은 UDP [ RFC768 ]를 통해 발생 합니다. TCP [ RFC793 ]는 항상 전체 영역 전송 (AXFR 사용)에 사용되며 크기가 DNS 프로토콜의 원래 512 바이트 제한을 초과하는 메시지에 종종 사용됩니다. DNS 보안 (DNSSEC) 및 IPv6의 배포가 증가함에 따라 응답 크기가 증가하여 TCP 사용이 증가했습니다. 또한 TCP 스푸핑을 방지하고 리플렉션 / 앰프 공격에서 DNS를 악용 할 수있는 보호 기능으로 인해 TCP 사용이 증가해야했습니다. 응답 속도 제한 [ RRL1 ] [ RRL2 ]에 널리 사용됩니다 . 또한 [ DNS-over-TLS 와 같은 DNS 개인 정보 보호 솔루션에 대한 최근 연구]는 DNS-over-TCP 요구 사항을 다시 방문하려는 또 다른 동기입니다.

[RFC1123] 상태 6.1.3.2 절 :

  DNS resolvers and recursive servers MUST support UDP, and SHOULD
  support TCP, for sending (non-zone-transfer) queries.

그러나 일부 구현자는 TCP 지원이 DNS 프로토콜의 선택적 기능이라는 것을 의미하기 위해 위에서 인용 한 텍스트를 사용했습니다.

대부분의 DNS 서버 운영자는 이미 TCP를 지원하며 대부분의 소프트웨어 구현에 대한 기본 구성은 TCP를 지원하는 것입니다. 이 문서의 주요 대상은 TCP에 대한 제한된 지원이 상호 운용성을 제한하고 새로운 DNS 기능의 배포를 방해하는 구현 자입니다.

따라서이 문서는 TCP 지원이 전체 DNS 프로토콜 구현의 필수 부분이되도록 핵심 DNS 프로토콜 사양을 업데이트합니다.

TCP 사용 증가 ( 부록 A 참조 )와 고려해야 할 구현 세부 사항 에는 몇 가지 장점과 단점 이 있습니다. 이 문서는 이러한 문제를 해결하고 TCP를 DNS의 올바른 전송 대안으로 제시합니다. DNS 및 기타 인터넷 프로토콜에서 TCP의 연구, 개발 및 구현을 통해 얻은 추가 고려 사항 및 교훈과 함께 [ RFC5966 ] 의 내용을 확장합니다 .

이 문서는 DNS 서버 운영자가 충족해야 할 특정 요구 사항을 제시하지는 않지만 서버와 네트워크에서 TCP를 최적으로 지원할 수 있도록 운영자에게 몇 가지 제안을 제공합니다. TCP (또는 네트워크 계층에서 TCP를 통한 DNS 차단)를 지원하지 않으면 해결 실패 및 / 또는 응용 프로그램 수준 시간 초과가 발생할 수 있습니다.


2
론-게시하기 전에 실제로 RFC를 읽었지만, 예를 들어 첫 번째 단락을 보면 TCP가 더 큰 응답을 지원해야한다는 점이 강조됩니다. 응답 크기가 증가하여 TCP 사용이 증가했습니다. " 다시, 내 질문은 쿼리에 관한 것이었지만 어쨌든 감사합니다.
Caderade

4
RFC는 DNS가 TCP를 지원해야한다는 것을 분명히하고 클라이언트가 TCP를 사용하는 것에 대해 논의합니다. 예를 들어 " DNS에 TCP를 사용하는 클라이언트는 항상 연결을 다시 설정하거나 미해결 쿼리를 다시 시도 할 수 있도록 준비해야합니다. "
Ron Maupin

좋은 지적. 추가 된 명확성을 감안할 때 실제로 의견이 도움이되었다고 말하고 싶습니다. 내 요점은, 실제로 RFC를 읽었으며 여전히 TCP를 사용하여 쿼리를 시작할 수 있다는 것이 명확하지 않았으므로 답을 위해 RFC를 덤프하면 코믹하지만 실제로는 도움이되지 않았습니다. 쿼리는 UDP를 통과하고 응답이 너무 큰 경우 DNS 서버는 클라이언트에게이를 시작하고 TCP를 통해 수행해야한다는 것을 알려줍니다. 따라서 원래 요청을 캡처했기 때문에 여전히 원래 요구 사항을 충족한다고 생각했습니다. 어쨌든 귀하의 의견에 감사드립니다.
Caderade

1
INTERNET STANDARDRFC는 tools.ietf.org/html/rfc1034 . PROPOSED STANDARDTCP를 요구하기 위해 a 를 인용하고 있습니다.
AbraCadaver

3
그것은 같은 것에 대해 이전의 표준 트랙 RFC를 업데이트 한 표준 트랙 RFC입니다. 서버 결함대한이 답변 은 그러한 것들을 설명합니다. 참조하는 문서에서도 " 인터넷에서 쿼리는 UDP 데이터 그램 또는 TCP 연결을 통해 전달됩니다. "RFC 7766은 TCP가 DNS의 선택적 부분이 아니라 필수 요소임을 명확히하는 것입니다.
Ron Maupin

3

TCP / 53을 어떤 방향으로도 필터링해서는 안됩니다. 예를 들어 nsupdate요청이 너무 크면 (빠르게 발생할 수있는) 쿼리가 TCP를 사용할 수 있습니다. 따라서 포트 53 (IPv4 및 V6!)의 UDP 및 TCP가 모든 방향으로 흐르도록해야합니다.

또한 TLS를 통한 DNS에 대한 작업이 점점 더 많아지고 있으므로 TCP는 양방향으로 필요합니다. RFC7858을 참조하십시오.


질문은 필터링과 아무 관련이 없으며, 귀하의 답변은 다른 답변보다 아무 것도 추가하지 않습니다
Bryan

@Bryan 귀하의 매우 유용하고 유용한 의견에 감사드립니다!
Patrick Mevzek

@PatrickMevzek 이해-내가 말하려는 것은 포트 53을 통해 경계를 넘어 특정 IP 주소로의 트래픽 만 허용한다는 것입니다 (TCP 및 UDP는 허용됨).
Caderade
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.