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:
268
docs/manual.md
268
docs/manual.md
@@ -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`. Их назначение несложно понять по коду.
|
||||
|
||||
|
||||
## Инсталлятор
|
||||
|
||||
|
||||
Reference in New Issue
Block a user