Если вы ищете решение только для pcap, вам нужно будет перехватить пакет DNS-запроса, изучить его и собрать правильный ответ, прежде чем DNS-сервер ответит. Это не кажется надежным, потому что, если DNS-сервер имеет кешированную запись, он, скорее всего, ответит до того, как ваш пользовательский код для сборки пакета и его отправки может закончить.
Самый надежный способ сделать это - написать модуль ядра, который является ловушкой сетевого фильтра. Хуки Netfilter способны проверять пакет и влиять на его обработку в нескольких точках, прежде чем пакет покинет машину. Подцепите его на уровне NF_IP_LOCAL_OUT. Затем вы можете проверить исходящий пакет и посмотреть, соответствует ли это DNS-ответу вашим критериям. В следующей части я этого не сделал, но, поскольку у вас есть прямой доступ к skb (буферу сокета) в качестве входного параметра для вашей пользовательской функции подключения, вы можете изменить пакет прямо здесь и вернуть NF_ACCEPT, чтобы передать ответ клиенту. , Если вам необходимо выполнить некоторую обработку самого запроса, вы можете вместо этого подключиться к NF_IP_LOCAL_IN и обработать его любым количеством способов, включая передачу его в программу пользовательского пространства.
Существует множество примеров программирования ядра Google для Linux (поиск: Программирование модуля ядра Linux), а также примеры ловушек сетевого фильтра.