pcap и iptables борьба

Я настроил DNS-сервер на машине. Я хочу перехватить ответы DNS перед отправкой машины, изменить некоторые поля в ней и затем отправить пакет.

Я могу только изменить поля в пакете, который захватывает мой код pcap (написанный на C), который выглядит как копия, так как исходный пакет также передается.

Я попытался iptables отбросить пакеты, исходящие с машины, но он также отбрасывает пакеты, введенные pcap.

Есть ли выход из этого?

благодарю вас

1 ответ

Если вы ищете решение только для pcap, вам нужно будет перехватить пакет DNS-запроса, изучить его и собрать правильный ответ, прежде чем DNS-сервер ответит. Это не кажется надежным, потому что, если DNS-сервер имеет кешированную запись, он, скорее всего, ответит до того, как ваш пользовательский код соберет пакет и отправит его до конца.

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

В Google есть много примеров программирования ядра Linux (поиск: Программирование модуля ядра Linux), а также примеры ловушек netfilter.

Другие вопросы по тегам