Назад | Перейти на главную страницу

Запрос DNS для CNAME для сервера

Есть ли способ запросить наши внутренние записи DNS, чтобы обнаружить все записи CNAME, указывающие на конкретный сервер?

Изменить: мы - среда Windows, Server 2003.

Вы не указали, какая у вас среда, но если вы используете Unix, я думаю, что комбинация dig и grep должна работать. ns.example.com должно быть имя хоста вашего сервера имен, example.com - это домен, частью которого является ваш хост, а HOST - это хост, для которого вы хотите найти все записи CNAME. На самом деле это символ табуляции в команде grep, а не буквально <TAB> (возможно, вам придется настроить строку grep).

Также ваш сервер имен должен быть настроен для передачи зон, детали которых будут зависеть от реализации.

dig @ns.example.com example.com axfr |grep 'CNAME<tab>HOST$'

Или, если вы работаете в Windows, вы можете использовать nslookup:

C:\> nslookup
> name ns.example.com
> ls -a example.com FILE

Это должно вывести все записи для домена example.com который ns.example.com "знает о" в ФАЙЛ. Затем вы можете использовать любой инструмент, который хотите отсортировать в текстовом файле, ища соответствующие CNAMES.

Или с этим непроверенный (но выглядит правильно) perl сценарий:

#!/usr/bin/perl

use Net::DNS;

($target, $zone) = @ARGV;

$res = new Net::DNS::Resolver;
foreach $rr ($res->axfr($zone)) {
     print $rr->name."\n" if (($rr->type eq "CNAME") && ($rr->rdatastr eq $target."."));
}

Пара пунктов для полноты:

  • Как заявил @womble, эквивалента записи PTR для CNAME нет. Вам нужно будет использовать некоторую контекстную осведомленность, отсортировав всю информацию о зоне для CNAMES, которая соответствует записям A вашего хоста.
  • Это работает только для вашего DNS-сервера (и если у вас есть разрешение на просмотр информации о зоне). Невозможно «отследить» CNAMES для вашего хоста, принадлежащие другим зонам.
  • Как заявляет @BillThor, есть и другие способы псевдонима имени хоста помимо CNAMES. Опять же, вам понадобится некоторая контекстная осведомленность.

Если у вас есть доступ к конфигурации DNS, обнаружить эти данные довольно просто. Однако у любого может быть CNAME, указывающее на ваш сервер. Вы не сможете их отследить.

Как отметил @wombie, вы не можете выполнять обратный поиск для CNAMES. Для CNAMES нет эквивалента PTR, и даже если там, вероятно, будут существовать только некоторые записи. Быстрая проверка случайного выбора доменов покажет, что записи PTR часто не указывают на запись A. Точно так же при обратном поиске записей PTR для случайных адресов часто не удается найти соответствующую запись A.

РЕДАКТИРОВАТЬ: CNAME - не единственный способ создать псевдоним для системы. DNS позволяет нескольким записям A указывать на один и тот же адрес. Функционально это то же самое, что и добавление CNAME, но метод другой. Те же проблемы возникают и за пределами вашего домена. Для поиска различных записей A вы должны искать IP-адрес (а) рассматриваемой системы.

Протокол DNS не позволяет выполнять такого рода «обратный» поиск. Вам нужно будет выйти из протокола, например, используя предложения grep, предоставленные kce.

использовать powershell:

проверьте основное имя на вашем DNS-сервере Microsoft:

Get-WmiObject -Namespace 'root \ MicrosoftDNS' -Class MicrosoftDNS_AType -Filter "IPAddress = 'xx.xx.xx.xx (IP)'" -ComputerName mydnsservername

получить все cnames для этого хоста с вашего DNS-сервера Microsoft:

Get-WmiObject -Namespace 'root \ MicrosoftDNS' -Class MicrosoftDNS_CNAMEType -Filter "primaryname = 'primaryname из первого запроса, завершенного точкой.'" -ComputerName mydnsservername | выберите имя владельца, основное имя

  1. Найдите все зоны, обслуживаемые вашими машинами.
  2. Для каждой зоны используйте dnscmd для экспорта данных зоны:
    dnscmd a.ns.example.com /zoneexport zone.example.com some-filename-for-this-zone
  3. Искать в экспортированных файлах CNAME записи ресурсов, указывающие на имя целевого домена.