Фильтрация DNS запросов с помощью ipTables: различия между версиями
ALEX (обсуждение | вклад) |
ALEX (обсуждение | вклад) |
||
Строка 30: | Строка 30: | ||
Заблокировать все запросы к DNS, в строке которых соедржится google и если запросы идут с адреса 192.168.0.21 | Заблокировать все запросы к DNS, в строке которых соедржится google и если запросы идут с адреса 192.168.0.21 | ||
{{root|iptables -A FORWARD -s 192.168.0.21/32 -p udp --dport 53 -m string --string google --algo bm -j DROP}} | {{root|<nowiki>iptables -A FORWARD -s 192.168.0.21/32 -p udp --dport 53 -m string --string google --algo bm -j DROP</nowiki>}} | ||
В данном случае речь идёт о FORWARD пакетах, т.к. правило установлено на роутере с Gentoo Linux, который форвардит, используя Маскарад на внешнем сетевом интерфейсе, все пакеты клиентов внутри локалки | В данном случае речь идёт о FORWARD пакетах, т.к. правило установлено на роутере с Gentoo Linux, который форвардит, используя Маскарад на внешнем сетевом интерфейсе, все пакеты клиентов внутри локалки | ||
Если нужно использовать точку и тем самым конкретизировать поддомен, то можно воспользоваться правилом, описанным [https://stackoverflow.com/questions/14096966/can-iptables-allow-dns-queries-only-for-a-certain-domain-name тут] | Если нужно использовать точку и тем самым конкретизировать поддомен, то можно воспользоваться правилом, описанным [https://stackoverflow.com/questions/14096966/can-iptables-allow-dns-queries-only-for-a-certain-domain-name тут] | ||
На его основе блокировка всех запросов, содержащих google.com будет выглядеть вот так: | На его основе блокировка всех запросов, содержащих google.com будет выглядеть вот так: | ||
{{root|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}} | {{root|<nowiki>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</nowiki>}} | ||
[[Category:Index]] | [[Category:Index]] | ||
[[Category:Linux]] | [[Category:Linux]] |
Версия 10:17, 3 ноября 2021
Для фильтрации 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
В данном случае речь идёт о FORWARD пакетах, т.к. правило установлено на роутере с Gentoo Linux, который форвардит, используя Маскарад на внешнем сетевом интерфейсе, все пакеты клиентов внутри локалки
Если нужно использовать точку и тем самым конкретизировать поддомен, то можно воспользоваться правилом, описанным тут
На его основе блокировка всех запросов, содержащих google.com будет выглядеть вот так: