Заголовок слегка некорректный, но приблизительно отражает суть проблемы и решение
Утилиты для контроля трафика (пакетные фильтры, шейперы и т.п.) как правило очень условно дружат с 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-ответы и очень бегло смотрит в их содержимое. То есть использовать ее для репрессий нужно с осторожностью. Ну и писалось все по-быстрому, на коленке, наверняка там еще что-то не так