DNS A 레코드가 가질 수있는 최대 IP 수는 얼마입니까?


30

이상한 생각이 있습니다. 여러 사람 / 조직이 동일한 응용 프로그램을 호스트하게하고 단일 도메인 이름을 통해 모든 노드에 액세스 할 수있게하십시오. 유용성을 희생하지 않는 실제로 분산 된 소셜 네트워크를 갖기 위해 (예 : 사용자는 다른 제공자 URL을 기억할 필요가 없으며 한 제공자가 다운되면 다른 제공자 URL로 전환)

이를 달성하기 위해 여러 IP를 가진 DNS 레코드를 사용할 수 있다고 생각했습니다.

그렇다면 단일 DNS A 레코드는 몇 개의 IP를 보유 할 수 있습니까? 이 답변 은 약 30 개이지만 유스 케이스는 다릅니다. 위의 시나리오에서 다른 ISP가 다른 30을 캐시하는 한 주어진 ISP가 30을 캐시하는지 여부는 신경 쓰지 않습니다.


2
당신은 Anycast 에 대해 복용하고 있습니까?
Lie Ryan

4
얼마 전에 "X의 최대 개수는 얼마입니까?" 당신은 아마 그것을 잘못 사용하고 있습니다 ...
LordOfThePigs

반드시;)은 아니지만 일반적으로 예
Bozho

답변:


78

면책 조항 : 위반은 없지만 이것은 정말 나쁜 생각입니다. 나는 누군가가 이것을 실제 생활에서하는 것을 권장하지 않습니다.

그러나 지루한 IT 담당자에게 실험실을 제공하면 재미있는 일이 일어날 것입니다!

이 실험에서는 Server 2012 R2에서 실행되는 Microsoft DNS 서버를 사용했습니다. Active Directory에서 DNS 영역을 호스팅하는 복잡한 문제로 인해 AD 통합 이 아닌 testing.com이라는 새 기본 영역을 만들었습니다 .

이 스크립트를 사용하여 :

$Count = 1
for ($x = 1; $x -lt 256; $x++)
{
    for ($y = 1; $y -lt 256; $y++)
    {
        for ($z = 1; $z -lt 256; $z++)
        {
            Write-Host "1.$x.$y.$z`t( $Count )"
            $Count++
            dnscmd . /RecordAdd testing.com testing A 1.$x.$y.$z
        }
    }
}

testing.testing.com.말 그대로 1.1.1.1에서 1.1.255.255까지 모든 IPv4 주소 를 사용하여 name에 대한 65025 호스트 레코드를 오류없이 작성 했습니다.

그런 다음 65536 (2 ^ 16 비트) 총 A 레코드 수를 오류없이 깰 수 있기를 원했기 때문에 16581375 (1.1.1.1 ~ 1.255)까지 갔다고 가정합니다. .255.255)) 저는 여기 앉아서 밤새이 스크립트가 실행되는 것을보고 싶지 않았습니다.

너무 많은 기록

따라서 서버의 IP가 다른 동일한 이름의 영역에 추가 할 수있는 A 레코드 수에는 실질적인 제한이 없다고 말하는 것이 안전하다고 생각합니다.

그러나 실제로 고객의 관점에서 작동 합니까?

Wireshark에서 본 클라이언트에서 얻는 것은 다음과 같습니다.

두 개의 질문 전체 크기를 보려면 새 브라우저 탭에서 이미지를여십시오.

nslookup

TCP 쿼리

보시다시피, 클라이언트에서 nslookup 또는 ping을 사용하면 UDP와 TCP라는 두 가지 쿼리가 자동으로 발행됩니다. 아시다시피, UDP 데이터 그램에 넣을 수있는 최대 용량은 512 바이트이므로, 한도 (20-30 개의 IP 주소와 같이)가 초과되면 TCP를 대신 사용해야합니다. 그러나 TCP를 사용하더라도 testing.testing.com에 대한 아주 작은 A 레코드 하위 집합 만 얻습니다. TCP 쿼리 당 1000 개의 레코드가 반환되었습니다. 라운드 로빈 DNS가 작동하는 것과 정확히 같은 방식으로 연속 쿼리마다 A 레코드 목록이 1 씩 올바르게 회전합니다. 이 모든 것을 통해 로빈을 반올림하려면 수백만 개의 쿼리가 필요합니다.

