Template
1
0
mirror of https://github.com/bol-van/zapret2.git synced 2026-03-14 06:13:09 +00:00

update docs

This commit is contained in:
bol-van
2025-12-21 21:37:50 +03:00
parent 40e9edcdcb
commit f70107fad3

View File

@@ -3779,6 +3779,8 @@ nfqws2 может работать и самостоятельно без скр
| GZIP_LISTS | применять ли сжатие gzip для генерируемых хост и ip листов |
| DESYNC_MARK | марк-бит для предотвращения зацикливания |
| DESYNC_MARK_POSTNAT | марк-бит для пометки соединений, идущих по схеме POSTNAT |
| FILTER_MARK | если задан, перехватывает пакеты только с этим битом mark. Полезно для организации особых фильтров, например, по ip источника локальной сети. |
| POSTNAT | использовать режим перехвата после NAT на nftables. По умолчанию - 1. На iptables перехват всегда до NAT. |
| NFQWS2_ENABLE | включение стандартного режима nfqws2 |
| NFQWS2_PORTS_TCP<br>NFQWS2_PORTS_UDP | порты перехвата для стандартного режима nfqws2 |
| NFQWS2_TCP_PKT_OUT<br>NFQWS2_TCP_PKT_IN<br>NFQWS2_UDP_PKT_OUT<br>NFQWS2_UDP_PKT_IN | ограничители connbytes по tcp/udp и направлению для стандартного режима nfqws2 |
@@ -3786,7 +3788,7 @@ nfqws2 может работать и самостоятельно без скр
| NFQWS2_OPT | параметры командной строки стандартного режима nfqws2 |
| MODE_FILTER | режим фильтрации : none,ipset,hostlist,autohostlist |
| FLOWOFFLOAD | режим offload : donttouch,none,software,hardware |
| OPENWRT_LAN<br>OPENWRT_WAN4<br>OPENWRT_WAN6 | список через пробел lan и wan интерфейсов для ipv4 и ipv6 в OpenWRT. НЕ ИНТЕРФЕЙСЫ Linux, ИНТЕРФЕЙСЫ netifd ! по умолчанию "lan" и "wan"|
| OPENWRT_LAN<br>OPENWRT_WAN4<br>OPENWRT_WAN6 | список через пробел lan и wan интерфейсов для ipv4 и ipv6 в OpenWRT. НЕ ИНТЕРФЕЙСЫ Linux, ИНТЕРФЕЙСЫ netifd ! по умолчанию "lan" и "wan" |
| IFACE_LAN<br>IFACE_WAN<br>IFACE_WAN6 | список через проблем lan и wan интерфейсов для ipv4 и ipv6 в классическом Linux. ИНТЕРФЕЙСЫ Linux ! |
| INIT_APPLY_FW | должны ли применять [стартовые скрипты](#стартовые-скрипты) правила firewall |
| INIT_FW_PRE_UP_HOOK<br>INIT_FW_POST_UP_HOOK<br>INIT_FW_PRE_DOWN_HOOK<br>INIT_FW_POST_DOWN_HOOK | хук-скрипты, вызываемые до, после поднятия и до, после опускания firewall |
@@ -3802,8 +3804,6 @@ nfqws2 может работать и самостоятельно без скр
* Прямое указание параметров в `NFQWS2_OPT` типа `--hostlist=/opt/zapret2/ipset/zapret-hosts-user.txt` крайне не приветствуется, поскольку ломает логику `MODE_FILTER` и скриптов получения листов - их результат может не быть учтен.
* Класть свои файлы в `/opt/zapret2` чревато тем, что их снесет инсталятор при обновлении zapret2. Используете расположение вне каталога zapret2.
## Система ведения листов
Располагается в директории ipset и состоит из shell скриптов, которые обслуживают файлы с фиксированными именами внутри этой же директории.
@@ -3843,6 +3843,14 @@ ip листы разделяются на ipv4 и ipv6. ipv6 листы имею
Берет 1 параметр командной строки. Им может быть "clear" - очистить ipset-ы или "no-update" - загонять только если ipset еще не созданы, не выполнять обновление.
Имена ipset-ов :
* nozapret, nozapret6 - исключение IP адресов
* zapret, zapret6 - включение IP адресов
* ipban, ipban6 - отдельный включающий список для стороннего перенаправления или проксирования
ipfw использует set-ы, включающие как ipv4, так и ipv6 адреса, поэтому варианты "6" не применяются.
#### get_config.sh
Выполняет скрипт из ipset, заданный в переменной config [GETLIST](#файл-config). Если переменная не задана, выполняет `get_ipban.sh`.
@@ -3895,7 +3903,261 @@ IP листы содержат как ipv4, так и ipv6.
## Стартовые скрипты
Имеются только для Linux и OpenWRT. Вариант для Linux - в `init.d/sysv`, для OpenWRT - в `init.d/openwrt`. Основной исполняемый файл - `zapret2`. Требуемое действие передается в аргументе `$1`. Процедура запуска разделена на запуск демонов - процессов nfqws2, и запуск firewall - выставление правил ip/nf tables.
| Команда ($1) | Действие |
|:-------------|:---------|
| start<br>stop<br>restart | запуск/останов/перезапуск демонов и firewall. firewall не запускается, если [INIT_APPLY_FW](#файл-config) не равно 1. На openwrt с fw3 (iptables) firewall запускается отдельно, команды работают только с демонами и не трогают firewall |
| start_daemons<br>stop_daemons<br>restart_daemons | запуск/останов/перезапуск демонов |
| start_fw<br>stop_fw<br>restart_fw | запуск/останов/перезапуск firewall. На openwrt с fw3 (iptables) команды работают, но firewall запускается отдельно через firewall include в `/etc/config/firewall`. Отдельные операции не рекомендованы. |
| reload_ifsets | (только для nftables) перезагрузка сетов wanif и wanif6 |
| list_ifsets | (только для nftables) показ wanif, wanif6 и flowtable |
| list_table | (только для nftables) показ таблицы zapret2 |
sysv вариант предназначен для любых Linux, не являющихся OpenWRT. На системах с различными системами запуска все равно работает sysv скрипт, а прикрутка к системам запуска представляет собой лишь адаптер, его запускающий. На системах с неподдерживаемыми системами запуска и на прошивках вы сами должны знать куда прикрутить "zapret2 start" и "zapret2 stop", чтобы работал автостарт и останов в рамках вашей системы запуска.
### Интеграция с firewall
Если в ОС используется система управления firewall, между ней и zapret могут произойти конфликты. Чаще всего бывают гоночные состояния - соревнование кто первый заполнит правила или снесет чужие. Это приводит к хаосу - то работает, то не работает, то работает что-то одно, то вообще непонятно что происходит. Гоночные состояния обычно случаются на iptables, потому что там одни таблицы на всех. С nftables проблем обычно не возникает, поскольку каждый использует свою таблицу. Но если вдруг система управления firewall решит снести весь ruleset, это будет тоже гоночное состояние.
Если случаются гонки или конфликты, то лучший способ решения - синхронизация. Вы отключаете в config [INIT_APPLY_FW](#файл-config), после чего скрипты запуска по команде start перестают запускать firewall и создавать конфликт. Далее вы разбираетесь в своей системе firewall как после поднятия ее правил запустить сторонний скрипт, поднимающий дополнительные правила. Этим скриптом должен быть "zapret2 start_fw". Так же можно прикрутить stop и restart. Либо можно пойти обратным путем - использовать как основу поднятие firewall от zapret и использовать [firewall хуки](#файл-config), в которых дергаются команды по управлению системой управления firewall. Нужно проследить, чтобы система управления firewall не сносила правила zapret.
Если система управления firewall работает только со своими правилами и крайне плохо уживается со сторонними, можно попробовать отказаться от скриптов запуска и выяснить как прикрутить правила NFQUEUE согласно ее правилам, а демоны запускать отдельно через систему запуска вашего дистрибутива. Если это нежелательно или невозможно, стоит задуматься о смене системы управления firewall на что-то другое или полном отказе от нее.
#### Интеграция с OpenWRT
Готовая интеграция с firewall имеется для OpenWRT. Скрипты запуска автоматически определяют fw3 и отключат управление firewall через start/stop/restart. Вместо этого в `/etc/config/firewall` прописывается firewall include `firewall.zapret2`, который и запускает правила zapret синхронно после поднятия fw3. Дополнительно вешается хук `90-zapret2` в `/etc/hotplug.d/iface` на поднятие/опускание интерфейсов. В варианте fw3 происходит рестарт fw3, чтобы правила применились к новым интерфейсам или наоборот - были удалены для более несуществующих интерфейсов. В варианте nftables происходит лишь перезагрузка сетов wanif, wanif6 и flowtable.
### custom скрипты
Стандартный инстанс [NFQWS2_OPT](#файл-config) не всегда может решить специфические задачи. Перехват осуществляется только по портам. Нет возможности вписать дополнительные условия - например, перехватить особый пейлоад на любом порту, задать особый фильтр connbytes или использовать специальный kernel ipset и применять особые стратегии к этому перехваченному трафику.
Все это очень частно и не годится для реализации в основном функционале. Поэтому и создана система custom скриптов, которые представляют собой shell includes и располагаются в `init.d/sysv/custom.d` или `init.d/openwrt/custom.d`. Их основная задача - поднять нужные вам правила firewall и запустить инстансы nfqws2 с нужными параметрами. Возможны и другие вспомогательные действия.
custom скрипт может иметь следующие shell функции, которые вызываются системой запуска :
* zapret_custom_daemons - поднятие и останов демонов. $1 = 1 - поднятие, 0 - останов.
* zapret_custom_firewall - поднятие и снятие правил iptables. $1 - поднятие, 0 - снятие.
* zapret_custom_firewall_nft - поднятие правил nftables. останов не требуется, поскольку основной код при останове очищает цепочки nft вместе с custom правилами.
* zapret_custom_firewall_nft_flush - вызывается при останове nftables, чтобы можно было удалить обьекты, выходящие за рамки стандартных цепочек - такие, как собственные set-ы или собственные цепочки.
Если вам не нужны iptables или nftables, функции для соответствующего типа firewall можно не писать. В функциях крайне желательно пользоваться хелперами основного кода - так вы будете следовать идеологии скриптов запуска без необходимости сосредотачиваться на частностях. Можно свободно адресовать переменные [config](#файл-config) и добавлять туда свои.
Лучший способ начать писать свои скрипты - изучить готовые в `init.d/custom.d.examples.linux`.
#### custom хелперы
Это функции из основного кода скриптов запуска, которые будут полезны при написании custom скриптов.
##### Получение динамических номеров
```
alloc_dnum()
# $1 - имя переменной, которой присваивается номер демона
alloc_qnum()
# $1 - имя переменной, которой присваивается номер очереди
```
Функции получения динамических номеров из пула необходимы, чтобы между разными скриптами запуска не возникло конфликтов. Номер очереди - уникальное значение, 2 инстанса не могут висеть на одной очереди. Второй вылетит с ошибкой. Номер демона нужен для отслеживания PID. При пересечении не будет корректно работать start/stop/restart.
Следует вызывать не из функции, а из основного кода скрипта - вне функции. custom скрипты всегда выполняются в алфавитном порядке - это стандартная схема ".d" директорий в unix. При одинаковом наборе скриптов всегда для каждого скрипта будут возвращаться одни и те же значения qnum и dnum как при старте, так и при останове, поэтому можно их использовать в качестве уникальных номеров и не попасть на чужие номера. Если после старта был изменен состав custom скриптов - правило нарушится, и будут проблемы. Поэтому лучше не менять состав custom скриптов , пока zapret2 запущен.
##### Работа с демонами
```
do_nfqws()
# $1 - 1 - старт , 0 - останов
# $2 - номер демона
# $3 - параметры nfqws2
```
Запуск или останов инстанса nfqws2. Базовые параметры приписываются автоматически. К базовым параметрам относится выбор user, fwmark и подключение стандартных скриптов LUA - [zapret-lib.lua](#библиотека-базовых-функций-zapret-liblua), [zapret-antidpi.lua](#библиотека-программ-атаки-на-dpi-zapret-antidpilua), [zapret-auto.lua](#библиотека-программ-автоматизации-и-оркестрации-zapret-autolua).
Номер очереди вы должны указать сами в `--qnum`.
```
filter_apply_hostlist_target()
# $1 - имя переменной с опциями nfqws2
```
Осуществляет замену маркеров `<HOSTLIST>` и `<HOSTLIST_AUTO>` в $1 зависимости от режима фильтрации [MODE_FILTER](#файл-config) и наличия файлов листов в ipset.
```
standard_mode_daemons()
# $1 - 1 - старт , 0 - останов
```
Запуск или останов [стандартного инстанса](#файл-config) nfqws2.
Можно локально переопределить любые переменные config.
##### Работа с iptables
```
fw_nfqws_post()
fw_nfqws_pre()
# $1 - 1 - поднятие, 0 - опускание
# $2 - фильтр iptables для ipv4
# $3 - фильтр iptables для ipv6
# $4 - номер очереди
```
Поднятие и опускание правил перенаправления в очередь для nfqws2. Фильтры пишутся отдельно для ipv4 и ipv6, поскольку могут содержать специфические элементы для одной версии ip протокола, которые вызовут ошибку для другой версии.
"post" означает цепочку для выходного трафика, "pre" - для входного.
К правилам приписывается слева $FW_EXTRA_PRE, справа $FW_EXTRA_POST.
Что не следует писать в фильтр :
* Проверку стандарных exclude ipset - nozapret, nozapret6.
* Проверку по [DESYNC_FWMARK](#файл-config).
Будут ли применены правила для каждой версии ip зависит от настроек [config](#файл-config).
```
zapret_do_firewall_standard_tpws_rules_ipt()
# $1 - 1 - поднятие, 0 - опускание
```
Применить или снять правила iptables для [стандартного](#файл-config) инстанса nfqws2.
Можно локально переопределять переменные [config](#файл-config) и применять FW_EXTRA_POST и FW_EXTRA_PRE.
```
filter_apply_ipset_target()
# $1 - имя переменной с правилами фильтра iptables
# $2 - имя переменной с правилами фильтра ip6tables
```
Добавляет в переменные $1 и $2 проверку на стандартные set-ы zapret/zapret6 в исходящем направлении (dst).
```
reverse_nfqws_rule_stream()
# stdin - правила фильтра iptables или ip6tables
reverse_nfqws_rule()
# $@ правила фильтра iptables или ip6tables
```
Замена элементов iptables фильтра с прямого на обратное направление - меняется dst на src. Результат выводится в stdout.
```
ipt()
ipta()
ipt_del()
ipt6()
ipt6a()
ipt6_del()
# $@ - правило iptables
ipt_add_del()
ipta_add_del()
ipt6_add_del()
ipt6a_add_del()
# $1 - 1 - добавление, 0 - удаление
# $2+ - все остальные аргументы определяют правило iptables
```
Набор функций для управления правилами iptables. Все функции, добавляющие правила, проверяют сначала наличие правила, и если оно уже есть - не добавляют. Это необходимо для предотвращения дублирования правил. Ко всем правилам добавляется слева $FW_EXTRA_PRE, справа - $FW_EXTRA_POST. Буква "6" означает работу с ipv6, ее отсутствие - работу с ipv4.
Все правила начинаются с имени цепочки без команды iptables '-A', '-D', '-I' и т.д.
* ipt - iptables -I - добавление в начало
* ipta - iptables -A - добавление в конец
* ipt_del - iptables -D - удаление
* ipt_add_del - добавление через -I или удаление. в $1 - 1 - добавление, 0 - удаление. Само правило идет начиная с $2.
* ipta_add_del - как в предыдущем варианте, только -A вместо -I
```
ipt_first_packets()
# $1 - количество пакетов или строка "keepalive"
```
Выдает в stdout "-m connbytes --connbytes-dir=original --connbytes-mode=packets --connbytes $RANGE". RANGE определяется как "1:$1". Если $1 = "keepalive", не выдается ничего (нет фильтра по connbytes).
##### Работа с nftables
```
nft_fw_nfqws_post()
nft_fw_nfqws_pre()
# $1 - фильтр nftables для ipv4
# $2 - фильтр nftables для ipv6
# $3 - номер очереди
```
Поднятие и опускание правил перенаправления в очередь для nfqws2. Фильтры пишутся отдельно для ipv4 и ipv6, поскольку могут содержать специфические элементы для одной версии ip протокола, которые вызовут ошибку для другой версии.
"post" означает цепочку для выходного трафика, "pre" - для входного. Тип цепочки выбирается в зависимости от переменной [POSTNAT](#файл-config). Если вам нужна конкретная цепочка - можно переопределить POSTNAT на один вызов или как локальную переменную в функции.
К правилам приписывается слева $FW_EXTRA_PRE, справа $FW_EXTRA_POST.
Что не следует писать в фильтр :
* Проверку стандарных exclude ipset - nozapret, nozapret6.
* Проверку по [DESYNC_FWMARK](#файл-config).
Будут ли применены правила для каждой версии ip зависит от настроек [config](#файл-config).
```
zapret_do_firewall_standard_tpws_rules_nft()
```
Применить правила nftables для [стандартного](#файл-config) инстанса nfqws2.
Можно локально переопределять переменные [config](#файл-config) и применять FW_EXTRA_POST и FW_EXTRA_PRE.
```
nft_filter_apply_ipset_target()
# $1 - имя переменной с правилами фильтра nftables для ipv4
# $2 - имя переменной с правилами фильтра nftables для ipv6
```
Добавляет в переменные $1 и $2 проверку на стандартные set-ы zapret/zapret6 в исходящем направлении (dst).
```
nft_reverse_nfqws_rule()
# $@ - правило фильтра nftables
```
Замена элементов nftables фильтра с прямого на обратное направление - меняется dst на src. Результат выводится в stdout.
```
nft_create_set()
# $1 - имя сета
# $2 - параметры внутри { }
nft_del_set()
# $1 - имя сета
nft_flush_set()
# $1 - имя сета
nft_set_exists()
# $1 - имя сета
nft_add_set_element()
# $1 - имя сета или map
# $2 - элемент
nft_add_set_elements()
# $1 - имя сета или map
# $2,$3,... - элементы
nft_flush_chain()
# $1 - имя цепочки
nft_add_rule()
# $1 - имя цепочки
# $2+ - правило nftables
nft_insert_rule()
# $1 - имя цепочки
# $2+ - правило nftables
```
Функции работают с таблицей zapret2 и позволяют избавиться от прямого вызова nft с указанием жестко заданного имени таблицы. Названия говорят сами за себя.
```
nft_first_packets()
# $1 - количество пакетов или "keepalive"
```
Выдает в stdout "ct original packets $RANGE". RANGE определяется как "1-$1", если $1 > 1, "1", если $1 = 1. Если $1 = "keepalive", не выдается ничего (нет фильтра по connbytes).
##### Дополнительные функции
Множество полезных хелперов расположены в `common/base.sh`. Их назначение несложно понять по коду.
## Инсталлятор