Мне нужно иметь возможность определять, какие общедоступные DNS-серверы машины во внутренних сетях используют для запросов. Чтобы уточнить, мне не нужны IP-адреса или имена внутренних DNS-серверов или сетевых устройств. Мне нужен сценарий, позволяющий определить, к каким общедоступным серверам они обращаются при пересылке запросов. Например, я нахожусь в домашней сети, и адрес моего маршрутизатора 172.16.1.1 - и он запрограммирован на использование 4.2.2.1 и 4.2.2.2 для разрешения имен. Мне нужно захватить эти адреса. Разбор ip / ifconfig или вход в маршрутизаторы и т. Д. Не являются вариантами.
Я пытался получить информацию из nslookups и копать, но, похоже, я не могу получить серверы, которые сначала действительно получают запросы, прежде чем они начнут повторяться. Идентифицируются внутренние DNS-серверы, но я не вижу следующих переходов.
Любые идеи ? Unix, Dos или Windows и т.д., любые решения приветствуются.
На самом деле нет никакого способа выполнить вашу задачу, потому что DNS-сервер может разрешать запросы любым способом, который он считает подходящим, и это черный ящик для клиента. Тем не менее, можно приблизиться к ответу на свой вопрос.
Хитрость заключается в том, чтобы создать поддомен со специальным сервером имен, ответ которого на любой A
query просто повторяет IP-адрес хоста, отправившего запрос. Такой сервер имен может быть реализован в Perl с помощью Net :: DNS :: Nameserver модуль:
#!/usr/bin/perl
use Net::DNS::Nameserver;
Net::DNS::Nameserver->new(
# w.x.y.z is the IP address of the host where this code is running
LocalAddr => ['w.x.y.z'],
ReplyHandler => sub {
my ($qname, $qclass, $qtype, $peerhost, $query) = @_;
my ($rcode, @ans, @auth, @add) = ('NXDOMAIN');
print "Received query for $qname from $peerhost\n";
if ($qtype eq 'A') {
$rcode = 'NOERROR';
push @ans, Net::DNS::RR->new("$qname 1 $qclass $qtype $peerhost");
}
return ($rcode, \@ans, \@auth, \@add, { aa => 1});
},
)->main_loop;
Затем настройте некоторый домен NS
запись, чтобы указать на этот специальный сервер имен. Я сделал это для домена под названием resolverid.acrotect.com
. (В качестве услуги я оставлю код работающим там на следующие несколько дней.)
Затем отправьте несколько разных DNS-запросов от клиента в вашей сети:
dig +short cachebuster1.resolverid.acrotect.com
dig +short cachebuster2.resolverid.acrotect.com
dig +short cachebuster3.resolverid.acrotect.com
Это заставит ваш сервер имен разрешать запросы, связываясь с фальсифицированным сервером имен, который отвечает IP-адресом машины, пересылающей запрос. В некоторых случаях этот адрес является «публичной» стороной вашего «частного» сервера имен, о чем вы и просили.
В остальных случаях инфраструктура более сложная. Например, если вы настроены на использование серверов DNS Google 8.8.8.8 и 8.8.4.4, вы фактически используете географически распределенный пул серверов имен. Сервер Google, который делает запрос к поддельному серверу имен, может не иметь IP-адреса, близкого к 8.8.8.8 или 8.8.4.4. Однако вы сможете увидеть, что он принадлежит Google, выполнив поиск ответа по обратному IP или WHOIS. (Интересно, что если вы выполните поиск обратного IP-адреса с помощью Google DNS, вы увидите, что Google оптимизировал поиск обратного IP-адреса на основе A
поиск, который вы только что выполнили. В PTR
что он возвращается будет something.resolverid.acrotect.com
. Чтобы избавиться от этой оптимизации, вам нужно сделать dig +trace -x a.b.c.d
.)
Я не верю, что вы сможете (благодаря грамотному использованию DNS вашим клиентом).
Весь смысл наличия рекурсивного преобразователя DNS для вас в том, что он будет отвечать на ваши запросы от вашего имени. Откуда он их получил, не ваше дело (как простой DNS-клиент).
Вам нужно захватить (подумайте tcpdump
в unix) данные, передаваемые между рассматриваемыми хостами и Интернетом, ищут запросы, отправленные на порт 53 (как правило, udp, но также можно использовать tcp), и анализируют вывод дампа.
Вам нужно будет бежать tcpdump
либо в самой системе шлюза, либо, если у вас есть управляемый коммутатор, с порта в режиме мониторинга.