Фильтрация DNS запросов с помощью ipTables: различия между версиями

Материал из AlexNook
Перейти к навигацииПерейти к поиску
 
(не показана 1 промежуточная версия этого же участника)
Строка 20: Строка 20:
===Немного про алгоритмы поиска подстроки===
===Немного про алгоритмы поиска подстроки===


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


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


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


===Примеры блокировок===
===Примеры блокировок===
Строка 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

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