Как найти CDN, обслуживающий домен в python?

Я пытаюсь найти способ найти CDN, обслуживающий определенный домен в Python.

Моя идея состоит в том, чтобы использовать поиск DNS для чтения поля CNAME в ответе. Из этого я могу сопоставить ответ CNAME с определенным провайдером DNS. Мне известно об аналогичной угрозе в Как я могу отфильтровать домены, обслуживаемые CDN, из списка доменных имен?. Однако, как там подчеркивается, нет гарантии получения CNAME для каждого тестируемого домена. Тогда мне интересно, есть ли другой способ найти соответствующий CDN для домена, когда CNAME не находится в ответе в Python. До сих пор я пробовал:

# I am using Python 3.7.0 and the dnspython library
import dns.resolver

dns_results = dns.resolver.query('youtube.com', 'CNAME')

Я получаю сообщение об ошибке:

NoAnswer: The DNS response does not contain an answer to the question: youtube.com. IN CNAME

Когда я ожидал, что ответ будет Google.

Спасибо за помощь.


person Paul    schedule 09.08.2019    source источник
comment
1) Не все CDN можно найти, проверив CNAME, некоторые не используют его и 2) DNS-запрос CNAME youtube.com, так как любой другой запрос CNAME на вершине никогда не вернет записи, поскольку CNAME не может существовать на вершине. Если делать www.youtube.com CNAME то другое дело...   -  person Patrick Mevzek    schedule 09.08.2019
comment
Спасибо @Patrick Mevzek за вашу помощь. Можете ли вы пояснить, почему сайты www.youtube.com и youtube.com дают разные ответы?   -  person Paul    schedule 09.08.2019
comment
youtube.com — это доменное имя, и, следовательно, в его вершине (при непосредственном запросе к нему) вы не можете иметь записи CNAME, это соответствует спецификациям DNS: запись CNAME не может сосуществовать ни с чем другим, а вершина уже имеет записи NS и SOA. Любое другое имя ниже вершины может иметь CNAME, если оно не имеет другого типа записи.   -  person Patrick Mevzek    schedule 09.08.2019
comment
Должен ли я вместо этого использовать URL-адрес (индексную страницу)?   -  person Paul    schedule 09.08.2019


Ответы (2)


Может быть, что-то вроде этого:

>>> import ipwhois
>>> import dns.resolver
>>> result = dns.resolver.query('youtube.com', 'A')
>>> print(ipwhois.IPWhois(result[0].to_text()).lookup_whois()["nets"][0]["description"])
Google LLC
>>> result = dns.resolver.query('reddit.com', 'A')
>>> print(ipwhois.IPWhois(result[0].to_text()).lookup_whois()["nets"][0]["description"])
Fastly
>>> result = dns.resolver.query('imgur.com', 'A')
>>> print(ipwhois.IPWhois(result[0].to_text()).lookup_whois()["nets"][0]["description"])
Fastly
>>> result = dns.resolver.query('stackoverflow.com', 'A')
>>> print(ipwhois.IPWhois(result[0].to_text()).lookup_whois()["nets"][0]["description"])
Fastly
>>> result = dns.resolver.query('www.primevideo.com', 'A')
>>> print(ipwhois.IPWhois(result[0].to_text()).lookup_whois()["nets"][0]["description"])
Amazon Technologies Inc.
person Dusan Bajic    schedule 09.08.2019
comment
Спасибо за вашу помощь @Dusan Bajic. Однако я думаю, что информация, которую вы получили, соответствует короткому названию AS. Я ищу CDN, обслуживающий домен. - person Paul; 09.08.2019
comment
Мне также интересно, почему вы думаете, что это поле в словаре lookup_whois() дает подсказку о CDN, обслуживающей домен. - person Paul; 11.08.2019

Вы можете найти запись PTR для IP-адреса проверяемого сайта.

$host -t A youtube.com
youtube.com has address 216.58.195.78
$host -t PTR 216.58.195.78
78.195.58.216.in-addr.arpa domain name pointer sfo07s16-in-f78.1e100.net.

А в какой-нибудь таблице указать 1e100.net на Google, cloudfront.net на Amazon и т.д.

Это тоже не на 100% надежно. Ваш код также должен обрабатывать ответы об ошибках: NXDOMAIN для IP-адресов, которые не находятся в зоне in-addr.arpa и, скорее всего, не обслуживаются CDN; SERVFAIL для неисправных DNS-серверов.

person Yuri Ginsburg    schedule 10.08.2019