Фильтрация DNS запросов с помощью ipTables
Для фильтрации 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