전달자 DNS 요청을 TCP 모드로 강제


9

멀티 홈 서버에서 SLES10 (현재 바인드 9.6)에 DNS 서버를 설정했습니다. 이 서버는 모든 내부 네트워크에서 쿼리 할 수 ​​있으며 모든 내부 네트워크에 대한 답변을 제공합니다. 두 개의 개별 DNS "마스터"영역이 있습니다. 이러한 각 영역에는 여러 신뢰할 수있는 Windows-DNS 서버가 제공됩니다.

이제 내 linux-server는 이러한 영역 중 하나 (개인 내부 영역)의 보조 DNS 서버이며 다른 영역 (공용 내부 영역)의 전달자 역할을합니다.

최근까지이 설정은 문제없이 작동했습니다. 이제 공개 내부 영역을 쿼리하면 (예 : hostLinux 클라이언트 의 명령으로) 오류 메시지가 표시됩니다.

;; TCP 모드에서 잘려서 재시도

wireshark-dump는 그 원인을 밝혔습니다. 첫 번째 쿼리는 UDP 모드에서 나오고 응답은 신뢰할 수있는 NS의 긴 목록으로 인해 UDP에 맞지 않으며 TCP 모드에서 다시 시도하여 올바른 답을 제공합니다.

이제 질문 : UDP를 먼저 시도하지 않고 TCP 모드에서 전달자를 쿼리하도록 바인드를 구성 할 수 있습니까?

업데이트 : ASCII 아트에 손을 대는 중 ...

+--------------+   +--------------+   +-----------------+
| W2K8R2 DNS   |   | SLES 10 DNS  |   | W2K8R2 DNS      |
| Zone private +---+ All internal +---+ Zone public     |
| internal 2x  |   |   Zones      |   | internal 30+ x  |
+--------------+   +-+----------+-+   +-----------------+
                     |          |
                  +--+---+   +--+---+
                  |Client|   |Client|
                  +------+   +------+

이것의 작은 다이어그램이 유용 할 것입니다-귀하의 설명에서 어떤 서버가 어떤 것인지 알아 내려고 고심하고 있습니다.
Alnitak

host명령을 실행하는 호스트 와 어떤 쿼리가 전송되는지는 아직 확실하지 않지만 다소 나아 집니다.
Alnitak 2012 년

클라이언트는 SLES10을 통해 영역 공개 내부에서 항목을 요청합니다. 2 개의 NS 항목 만 있기 때문에 영역 개인 내부에는 문제가 없습니다.
Nils

고객은 단순한 스텁 해결 자입니까?
Alnitak 2012 년

minimal-responses: yesSLES 10의 BIND 구성에 추가 하는 것이 좋습니다 . 응답 크기가 줄어들 수 있습니다. 어쨌든 대부분의 일반 쿼리는 512 바이트 제한을 초과하지 않습니다.
Alnitak

답변:


8

먼저, 나는 그것을 오류라고 부르지 않고 단지 정보 메시지라고 부릅니다.

둘째, DNS 서버는 항상 UDP 쿼리에 응답하고 (적어도 UDP를 비활성화하는 옵션을 찾을 수 없음) 클라이언트는 항상 UDP 쿼리를 먼저 보내려고합니다 (예 : resolv.conf에 옵션을 변경하는 옵션이 없음) 또는 JVM에서)-UDP 패킷에 맞는 경우 (요청은 보통)

특정 유스 케이스가있는 경우 TCP를 사용하도록 지정할 수 있습니다 (예 : 쉘 스크립트에서 'dig + tcp'또는 'host -T'사용). 시스템 호출 'sethostent / gethostbyname / endhostent'를 사용할 수 있습니다 (man 참조) 다른 경우 TCP 강제로).

실제로 UDP를 시도하고 차단하려는 경우 iptable 규칙을 사용하는 것이 유일한 옵션이지만 해당 설정이 작동하는지 확실하지 않습니다. DNS 확인이 실패 할 것으로 예상합니다.


UDP 쿼리가 실패한다는 우선 순위 를 알고 TCP를 먼저 시도 하면 성능상 이점이 있습니다 . 이에 대한 논의는 RFC 5966을 참조하십시오.
Alnitak

@Alnitak와 나는 그 혜택을 얻고 싶습니다.
Nils

1
@Nils 우리는 왜 EDNS가 작동하지 않는지 알아 내야합니다 ...
Alnitak

특별한 유스 케이스가 없습니다-클라이언트가 리졸버 라이브러리를 사용하지만 각 요청과 각 답변은 네트워크를 두 번 통과합니다.
Nils

@ Nils, 문제는 클라이언트가 UDP / TCP를 결정하지만 서버가 답의 크기를 알고 있다는 것입니다.
Dan Andreatta

4

BIND 서버 EDNS (RFC 2671 참조)를 사용하여 512 바이트보다 긴 UDP 패킷을 허용해야합니다.

options {
    edns-udp-size 4096;
    max-udp-size 4096;
};

이를 통해 다른 소규모 쿼리에 대한 TCP 연결 오버 헤드없이 UDP를 통해 대규모 NS 세트를 검색 할 수 있습니다.

그러나 이는 실제로 기본값입니다. EDNS를 사용하지 않는 경우 무언가를 차단하거나 EDNS 옵션을 수신하는 서버가이를 지원하지 않습니다.

또한 hostEDNS를 지원하지 않습니다. 전달자-> 서버 쿼리가 이미 EDNS를 사용 중일 수 있으며 로컬 클라이언트로 시도해도 볼 수 없습니다.

시도 dig +bufsize=4096 @server hostname A를 사용하는 대신 host.


누가 이것을 사용해야합니까? 아마도 "공공 내부"영역의 서버와 전달자 모두입니까?
Nils

어쨌든 대답에 NS의 전체 목록을 보내는 의미는 무엇입니까?
Nils

@Nils DNS 프로토콜을 사용하려면 동일한 (QNAME, QTYPE 및 QCLASS) 튜플과 일치하는 전체 항목 세트를 나눌 수 없어야합니다 (일명 "RRset")
Alnitak

이 RRset에 대해 RFC를 알려주시겠습니까?
Nils

1
Actaully 호스트는 표준 리졸버 라이브러리를 사용하며 내 워크 스테이션에서 EDNS0을 지원합니다. 요청이 EDNS0을 지정하는지 테스트하려면 'tcpdump -x port 53'을 실행하고 16 진 덤프에는 OPT RR의 2 진 표시 인 0029 1000 0000 8000 0000 시퀀스 (추가 섹션의 끝을 향하여)가 포함되어야합니다.
Dan Andreatta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.