Вам нужно будет прочитать RFC1034 и 1035. Протокол DNS гораздо сложнее, вам потребуется гораздо больше кода для его анализа.
Во-первых, почему бы не использовать определенную библиотеку DNS Java, которая навернякасуществует и который может генерировать и анализировать DNS-пакеты?Даже если вы не хотите его использовать, чтение его источника может помочь вам понять, как происходит синтаксический анализ.
Во-вторых, и если вы действительно захотите сделать это самостоятельно, вам придется понимать общий форматпакет DNS (со структурой, разделяющей вопрос, часть полномочий, часть ответа, дополнительную часть), см. раздел 4 для структуры пакета DNS, а затем, в частности, для имен, вам необходимо понять «сжатие DNS», см. раздел 4.1.4 того же RFC.
Имя не выглядит таким образом в пакете DNS.Каждая метка (строка между двумя точками) кодируется на проводе своей длиной, а затем меткой ИСКЛЮЧИТЬ в некоторых случаях, когда указатели используются для указания внутри другой части пакета DNS, чтобы никогда не повторять одну и ту же метку или последовательность меток.
Наконец, вам нужно не просто попытаться захватить любую строку в пакете DNS.Ответ может содержать много другого содержимого, например, если вы получите ответ CNAME
, вы получите две «строки», то есть два доменных имени, владелец записи и связанные RDATA.Вам нужно будет следить за этими CNAME
записями (если вы хотите узнать запрошенное первое имя), а затем анализировать ответы на запросы A
и AAAA
.Очевидно, что вам также необходимо учитывать отрицательные ответы (NXDOMAIN
), которые могут произойти для любого запрашиваемого имени.
Что касается
Я хочу прочитать запросы DNS, сделанныеБраузер
, есть гораздо более простое решение.
Установите рекурсивный сервер имен, такой как unbound
, и убедитесь, что ваш браузер направлен на него.Затем вы легко увидите все имена хостов в лог-файле сервера имен.
Также другое решение с недавними версиями браузера, реализующими DoH (DNS через HTTPS): снова установите сервер имен, говорящий DoH, и настройте свой браузер так, чтобы он указывал на него (см. https://www.internetsociety.org/blog/2018/12/dns-privacy-support-in-mozilla-firefox/ например для Firefox).