|
|
@ -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=<threads_number> ; количество потоков. по умолчанию 1. |
|
|
|
--family=<4|6|46> ; выбор семейства IP адресов : ipv4, ipv6, ipv4+ipv6 |
|
|
|
--verbose ; дебаг-лог на консоль |
|
|
|
--stats=N ; выводить статистику каждые N доменов |
|
|
|
--log-resolved=<file> ; сохранять успешно отресолвленные домены в файл |
|
|
|
--log-failed=<file> ; сохранять неудачно отресолвленные домены в файл |
|
|
|
--dns-make-query=<domain> ; вывести в 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=<threads_number> ; количество потоков. по умолчанию 1. |
|
|
|
--family=<4|6|46> ; выбор семейства IP адресов : ipv4, ipv6, ipv4+ipv6 |
|
|
|
--verbose ; дебаг-лог на консоль |
|
|
|
--stats=N ; выводить статистику каждые N доменов |
|
|
|
--log-resolved=<file> ; сохранять успешно отресолвленные домены в файл |
|
|
|
--log-failed=<file> ; сохранять неудачно отресолвленные домены в файл |
|
|
|
--dns-make-query=<domain> ; вывести в 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 со списком доменов. |
|
|
|