Как извлечь имя сайта из дейтаграммы DNS в Java - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу прочитать запросы DNS, сделанные браузером, а затем извлечь имя веб-сайта из дейтаграммы DNS UDP.Я могу захватить датаграмму, затем я использовал getData (), чтобы найти метки веб-сайта, но я не получаю четкие данные.

    public static void main(String args[]) throws Exception
  {
     DatagramSocket serverSocket = new DatagramSocket(53);
        byte[] receiveData = new byte[512];
        while(true)
           {
              DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
              serverSocket.receive(receivePacket);
              byte telegramContent[] = receivePacket.getData();
              String sentence = new String( telegramContent);
              System.out.println("RECEIVED: " + sentence);

результат, который я получил для www.google.com

enter image description here

Мой вопрос заключается в том, как получить полное название веб-сайта, например www.google.com

1 Ответ

0 голосов
/ 14 февраля 2019

Вам нужно будет прочитать 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).

...