이것이 어떻게 확장 가능하고 탄력적 인 소셜 미디어 네트워크를 만드는 데 도움이 될지는 모르겠지만 그럼에도 대답은 있습니다.


편집 : 후속 의견에서 이것이 일반적으로 나쁜 생각이라고 생각하는 이유를 묻습니다.

  • 내가 평균 인터넷 사용자이고 귀하의 서비스에 연결하고 싶다고 가정 해 봅시다. 웹 브라우저에 www.bozho.biz를 입력합니다. 내 컴퓨터의 DNS 클라이언트는 1000 개의 레코드를 다시받습니다. 불행히도, A 레코드 목록이 최신 상태로 유지되지 않거나 인터넷 덩어리에 영향을 미치는 대규모 중단이 있기 때문에 목록의 처음 30 개 레코드가 응답하지 않습니다. 웹 브라우저가 IP 당 5 초의 시간 초과가 발생하여 다음 브라우저를 시도한다고 가정 해 보겠습니다. 이제 나는 여기에 앉아 모래 시계를 2 분 반 동안 응시하여 귀하의 사이트가로드되기를 기다립니다. 아무도 그럴 시간이 없습니다. 그리고 내 웹 브라우저 또는 서비스에 액세스하는 데 사용하는 모든 응용 프로그램이 첫 번째 4 또는 5 개의 IP 주소 이상을 시도한다고 가정합니다. 아마 아닐 것입니다.

  • 자동 청소를 사용하고 A 레코드 목록을 최신 상태로 유지하기 위해 DNS 영역에 대해 유효하지 않은 또는 익명 업데이트를 허용하는 경우 얼마나 안전하지 않은지 상상해보십시오! 영역을 업데이트하기 위해 클라이언트가 사전에 확보 한 클라이언트 TLS 인증서가 필요한 일부 시스템을 설계 했더라도 지구상의 어느 곳에서든 손상된 클라이언트가 봇넷을 시작하고 서비스를 중단하게됩니다. 기존의 DNS는 군중을 소싱하지 않고있는 그대로 불안정합니다.

  • 엄청난 대역폭 사용 및 낭비. 모든 DNS 쿼리에 32KB 이상의 대역폭이 필요한 경우 전혀 확장되지 않습니다.

  • DNS 라운드 로빈은 적절한로드 균형 조정을 대체하지 않습니다. 한 노드에서 다운되거나 복구 할 수없는 방법을 제공하지 않습니다. 연결된 노드가 다운되면 사용자에게 ipconfig / flushdns를 수행하도록 지시합니까? 이러한 종류의 문제는 GSLB 및 Anycast와 같은 것으로 이미 해결되었습니다.

  • 기타.


15
천천히 .. 박수 .....
mfinni

4
또한 A 레코드가 BIND (대부분의 DNS 서버에서 실행되는 것)를 통해 쿼리되는 경우 A 레코드를 섞어 일정량의 A 레코드를 반환합니다. 이 특정 번호는 MAX_SHUFFLEBIND 소스 코드 (기본적으로 32)에 정의되어 있습니다.
ub3rst4r

1
호기심 때문에 왜 추천하지 않습니까? 확실히 이상한 일이지만, '좋은'도메인에서 요청을 처리하는 악의적 인 노드를 가지고 있고 실패한 노드가 여전히 요청을 받고있는 것 외에는 무엇이 잘못 될 수 있는지 :-)
Bozho

또한 사용자 경험이 계속 바뀌지 않습니까? 각 노드가 완전한 복제본입니까? 그들이 다른 사람들의 통제하에 있다면 어떻게 그것을 보장 하시겠습니까? 그들이 다르다면, 사람들은 오늘 한 사이트와 내일 다른 사이트를 갖게됩니다. 개인적으로, 그것은 나를 미치게 할 것입니다!
Brandon

18

"단일 DNS A 레코드가 보유 할 수있는 IP 수는 몇 개입니까?"라는 질문에 대답하기 위해 대답은 매우 간단합니다. 단일 A레코드는 정확히 하나의 주소를 보유합니다. 그러나 A동일한 이름에 대해 여러 개의 레코드 가있을 수 있습니다 .


