Фильтрация DNS запросов с помощью ipTables

Материал из AlexNook
Перейти к навигацииПерейти к поиску

Для фильтрации DNS запросов, например блокировки некоторых зловредных сайтов, в ядре системы нужно активировать опцию анализа строки запроса

Заходим в конфигурацию netfilter и устанавливаем параметр

  • CONFIG_NETFILTER_XT_MATCH_STRING=y

Так же должны быть активны следующие параметры

  • CONFIG_TEXTSEARCH=y
  • CONFIG_TEXTSEARCH_KMP=y
  • CONFIG_TEXTSEARCH_BM=y
  • CONFIG_TEXTSEARCH_FSM=y

Кстати полезным в принципе будет активирование возможности фильтрации по MAC

  • CONFIG_NETFILTER_XT_MATCH_MAC=y

А так же использование диапазона портов в правиле фильтрации, а не одного порта

  • CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y

Немного про алгоритмы поиска подстроки

netfilter использует разные алгоритмы поиска подстроки. Вот краткое описание некоторых из них:

Алгоритм поиска строк Бойера-Мура близок к Кнута-Морриса-Пратта по сложности и для определенного круга задач (где образец не содержит повторяющихся фрагментов) он быстрее.

Для нашего случая для вычленения доменов это выглядит наиболее подходящим (алгоритм BM).

Примеры блокировок

Заблокировать все запросы к DNS, в строке которых соедржится google и если запросы идут с адреса 192.168.0.21

iptables -A FORWARD -s 192.168.0.21/32 -p udp --dport 53 -m string --string google --algo bm -j DROP

В данном случае речь идёт о FORWARD пакетах, т.к. правило установлено на роутере с Gentoo Linux, который форвардит, используя Маскарад на внешнем сетевом интерфейсе, все пакеты клиентов внутри локалки


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

На его основе блокировка всех запросов, содержащих google.com будет выглядеть вот так:

iptables -A FORWARD -s 192.168.0.21/32 -p udp --dport 53 -m string --hex-string "|06|google|03|com" --algo bm -j DROP