LINUX.ORG.RU
ФорумAdmin

Как заблокировать узел по доменному имени, перехватывая DNS-пакеты

 , ,


1

3

Заголовок слегка некорректный, но приблизительно отражает суть проблемы и решение

Утилиты для контроля трафика (пакетные фильтры, шейперы и т.п.) как правило очень условно дружат с DNS. Хотя часто бывает необходимо обрабатывать группы узлов по доменным именам.

Есть очень простой способ иметь список соответствия DNS-имен и IP-адресов в небольших сетях - перехватывать и анализировать DNS-трафик.

Способ не аккуратный, пользователь может получать информацию о разрешении имени в адрес другим путем, но для грубого контроля этого может быть вполне достаточно.

Мне почему-то казалось что таких готовых утилит, которые смотрят в проходящий DNS-трафик и обновляют ipset-таблицу должно быть как, э-э, аудиопроигрывателей хотя бы. Но нет, в гугле предлагают делать все самому из подручных средств.

Немного погрустив, пришлось набыдлокодить такоэ: https://github.com/vmxdev/sidmat/ , может быть кому-то еще пригодится

Утилите (libpcap-based) нужно указать интерфейс и регулярное выражение. Она слушает UDP трафик 53-го порта, если имя в DNS-запросе и регулярное выражение матчатся, то адрес пишется на stdout. Список выведенных адресов запоминается, печатаются только уникальные адреса.

Например, чтобы посмотреть во что прямо сейчас разрешается google.com и его поддомены, нужно запустить:

$ ./sidmat eth0 "^google\.com$|\.google\.com$"

Запускать, конечно, нужно там где видно DNS-трафик.

А вот так можно интегрировать с iptables (точнее, с ipset). Сначала создаем set:

$ /usr/sbin/ipset -N vk_com iphash

Запускаем утилиту, она будет этот set заполнять:

$ /usr/bin/stdbuf -oL /opt/sidmat eth0 "^vk\.com$|\.vk\.com$" | /usr/bin/xargs -I {} /usr/sbin/ipset -A vk_com {}

Просмотреть set можно так:

$ ipset -L vk_com

И дальше уже использовать в iptables

Недостатки утилиты: ее можно легко обмануть. Утилита не проверяет откуда приходят DNS-ответы и очень бегло смотрит в их содержимое. То есть использовать ее для репрессий нужно с осторожностью. Ну и писалось все по-быстрому, на коленке, наверняка там еще что-то не так

Deleted

Способ не аккуратный, пользователь может получать информацию о разрешении имени в адрес другим путем, но для грубого контроля этого может быть вполне достаточно.

Дальше этого не читал. Если не рассматривается вариант запрета запросов адресов у другого DNS, то почему бы просто не отдавать по DHCP адрес своего DNS-сервера, где не будет неугодных доменов?

alozovskoy ★★★★★ ()
Ответ на: комментарий от alozovskoy

не рассматривается вариант запрета запросов адресов у другого DNS

Да нет, не нужно ничего запрещать. Анализируются все проходящие запросы (точнее, ответы), от всех ДНС-серверов. Имелась в виду совсем уж экзотика, типа запись узла и адреса в /etc/hosts или там обращения к DNS по VPN (или через другой канал связи)

Deleted ()
Ответ на: комментарий от Deleted

А, ссори, надо было все прочитать, пропустил про «Она слушает UDP трафик 53-го порта».

alozovskoy ★★★★★ ()
Ответ на: комментарий от alozovskoy

ну и просто запретить 53 порт за пределами локалки, чтоб пользовались только локальным

anonymous ()
Ответ на: комментарий от thesis

А расскажите про традиционные подходы

Я вот читаю треды типа такого заблокировать vk.com через iptables и вздрагиваю. То есть там (в том треде), конечно, хорошие решения, но чем хуже честно анализировать DNS-ответы - непонятно

Вообще это делалось не для блокировки, а для мониторинга, но на лоре довольно часто всплывают такие вопросы, может быть кому-то будет интересно попробовать такой подход

Deleted ()
Ответ на: комментарий от Deleted

Традиционные известно какие - локальный ДНС, запрет на сторонние ДНСы и принудительное проксирование всей вебни. Хочешь - мониторь, хочешь - фильтруй. Всяко надежнее описанного.

thesis ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.