10

각 IPv4 주소는 응답에서 16 바이트를 차지합니다. 각 IPv6 주소는 응답에서 28 바이트를 차지합니다.

회신이 512 바이트에 맞는지 확인하는 것이 좋습니다. 그것은 약 25 개의 IPv4 주소와 14 개의 IPv6 주소를 허용합니다 (패킷에 다른 정보가 필요하다는 것을 고려하면). 정확한 한도는 도메인 이름의 길이에 따라 다릅니다.

25 개의 IPv4 주소와 14 개의 IPv6 주소가 모두있는 경우 별도의 쿼리에서 IPv4 및 IPv6 주소를 요청하는 클라이언트를 신뢰합니다. 클라이언트가 단일 쿼리에서 두 가지 유형의 주소를 요청하는 경우 (드문 경우) 더 낮아야합니다.

응답 크기가 512 바이트를 초과하더라도 클라이언트와 서버가 EDNS를 지원하는 경우 여전히 UDP를 통해 작동 할 수 있습니다. EDNS가 없으면 클라이언트는 잘린 응답을 수신하고 TCP를 통해 다시 시도해야합니다. 이렇게하면 통신이 1 ~ 4 회 왕복됩니다. 그러나 더 나쁜 것은 때로는 DNS over TCP가 작동하지 못하게하는 잘못된 구성입니다.

DNS 계층에서 문제를 일으키지 않고 14 개가 넘는 주소를 회신에 넣을 수는 있지만 그다지 유용하지는 않습니다. 한 주소를 포기하고 다음 주소로 진행하기 전에 클라이언트가 사용하는 시간 초과는 종종 중요합니다.

한 번이라도 해당 시간 초과를 기다려야하는 경우 사용자 경험이 저하 될 수 있습니다. 응답을 받기 전에 클라이언트가 14 개의 주소를 통과해야하는 경우 사용자는 13 개의 시간 초과를 기다려야합니다.


2
요즘 모든 DNS는 EDNS를 지원해야합니다. DNSSEC 때문에 DNS 응답에 대한 512 바이트 제한은 더 이상 실용적이지 않습니다.
Barmar

@Barmar 그러나 켜져있는 경우 서버가 증폭 공격에 사용될 위험이 상당히 높습니다. 마지막으로 확인한 결과, 바인드를 껐을 때 증폭 공격을 완화 할 수있는 유일한 방법이라는 것을 알았습니다. EDNS가 쿠키 필드로 확장 될 때까지 그리고 그에 대한 지원이 널리 배포 될 때까지 512 바이트보다 큰 응답에 대한 지원을 끄는 것이 좋습니다.
kasperd

1
EDNS를 사용 중지하는 데 대한 검색 결과가 실제로는 많지 않습니다. 인용 부탁드립니다. 네트워크가 소스 주소 유효성 검사를 수행하지 않는 경우 EDNS의 활성화 여부에 관계없이 재귀 서버를 활용하는 증폭 공격이 발생합니다. 우리가 권위있는 전용 서버에 대해 이야기하고 있더라도 단일 응답으로 많은 양의 데이터를 반환 하도록 구성 한 후에 만 ​​관련이 있습니다.이 시점에서 비활성화하면 도움이되지 않습니다.
Andrew B

@AndrewB 나는 그 권고를 어디서 읽었는지 기억하지 못한다. 증폭 공격을 피하는 방법에 대한 여러 가지 권장 사항을 읽었으며 모두 빠릅니다. EDNS가 쿠키를 도입하지 않은 것은 유감입니다. 이는 DNS를 사용한 증폭 공격에 대한 효율적인 솔루션 일 수 있습니다. 내 대답에서 권장하는 것은 쿼리에 너무 많은 레코드를 넣지 말고 다른 사람들이 EDNS를 사용하도록 설정하여 응답을 효율적으로 수행하는 것입니다.
kasperd

@AndrewB 영역에 512 바이트 이상의 A 레코드를 넣고 EDNS가 활성화 된 권한있는 DNS 서버에서 호스트되도록하려면 재귀 해결 프로그램 사용자에게 큰 응답을 허용하지 않는 문제가 될 수 있습니다. 그렇기 때문에 A 레코드 수를 낮추는 것이 좋습니다. 또한 나는 그 많은 A 레코드의 이점이 그다지 중요하지 않은 이유를 설명했습니다.
kasperd

