From 2cc73de15cef73eb4d2310458b65b55de1848158 Mon Sep 17 00:00:00 2001 From: bol-van Date: Thu, 30 Jan 2025 12:09:34 +0300 Subject: [PATCH] readme: move ip2net/mdig chapters --- docs/readme.md | 147 ++++++++++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 74 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index 87767fa..fc04acb 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -47,9 +47,9 @@ zapret является свободным и open source. - [СЛУЖЕБНЫЕ ПАРАМЕТРЫ](#служебные-параметры) - [IPTABLES ДЛЯ TPWS](#iptables-для-tpws) - [NFTABLES ДЛЯ TPWS](#nftables-для-tpws) - - [Способы получения списка заблокированных IP](#способы-получения-списка-заблокированных-ip) - [ip2net](#ip2net) - [mdig](#mdig) + - [Способы получения списка заблокированных IP](#способы-получения-списка-заблокированных-ip) - [Фильтрация по именам доменов](#фильтрация-по-именам-доменов) - [Режим фильтрации autohostlist](#режим-фильтрации-autohostlist) - [Проверка провайдера](#проверка-провайдера) @@ -1127,6 +1127,78 @@ nft add rule inet ztest dnat_pre meta iifname $IFACE_LAN tcp dport { 80, 443 } d nft delete table inet ztest ``` +## ip2net + +Утилита ip2net предназначена для преобразования ipv4 или ipv6 списка ip в список подсетей +с целью сокращения размера списка. Входные данные берутся из stdin, выходные выдаются в `stdout`. + +``` +-4 ; лист - ipv4 (по умолчанию) +-6 ; лист - ipv6 +--prefix-length=min[-max] ; диапазон рассматриваемых длин префиксов. например : 22-30 (ipv4), 56-64 (ipv6) +--v4-threshold=mul/div ; ipv4 : включать подсети, в которых заполнено по крайней мере mul/div адресов. например : 3/4 +--v6-threshold=N ; ipv6 : минимальное количество ip для создания подсети +``` +В списке могут присутствовать записи вида ip/prefix и ip1-ip2. Такие записи выкидываются в stdout без изменений. +Они принимаются командой ipset. ipset умеет для листов hash:net из ip1-ip2 делать оптимальное покрытие ip/prefix. +ipfw из FreeBSD понимает ip/prefix, но не понимает ip1-ip2. +ip2net фильтрует входные данные, выкидывая неправильные IP адреса. + +Выбирается подсеть, в которой присутствует указанный минимум адресов. +Для ipv4 минимум задается как процент от размера подсети (mul/div. например, 3/4), для ipv6 минимум задается напрямую. + +Размер подсети выбирается следующим алгоритмом: +Сначала в указанном диапазоне длин префиксов ищутся подсети, в которых количество адресов - максимально. +Если таких сетей найдено несколько, берется наименьшая сеть (префикс больше). +Например, заданы параметры v6_threshold=2 prefix_length=32-64, имеются следующие ipv6 : +``` +1234:5678:aaaa::5 +1234:5678:aaaa::6 +1234:5678:aaac::5 +Результат будет : +1234:5678:aaa8::/45 +``` +Эти адреса так же входят в подсеть /32. Однако, нет смысла проходиться ковровой бомбардировкой, +когда те же самые адреса вполне влезают в /45 и их ровно столько же. +Если изменить v6_threshold=4, то результат будет: +``` +1234:5678:aaaa::5 +1234:5678:aaaa::6 +1234:5678:aaac::5 +``` +То есть ip не объединятся в подсеть, потому что их слишком мало. +Если изменить `prefix_length=56-64`, результат будет: +``` +1234:5678:aaaa::/64 +1234:5678:aaac::5 +``` + +Требуемое процессорное время для вычислений сильно зависит от ширины диапазона длин префиксов, размера искомых подсетей и длины листа. +Если ip2net думает слишком долго, не используйте слишком большие подсети и уменьшите диапазон длин префиксов. +Учтите, что арифметика mul/div - целочисленная. При превышении разрядной сетки 32 bit результат непредсказуем. +Не надо делать такое: 5000000/10000000. 1/2 - гораздо лучше. + +## mdig + +Программа предназначена для многопоточного ресолвинга больших листов через системный DNS. +Она берет из stdin список доменов и выводит в stdout результат ресолвинга. Ошибки выводятся в stderr. + +``` +--threads= ; количество потоков. по умолчанию 1. +--family=<4|6|46> ; выбор семейства IP адресов : ipv4, ipv6, ipv4+ipv6 +--verbose ; дебаг-лог на консоль +--stats=N ; выводить статистику каждые N доменов +--log-resolved= ; сохранять успешно отресолвленные домены в файл +--log-failed= ; сохранять неудачно отресолвленные домены в файл +--dns-make-query= ; вывести в stdout бинарный DNS запрос по домену. если --family=6, запрос будет AAAA, иначе A. +--dns-parse-query ; распарсить бинарный DNS ответ и выдать все ivp4 и ipv6 адреса из него в stdout +``` + +Параметры `--dns-make-query` и `--dns-parse-query` позволяют провести ресолвинг одного домена через произвольный канал. +Например, следующим образом можно выполнить DoH запрос, используя лишь mdig и curl : +``` +mdig --family=6 --dns-make-query=rutracker.org | curl --data-binary @- -H "Content-Type: application/dns-message" https://cloudflare-dns.com/dns-query | mdig --dns-parse-query +``` ## Способы получения списка заблокированных IP @@ -1225,79 +1297,6 @@ ipfw таблицы в отличие от ipset могут содержать Это особенно полезно на BSD системах с PF. LISTS_RELOAD=- отключает перезагрузку листов. -## ip2net - -Утилита ip2net предназначена для преобразования ipv4 или ipv6 списка ip в список подсетей -с целью сокращения размера списка. Входные данные берутся из stdin, выходные выдаются в `stdout`. - -``` --4 ; лист - ipv4 (по умолчанию) --6 ; лист - ipv6 ---prefix-length=min[-max] ; диапазон рассматриваемых длин префиксов. например : 22-30 (ipv4), 56-64 (ipv6) ---v4-threshold=mul/div ; ipv4 : включать подсети, в которых заполнено по крайней мере mul/div адресов. например : 3/4 ---v6-threshold=N ; ipv6 : минимальное количество ip для создания подсети -``` -В списке могут присутствовать записи вида ip/prefix и ip1-ip2. Такие записи выкидываются в stdout без изменений. -Они принимаются командой ipset. ipset умеет для листов hash:net из ip1-ip2 делать оптимальное покрытие ip/prefix. -ipfw из FreeBSD понимает ip/prefix, но не понимает ip1-ip2. -ip2net фильтрует входные данные, выкидывая неправильные IP адреса. - -Выбирается подсеть, в которой присутствует указанный минимум адресов. -Для ipv4 минимум задается как процент от размера подсети (mul/div. например, 3/4), для ipv6 минимум задается напрямую. - -Размер подсети выбирается следующим алгоритмом: -Сначала в указанном диапазоне длин префиксов ищутся подсети, в которых количество адресов - максимально. -Если таких сетей найдено несколько, берется наименьшая сеть (префикс больше). -Например, заданы параметры v6_threshold=2 prefix_length=32-64, имеются следующие ipv6 : -``` -1234:5678:aaaa::5 -1234:5678:aaaa::6 -1234:5678:aaac::5 -Результат будет : -1234:5678:aaa8::/45 -``` -Эти адреса так же входят в подсеть /32. Однако, нет смысла проходиться ковровой бомбардировкой, -когда те же самые адреса вполне влезают в /45 и их ровно столько же. -Если изменить v6_threshold=4, то результат будет: -``` -1234:5678:aaaa::5 -1234:5678:aaaa::6 -1234:5678:aaac::5 -``` -То есть ip не объединятся в подсеть, потому что их слишком мало. -Если изменить `prefix_length=56-64`, результат будет: -``` -1234:5678:aaaa::/64 -1234:5678:aaac::5 -``` - -Требуемое процессорное время для вычислений сильно зависит от ширины диапазона длин префиксов, размера искомых подсетей и длины листа. -Если ip2net думает слишком долго, не используйте слишком большие подсети и уменьшите диапазон длин префиксов. -Учтите, что арифметика mul/div - целочисленная. При превышении разрядной сетки 32 bit результат непредсказуем. -Не надо делать такое: 5000000/10000000. 1/2 - гораздо лучше. - -## mdig - -Программа предназначена для многопоточного ресолвинга больших листов через системный DNS. -Она берет из stdin список доменов и выводит в stdout результат ресолвинга. Ошибки выводятся в stderr. - -``` ---threads= ; количество потоков. по умолчанию 1. ---family=<4|6|46> ; выбор семейства IP адресов : ipv4, ipv6, ipv4+ipv6 ---verbose ; дебаг-лог на консоль ---stats=N ; выводить статистику каждые N доменов ---log-resolved= ; сохранять успешно отресолвленные домены в файл ---log-failed= ; сохранять неудачно отресолвленные домены в файл ---dns-make-query= ; вывести в stdout бинарный DNS запрос по домену. если --family=6, запрос будет AAAA, иначе A. ---dns-parse-query ; распарсить бинарный DNS ответ и выдать все ivp4 и ipv6 адреса из него в stdout -``` - -Параметры `--dns-make-query` и `--dns-parse-query` позволяют провести ресолвинг одного домена через произвольный канал. -Например, следующим образом можно выполнить DoH запрос, используя лишь mdig и curl : -``` -mdig --family=6 --dns-make-query=rutracker.org | curl --data-binary @- -H "Content-Type: application/dns-message" https://cloudflare-dns.com/dns-query | mdig --dns-parse-query -``` - ## Фильтрация по именам доменов Альтернативой ipset является использование tpws или nfqws со списком доменов.