5

당신이 묘사하는 것은 특별히 새로운 아이디어가 아닙니다. 다른 답변에서 이미 다루었 듯이 하나의 회신에 가질 수있는 A 레코드 수는 제한되어 있지만 총 A 레코드 수에 대해서는 아무 말도하지 않습니다.

예를 들어 임의의 IP로 A 레코드에 대한 모든 쿼리에 응답하는 DNS 서버를 구현할 수 있습니다. 충분한 시간을 쿼리하면 4294967296의 고유 한 A 레코드가 생성됩니다 (각 IPv4 주소마다 하나씩).

내가 말했듯이, 이것은 새로운 아이디어가 아닙니다. 실제로, Akamai의 작동 방식 (및 아마도 다른 많은 CDN)의 일부입니다. Akamai 도메인에 대한 A 레코드는 흑 마법 DNS 서버에 의해 결정됩니다. 나는 당신이 얻는 대답은 동적 부하 분산과 지리적 문제에 달려 있다고 확신합니다.

예를 들어, a338.g.akamaitech.net을 선택했습니다. 컴캐스트의 DHCP 할당 네임 서버를 사용하는 컴퓨터에서 지금 살펴보면 다음과 같습니다.

$ host a338.g.akamaitech.net
a338.g.akamaitech.net has address 23.3.98.65
a338.g.akamaitech.net has address 23.3.98.89

Google의 DNS에 문의하면 어떻게됩니까?

$ host a338.g.akamaitech.net 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases: 

a338.g.akamaitech.net has address 23.3.96.152
a338.g.akamaitech.net has address 23.3.96.120

당신이 그것을 시도하면 내기, 나는 당신이 다른 대답을 얻을 것이라고 내기. Akamai는 특정 리소스를 제공하는 에지 서버는 몇 대입니까? 둘 이상, 내기.


감사. 예, CDN이 그런 식으로 작동한다는 것을 알고 있지만 하위 도메인 당 레코드 수가 제한되어 있습니다 (예 : 2). 내 최근의 다른 질문은 CDN과 DNS 구현에 관한 것입니다. :-)
Bozho

2

다른 사람들은 그것을 세부 사항으로 언급했지만 실제적인 관점에서 하드 제한은 512 바이트의 UDP 패킷 크기 제한입니다. 잘림이 감지되면 TCP로 전환하는 것이 가능하지만 실제로 많은 / 대부분의 클라이언트는 TCP를 전환하지 않을 것입니다. TCP를 지원하는 특수 목적 조회). 따라서 IPv4 (A 레코드)의 경우 약 30 개의 주소 제한이 있고 IPv6 (AAAA)의 경우 주소가 더 크므로 다소 제한적입니다. 도메인 이름의 길이는 이것으로 잘리고 숫자를 더 제한 할 것입니다.


1
단일 UDP 데이터 그램에 맞지 않는 DNS 응답을 제대로 처리하지 못하는 오작동하는 클라이언트 및 리졸버가 많이 있다는 것은 정확하지만 영역 전송이나 비정상적인 요청에만 더 큰 응답 크기가 필요하다는 생각을 포기하십시오. 당신의 대답에서, 당신은 분명히 DNSSEC 검증을 사용하지는 않지만 많은 사람들이 (DNSSEC가 더 큰 응답이 필요한 유일한 이유는 아니지만 매우 중요한 이유입니다.)
Michael McNally

@MichaelMcNally : DNSSEC는 엔드 포인트 (DNS 조회를 만드는 응용 프로그램)에서 사용되는 (적어도 구현자가 아니고, glibc 메일 링리스트의 스레드를 기반으로하지는 않지만) 로컬 재귀 이름 서버에서 사용되도록 의도되지 않았습니다. 응용 프로그램을위한 조회. 따라서 DNSSEC 설정을 사용하더라도 응용 프로그램이 DNS over TCP를 사용할 것으로 예상 할 이유가 없습니다. UDP는 완벽하게 작동합니다.
R ..

1

짧은 대답 : 약 25A 레코드가 UDP 패킷에 적합합니다. 그 외에도 DNS는 TCP로 전환되며 빠르지 않습니다. "가장 가까운"IP를 선택할 수있는 DNS 확인자를 사용하지 않는 클라이언트에도 문제가 있습니다. 또한 Wi-Fi 및 모바일에서 "가장 가까운"서버는 종종 올바른 서버가되지 않습니다.

더 긴 답변 :

하지마 더 나은 방법은 적절한 서버를 가리키는 각 사용자에 대해 개별 CNAME 레코드를 설정하는 것입니다. 두 개의 서버가 server-f있고 server-rIMAP에 사용 되었다고 가정 해 봅시다 . 서버 이름이 USERNAME.imap.example.com 인 각 사용자의 IMAP 클라이언트를 구성하십시오. 여기서 "USERNAME"은 이메일 사용자 이름으로 바뀝니다. 이제 이메일 클라이언트를 재구성하지 않고도 서버간에 사람들을 이동할 수 있습니다.

server-f.example.com. IN A 10.10.10.10 server-r.example.com. IN A 10.20.20.20 wilma.imap.example.com. IN CNAME server-f.example.com. fred.imap.example.com. IN CNAME server-f.example.com. betty.imap.example.com. IN CNAME server-r.example.com. barney.imap.example.com. IN CNAME server-r.example.com.

그러나 이렇게하면 사용자 데이터베이스에서 DNS 레코드를 자동으로 생성하는 것이 좋습니다. 계정이 생성 및 삭제 될 때 DNS 레코드도 생성 및 삭제되도록해야합니다. 그렇지 않으면 혼란스럽고 혼란 스러울 수 있습니다.

나는 문자 그대로 수천 명의 사용자가있는 회사 에서이 작업을 수행했으며 자동화 된 이후 세계를 잘 보았습니다.


0

다른 사람들이 지적했듯이, 실제 사용에 대한 끔찍한 아이디어입니다.

실제 세계에는 단일 UDP 데이터 그램에 맞지 않는 응답에 문제가있는 부적합한 클라이언트와 리졸버가 있으며, DNS 메시지 크기 제한에 대해서는 프로토콜을 준수하지 않는 구체적 아이디어를 시행하는 방화벽이 있습니다.

그리고 모든 경우에 (거의 강조 할 수없는) 큰 반응을 얻을 수 있다고하더라도 이것이 매우 나쁜 생각 인 또 다른 이유가 있습니다. DNS 응답 크기가 클수록 큰 증폭 요소를 제공하기 때문에 리플렉션 공격에 대한 페이로드로 더 유혹적입니다. DNS에서 일반적으로 발생하는 이러한 유형의 서비스 거부 공격에서 UDP 쿼리는 개방형 재귀 해결 자로 전송됩니다. UDP 쿼리의 소스 주소는 일반적으로 쉽게 스푸핑되며 공격자는 쿼리 소스를 의도 한 대상의 IP로 설정합니다. 두 가지 바람직한 (공격자에게) 효과가 달성됩니다. 첫째, (작은 스푸핑 된 쿼리에서) 상대적으로 적은 전송 노력으로 인해 대상에 도달하는 원하지 않는 트래픽이 비교적 크게 급증합니다 (이는 증폭 요인 임). 두 번째-공격의 실제 소스가 대상에서 숨겨집니다. 대상은 리플렉터로 사용되는 순환 리졸버의 주소 만 알고 있습니다.


0

이 주제에 관한 역사적 사소한 재미있는 점. 90 년대에 AOL은 MX 쿼리가> 512 바이트를 반환하도록 DNS 레코드를 확장했습니다. 이로 인해 RFC를 위반하고 많은 SMTP 서버를 파기했으며 (qmail은 당시 인기있는 서버였습니다), sysadmins는 많은 두통을 일으켰습니다. 수정에는 패치 또는 고정 경로 추가가 필요했습니다 .

나는 현재 상황이 무엇인지 모르지만 몇 년 전에 큐메일을 마지막으로 만졌을 때 패치가 여전히 존재했습니다.

http://www.gossamer-threads.com/lists/qmail/users/30503

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.