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
2026-01-28 18:09:27 +03:00
parent be88140bb0
commit 65337446d4
2 changed files with 189 additions and 15 deletions

View File

@@ -204,3 +204,8 @@ v0.8.1
* nfqws2: enable dead reasm protection in wsize=0 case
* nfqws2: --intercept
* winws2: changed icon to multi-res png up to 256px
* nfqws2: support icmp and ipp
* nfqws2: VERDICT_PRESERVE_NEXT
* nfqws2: keepsum reconstruct option
* nfqws2: more helpers
* zapret-obfs: ippxor, udp2icmp

View File

@@ -35,6 +35,7 @@
- [Структура диссекта](#структура-диссекта)
- [Особенности приема многопакетных пейлоадов](#особенности-приема-многопакетных-пейлоадов)
- [Структура track](#структура-track)
- [Особенности обработки icmp](#особенности-обработки-icmp)
- [С интерфейс nfqws2](#с-интерфейс-nfqws2)
- [Базовые константы](#базовые-константы)
- [Стандартные блобы](#стандартные-блобы)
@@ -56,6 +57,7 @@
- [parse\_hex](#parse_hex)
- [Криптография](#криптография)
- [bcryptorandom](#bcryptorandom)
- [bxor,bor,band](#bxorborband)
- [hash](#hash)
- [aes](#aes)
- [aes\_gcm](#aes_gcm)
@@ -76,12 +78,14 @@
- [reconstruct\_dissect](#reconstruct_dissect)
- [reconstruct\_hdr](#reconstruct_hdr)
- [csum\_fix](#csum_fix)
- [Получение ip адресов](#получение-ip-адресов)
- [Прием и отсылка пакетов](#прием-и-отсылка-пакетов)
- [rawsend](#rawsend)
- [raw\_packet](#raw_packet)
- [Работа с пейлоадами](#работа-с-пейлоадами)
- [маркеры](#маркеры)
- [resolve\_pos](#resolve_pos)
- [tls\_mod](#tls_mod)
- [Управление выполнением инстансов](#управление-выполнением-инстансов)
- [instance\_cutoff](#instance_cutoff)
- [lua\_cutoff](#lua_cutoff)
@@ -118,6 +122,7 @@
- [Работа с элементами L3 и L4 протоколов](#работа-с-элементами-l3-и-l4-протоколов)
- [find\_tcp\_options](#find_tcp_options)
- [ip6hdr](#ip6hdr)
- [ip protocol](#ip-protocol)
- [packet\_len](#packet_len)
- [Работа с именами хостов](#работа-с-именами-хостов)
- [genhost](#genhost)
@@ -135,6 +140,7 @@
- [ipfrag2](#ipfrag2)
- [wssize\_rewrite](#wssize_rewrite)
- [dis\_reverse](#dis_reverse)
- [IP адреса и интерфейсы](#ip-адреса-и-интерфейсы)
- [Отсылка](#отсылка)
- [rawsend\_dissect\_ipfrag](#rawsend_dissect_ipfrag)
- [rawsend\_dissect\_segmented](#rawsend_dissect_segmented)
@@ -283,7 +289,7 @@ zapret2 является пакетным манипулятором, основ
Однако, там нет никаких возможностей собственно для воздействия на трафик. Это вынесено в код на языке Lua, вызываемый из [nfqws2](#nfqws2).
Поэтому следующая по важности часть проекта - Lua код. В базовый комплект входит библиотека функций-хелперов [zapret-lib.lua](#библиотека-базовых-функций-zapret-liblua), библиотека программ автономных атак на DPI [zapret-antidpi.lua](#библиотека-программ-атаки-на-dpi-zapret-antidpilua), библиотека функций принятия динамических решений (оркестрации) [zapret-auto.lua](#библиотека-программ-автоматизации-и-оркестрации-zapret-autolua).
Дополнительно присутствует набор тестов C функций `zapret-tests.lua`, средство обфускации wireguard протокола `zapret-wgobfs.lua` и средство записи дампа пакетов в cap файлы `zapret-pcap.lua`.
Дополнительно присутствует набор тестов C функций `zapret-tests.lua`, средства обфускации трафика `zapret-obfs.lua` и средство записи дампа пакетов в cap файлы `zapret-pcap.lua`.
Проект может работать с LuaJIT-2.1+ или с PUC Lua 5.3+. Более старые версии могут иметь несовместимости, не тестируются и не поддерживаются.
@@ -331,7 +337,7 @@ conntrack отслеживает логическое направление п
Когда необходимая информация о пейлоаде получена, наступает очередь системы классификации по [профилям](#использование-множественных-профилей).
Профили содержат систему фильтров и команды действия внутри профиля.
Профили фильтруются по L3 - версия IP протокола, ipset-ы - списки IP адресов, L4 - порты tcp или udp, L6/L7 - тип протокола потока, списки доменов (хостлисты).
Профили фильтруются по L3 - версия IP протокола, номер IP протокола, ipset-ы - списки IP адресов, L4 - порты tcp или udp, type/code для icmp, L6/L7 - тип протокола потока, списки доменов (хостлисты).
Профили сканируются строго в порядке от первого к последнему. При первом совпадении условий фильтра профиля выбирается этот профиль, а сканирование прекращается.
Если ни одно из условий не выполнено, выбирается профиль по умолчанию, в котором нет никаких действий.
@@ -625,6 +631,10 @@ winws2 может принимать полные raw фильтры - вы пи
`--wf-tcp-out`, `--wf-tcp-in`, `--wf-udp-out`, `--wf-udp-in` берут список портов (`80,443`) или диапазонов портов (`80,443,500-1000`)
и включают полный перехват портов по указанному направлению.
`--wf-icmp-out`, `--wf-icmp-in` берут список icmp_type или icmp_type+icmp_code.
`--wf-ipp-in`, `--wf-ipp-out` берут список raw IP протоколов (для ipv6 не поддерживается выявление истинного протокола при наличии extension headers).
`--wf-raw-part` принимает частичные windivert фильтры. Синтаксис аналогичен `--wf-raw`. `--wf-raw-part` может быть несколько.
Частичные фильтры встраиваются конструктором в итоговый фильтр по принципу OR. Или указанные порты, или ваш фильтр1 или ваш фильтр2.
@@ -672,6 +682,7 @@ nfqws2 использует стандартный парсер getopt_long_only
--version ; вывести версию и выйти
--dry-run ; проверить валидность параметров командной строки и наличие файлов. не проверяет корректность скриптов Lua !
--comment=any_text ; любой текст. игнорируется
--intercept=0|1 ; 1 - разрешить перехват. при 0 выполняются lua-init скрипты и процесс завершается, перехват не включается, очередь NFQUEUE не инициализируется
--daemon ; отключиться от консоли (демонизироваться)
--pidfile=<filename> ; запись PID в файл
--ctrack-timeouts=S:E:F[:U] ; таймауты conntrack для стадий tcp SYN, ESTABLISHED, FIN и для udp
@@ -698,6 +709,8 @@ MULTI-STRATEGY:
--filter-l3=ipv4|ipv6 ; фильтр профиля : версия ip протокола
--filter-tcp=[~]port1[-port2]|* ; фильтр профиля : порты tcp или диапазоны портов через запятую
--filter-udp=[~]port1[-port2]|* ; фильтр профиля : порты udp или диапазоны портов через запятую
--filter-icmp=type[:code]|* ; фильтр профиля : icmp type и code через запятую. если code не задан - любой code.
--filter-ipp=proto ; фильтр профиля : номер raw ip протоколов через запятую
--filter-l7=proto[,proto] ; фильтр профиля : список протоколов потока
--ipset=<filename> ; фильтр профиля : включающий список ip адресов или подсетей из файла. может быть смешанным ipv4+ipv6.
--ipset-ip=<ip_list> ; фильтр профиля : включающий фиксированный список ip адресов или подсетей через запятую
@@ -821,6 +834,15 @@ nfqws2 <глобальные_параметры>
Если нужно, чтобы стратегия начала работу с самого первого пакета и продолжила работать дальше после изменения профиля,
нужно дублировать вызовы во всех профилях, по которым может пройти поток.
4 группы фильтров - tcp, udp, icmp и ipp обьединяются по принципу OR. Если нет ни одного фильтра из этих групп, то
считается разрешенным все. Если задается хотя бы один, остальные группы блокируются, если не определены.
Фильтр ipp не работает с протоколами tcp, udp и icmp. Проверка пойдет по группам фильтра, соответствующим протоколу. Например, если задано только `--filter-ipp=6`,
это не значит, что будут пропущены все tcp. Наоборот, это блокирует все, включая и сам tcp, потому что не задан `--filter-tcp`. Правильно будет указать `--filter-tcp=*`.
icmp автоматически подразумевает и icmpv6 - они обрабатываются единым образом. Однако, [icmp types](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) для icmp и icmpv6 отличаются. Это нужно учитывать.
### Шаблоны профилей
Когда имеется много сложных и повторяющихся стратегий, может быть удобно использовать шаблоны.
@@ -1191,8 +1213,10 @@ nfqws2 следит за превышением верхней границы с
- VERDICT_PASS передает пакет как есть без учета изменений диссекта
- VERDICT_MODIFY выполняет реконструкцию и отправку текущего диссекта
- VERDICT_DROP дропает текущий пакет
- VERDICT_PRESERVE_NEXT - отдельный бит, который нужно прибавить к основному вердикту - использовать поля "next protocol" в ipv6 header и ipv6 extension headers. в ином случае они генерируются автоматом по содержимому диссекта
Результат всех lua-desync инстансов аггрегируется : VERDICT_MODIFY замещает VERDICT_PASS, VERDICT_DROP замещает их обоих.
VERDICT_PRESERVE_NEXT применяется, если хотя бы один инстанс его вернул.
### Структура таблицы desync
@@ -1483,6 +1507,7 @@ ipv6 extension headers и tcp options представляются в форме
| ip6 | table | заголовок ipv6 |
| tcp | table | заголовок tcp |
| udp | table | заголовок udp |
| icmp | table | заголовок icmp |
| l4proto | number | IPPROTO_TCP или IPPROTO_UDP |
| transport_len | number | длина пакета без L3 заголовков |
| l3_len | number | длина L3 заголовков, включая ip options и ipv6 extension headers |
@@ -1553,10 +1578,22 @@ ipv6 extension headers и tcp options представляются в форме
**tcp options**
| Поле | Описание |
| :--- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Поле | Описание |
| :--- | :-------- |
| kind | [тип опции](https://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml) : TCP_KIND_END, TCP_KIND_NOOP, TCP_KIND_MSS, TCP_KIND_SCALE, TCP_KIND_SACK_PERM, TCP_KIND_SACK, TCP_KIND_TS, TCP_KIND_MD5, TCP_KIND_AO, TCP_KIND_FASTOPEN |
| data | блок данных опции без kind и length. отсутствует для TCP_KIND_END и TCP_KIND_NOOP |
| data | блок данных опции без kind и length. отсутствует для TCP_KIND_END и TCP_KIND_NOOP |
**icmp**
Заголовком icmp считается его постоянная часть - первые 8 байт. Они универсальны как для ipv4, так и для ipv6 версии.
Остальное содержимое icmp зависит от типа icmp и располагается в payload, включая возможные специальные поля заголовка или обрезанный исходный пакет, на который был сгенерирован icmp.
| Поле | Описание |
| :---------- | :--------------------------------------------------- |
| icmp_type | [тип icmp](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) |
| icmp_code | [код icmp](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) |
| icmp_cksum | чексумма icmp |
| icmp_data | 32-битное поле данных со смещения 4 |
### Особенности приема многопакетных пейлоадов
@@ -1642,6 +1679,23 @@ mss дублируется в поле `desync.tcp_mss` независимо о
Большее и не отследить через sequence. Нужно всегда учитывать, что при передаче больших обьемов данных они не могут служить счетчиком.
`p*counter` являются 64-битными счетчиками, поэтому у них этой проблемы нет.
#### Особенности обработки icmp
Некоторые типы icmp могут содержать прикрепленный исходный пакет, на который был сгенерирован icmp. Они называются "related".
Такие пейлоады распознаются, по ним ищется исходная запись conntrack.
Если она находится, выбирается кэшированный профиль (тот, к которому относится прикрепленный пакет).
Направление выбирается как обратное относительно найденной записи.
Тип пейлоада устанавливается как "ipv4" или "ipv6", тип протокола сеанса - из профиля исходного пакета.
Далее icmp проходит обычным образом по профилю. Нужно учитывать, что в функцию может придти диссект с icmp, без tcp или udp,
но с desync.track
Если icmp не содержит прикрепленного пакета, он инвалидный или не найдена запись conntrack, icmp проходит самостоятельно
без track.
conntrack работает только с tcp и udp, он не ведет учет пингов или других типов icmp.
При проходе icmp по записи conntrack никакие счетчики не меняются.
# С интерфейс nfqws2
Перед выполнением `--lua-init` C код выставляет базовые константы, блобы и C функции.
@@ -1683,7 +1737,15 @@ mss дублируется в поле `desync.tcp_mss` независимо о
| IP6 | number | бит "More fragment" поля ip6f_offlg из ipv6 fragment header | 0x0001 |
| IPV6_FLOWLABEL_MASK | number | flow label в ip6_flow | 0x000FFFFF |
| IPV6_FLOWINFO_MASK | number | flow label, traffic class в ip6_flow | 0x0FFFFFFF |
| IPPROTO_IP<br>IPPROTO_IPV6<br>IPPROTO_ICMP<br>IPPROTO_TCP<br>IPPROTO_UDP<br>IPPROTO_ICMPV6<br>IPPROTO_HOPOPTS<br>IPPROTO_ROUTING<br>IPPROTO_FRAGMENT<br>IPPROTO_AH<br>IPPROTO_ESP<br>IPPROTO_DSTOPTS<br>IPPROTO_MH<br>IPPROTO_HIP<br>IPPROTO_SHIM6<br>IPPROTO_NONE | number | [номера IP протоколов](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) | используются в ipv4 и ipv6 |
| IPPROTO_IP<br>IIPPROTO_IPV6<br>IPPROTO_IPIP<br>IPPROTO_ICMP<br>IPPROTO_ICMPV6<br>IPPROTO_TCP<br>IPPROTO_UDP<br>IPPROTO_SCTP<br>IPPROTO_HOPOPTS<br>IPPROTO_ROUTING<br>IPPROTO_FRAGMENT<br>IPPROTO_AH<br>IPPROTO_ESP<br>IPPROTO_DSTOPTS<br>IPPROTO_MH<br>IPPROTO_HIP<br>IPPROTO_SHIM6<br>IPPROTO_NONE | number | [номера IP протоколов](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) | используются в ipv4 и ipv6 |
| ICMP_ECHOREPLY<br>ICMP_DEST_UNREACH<br>ICMP_REDIRECT<br>ICMP_ECHO<br>ICMP_TIME_EXCEEDED<brICMP_PARAMETERPROB<br>ICMP_TIMESTAMP<br>ICMP_TIMESTAMPREPLY<br>ICMP_INFO_REQUEST<br>ICMP_INFO_REPLY | number | типы icmp |
| ICMP_UNREACH_NET<br>ICMP_UNREACH_HOST<br>ICMP_UNREACH_PROTOCOL<br>ICMP_UNREACH_PORT<br>ICMP_UNREACH_NEEDFRAG<br>ICMP_UNREACH_SRCFAIL<br>ICMP_UNREACH_NET_UNKNOWN<br>ICMP_UNREACH_HOST_UNKNOWN<br>ICMP_UNREACH_NET_PROHIB<br>ICMP_UNREACH_HOST_PROHIB<br>ICMP_UNREACH_TOSNET<br>ICMP_UNREACH_TOSHOST<br>ICMP_UNREACH_FILTER_PROHIB<br>ICMP_UNREACH_HOST_PRECEDENCE<br>ICMP_UNREACH_PRECEDENCE_CUTOFF | number | коды icmp для destination unreachable |
| ICMP_REDIRECT_NET<br>ICMP_REDIRECT_HOST<br>ICMP_REDIRECT_TOSNET<br>ICMP_REDIRECT_TOSHOST | number | коды icmp для icmp redirect |
| ICMP_TIMXCEED_INTRANS<br>ICMP_TIMXCEED_REASS | number | коды icmp для time exceeded |
| ICMP6_ECHO_REQUEST<br>ICMP6_ECHO_REPLY<br>ICMP6_DST_UNREACH<br>ICMP6_PACKET_TOO_BIG<br>ICMP6_TIME_EXCEEDED<br>ICMP6_PARAM_PROB<br>MLD_LISTENER_QUERY<br>MLD_LISTENER_REPORT<br>MLD_LISTENER_REDUCTION<br>ND_ROUTER_SOLICIT<br>ND_ROUTER_ADVERT<br>ND_NEIGHBOR_SOLICIT<br>ND_NEIGHBOR_ADVERT<br>ND_REDIRECT | number | типы icmpv6 |
| ICMP6_DST_UNREACH_NOROUTE<br>ICMP6_DST_UNREACH_ADMIN<br>ICMP6_DST_UNREACH_BEYONDSCOPE<br>ICMP6_DST_UNREACH_ADDR<br>ICMP6_DST_UNREACH_NOPORT | number | коды icmpv6 для destination unreachable |
| ICMP6_TIME_EXCEED_TRANSIT<br>ICMP6_TIME_EXCEED_REASSEMBLY | number | коды icmpv6 для time exceeded |
| ICMP6_PARAMPROB_HEADER<br>ICMP6_PARAMPROB_NEXTHEADER<br>ICMP6_PARAMPROB_OPTION | number | коды icmpv6 для parameter problem |
## Стандартные блобы
@@ -1889,6 +1951,17 @@ function bcryptorandom(size)
Если пул энтропии исчерпывается, может вызывать зависания. Чтобы этого не было - установите haveged или rngd.
Не стоит использовать для получения случайных данных, не требующих крипто-стойкости.
#### bxor,bor,band
```
function bxor(data1, data2)
function band(data1, data2)
function bor(data1, data2)
```
Возвращает результат побайтового xor,and или or между raw строками data1 и data2. data1 и data2 должны быть равны по длине,
иначе вызывается error.
#### hash
```
@@ -1970,7 +2043,6 @@ function gunzip_inflate(zstream, compressed_data, expected_uncompressed_chunk_si
* gunzip_init создает и возвращает контекст gzip потока для последующих вызовов других функций. Значение windowBits см. в документации по zlib (по умолчанию 47).
* gunzip_end освобождает контекст gzip. может быть освобожден сборщиком мусора, но лучше вызывать явно.
* вместо явного вызова gunzip_end в Lua 5.5+ для контекста можно использовать to-be-closed variable
* gunzip_inflate разжимает очередную часть зипованных данных. Данные можно скармливать частями. Разжатые части конкатенируются для получения полных данных. Возвращается 2 аргумента : расжатые данные и bool признак конца gzip. В случае испорченных данных или при нехватке памяти возвращается nil.
* expected_uncompressed_chunk_size - необязательный параметр для оптимизации выделения памяти под разжимаемые данные. Если буфера не хватает, вызываются realloc, копирующие блоки памяти и влияющие на производительность. Размер следует выбирать согласно ожидаемой степени сжатия с небольшим запасом. По умолчанию - четырехкратный размер compressed_data.
@@ -2028,14 +2100,15 @@ function gettid()
| Поле | Тип | Описание |
| :---------------- | :----- | :-------------------------------------------------------------------------------------------- |
| keepsum | bool | взять чексумму L4 из диссекта, не считать и не портить |
| badsum | bool | испортить L4 checksum. посчитать чексумму и сделать xor со случайным значением от 1 до 0xFFFF |
| ip6_preserve_next | bool | использовать значения "next" из ip6.exthdr |
| ip6_last_proto | number | если ip6_preserve_next=false, IP протокол последнего exthdr |
При сборке ipv6 по умолчанию цепочка ip протоколов в exthdr собирается автоматически.
У каждого exthdr есть поле type, поэтому понятно что вписывать в предыдущий exthdr,
либо в основной ip6 хедер. next протокол последнего exthdr устанавливатеся как IPPROTO_TCP
или IPPROTO_UDP в зависимости от наличия в диссекте таблиц tcp или udp.
либо в основной ip6 хедер. next протокол последнего exthdr устанавливатеся как IPPROTO_TCP,
IPPROTO_UDP, IPPROTO_ICMP, IPPROTO_ICMPV6 в зависимости от наличия в диссекте таблиц tcp, udp, icmp, ip6.
В большинстве случаев это удобно, поскольку вам при вставлении exthdr не надо реконструировать
всю цепочку next протоколов и не надо заполнять поля next. За вас это сделает реконструктор диссекта.
@@ -2113,6 +2186,7 @@ ip6.ip6_len должен быть рассчитан таким, каким он
```
function reconstruct_tcphdr(tcp)
function reconstruct_udphdr(udp)
function reconstruct_icmphdr(icmp)
function reconstruct_iphdr(ip)
function reconstruct_ip6hdr(ip6, reconstruct_opts)
```
@@ -2121,7 +2195,7 @@ function reconstruct_ip6hdr(ip6, reconstruct_opts)
- реконструкция ip6 задействует reconstruct_opts. из них берется ip6_preserve_next и ip6_last_proto.
- чексумма ip header считается автоматически, поскольку ни от чего больше не зависит
- чексуммы tcp и udp не считаются, поскольку зависят от других компонент
- чексуммы tcp, udp и icmp не считаются, поскольку зависят от других компонент
#### csum_fix
@@ -2129,17 +2203,56 @@ function reconstruct_ip6hdr(ip6, reconstruct_opts)
function csum_ip4_fix(raw_ipv4_header)
function csum_tcp_fix(raw_ip_header, raw_tcp_header, payload)
function csum_udp_fix(raw_ip_header, raw_udp_header, payload)
function csum_icmp_fix(raw_ip_header, raw_icmp_header, payload)
```
Функции для выправления чексумм. Поскольку строки в Lua immutable, они возвращают копию соответствующего заголовка
с исправленной чексуммой.
- с csum_ipv4_fix все просто. на входе ip заголовок, на выходе ip заголовок с исправленной суммой
- csum_tcp_fix и csum_udp_fix берут raw ip заголовок (ipv4 или ipv6), tcp/udp заголовок и пейлоад. версия ip определяется автоматически. чексумма считается на базе L3, L4 заголовков и пейлоада.
- csum_tcp_fix, csum_udp_fix, csum_icmp_fix берут raw ip заголовок (ipv4 или ipv6), tcp/udp/icmp заголовок и пейлоад. версия ip определяется автоматически. чексумма считается на базе L3, L4 заголовков и пейлоада.
Прямая реконструкция отдельных заголовков нужна редко. Обычно все задачи выполняют функции по работе с диссектами.
Но если у вас особый случай, например вам нужно сконструировать icmp, то вам придется собирать его по частям и использовать rawsend для отсылки.
csum_ip4_fix вам наверняка понадобится.
### Получение ip адресов
```
function get_source_ip(target)
```
Получить из таблицы маршрутизации ip адрес источника, который будет использован для подключению к ip адресу target.
target представляет собой raw string ipv4 или ipv6.
Функция возвращает raw string адреса источника или nil, если destination unreachable.
```
function get_ifaddrs()
```
Получить список IP адресов на всех интерфейсах (аналог ip addr, ifconfig, ipconfig).
Возвращается таблица, индексы которой являются именами интерфейсов.
Для Windows имена интерфейсов представлены строками "число.число" - IfIdx.SubIfIdx - как раз то, что выдает и берет windivert.
Содержимое интерфейса :
| Поле | Тип | Описание |
| :---------------- | :----- | :------------------ |
| index | number | индекс интерфейса |
| mtu | number | MTU. для loopback может быть 64K или даже 0xFFFFFFFF |
| flags | number | битовые флаги. зависят от ОС |
| ssid | string | SSID wifi сети, если известен. имена сетей получаются только при использовании `--filter-ssid` |
| guid<br>iftype<br>index6<br>speed_xmit<br>speed_recv<br>metric4<br>metric6<br>conntype<br> | number | (только windows) дополнительные поля из GetAdaptersAddresses() |
| addr | table | таблица адресов с числовыми индексами от 1 |
Содержимое адреса :
| Поле | Тип | Описание |
| :----------- | :----- | :------------------ |
| addr | string | ipv4 или ipv6 адрес |
| netmask | string | маска подсети |
| broadcast | string | (только ipv4) broadcast адрес |
| dst | string | содержимое ifa_dstaddr из getifaddrs() |
Единственное гарантированное поле - addr. Остальных может не быть.
### Прием и отсылка пакетов
@@ -2203,6 +2316,25 @@ function resolve_range(blob,l7payload_type,marker_list[,strict,zero_based_pos])
- если задано zero_based_pos=true, все позиции начинаются с 0, иначе с 1, как это принято в Lua.
- при невалидных значениях l7payload_type, marker, marker_list, если количество маркеров не равно 2 для resolve_range - вызывается error
#### tls_mod
```
function tls_mod(blob, modlist, payload)
```
- blob - блоб, с которым производится действие
- payload - содержимое, под которое модифицируется blob. для разных модов может быть произвольным или требуется валидный tls.
- modlist - список модификаций
Моды :
- **rnd** - заполнить поля random и session id случайными данными
- **dupsid** - скопировать session id с payload. выполняется после rnd, требует валидного tls в payload, иначе не применяется
- **rndsni** - замена sni на случайный. если длина оригинального sni >=7 символов, выбирается случайный поддомен из известных 3-буквенных TLD. иначе без точки случайные символы `[a-z][a-z0-9]*`
- **sni**=domain.com - замена sni на конкретный домен
- **padencap** - подкорректировать blob таким образом, чтобы payload стал частью padding extension. payload может быть произвольным.
### Управление выполнением инстансов
#### instance_cutoff
@@ -3024,6 +3156,26 @@ function del_ip6_exthdr(ip6, idx)
function fix_ip6_next(ip6, last_proto)
```
### ip protocol
```
function ip_proto_l3(dis)
function ip_proto_l4(dis)
function ip_proto(dis)
```
Функции "додумывают" ip protocol полезной нагрузки диссекта dis.
* ip_proto_l3 - ipv4 - ip.ip_p , ipv6 - ip6.ip6_nxt или next из последнего extension header. nil, если next пуст.
* ip_proto_l4 - IPPROTO_TCP, IPPROTO_UDP, IPPROTO_ICMP, IPPROTO_UDP в зависимости от наличия в диссекте tcp,udp,icmp,ip6. nil, если tcp,udp,icmp отсутствуют.
* ip_proto - ip_proto_l4. если он вернул nil, то ip_proto_l3.
```
function fix_ip_proto(dis, proto)
```
Установить протокол полезной нагрузки диссекта dis как proto. Если proto не задан - использовать результат ip_proto(dis).
### packet_len
Эти функции работают с диссектом ipv6 заголовка ip6 и его extension headers - ip6.exthdr.
@@ -3310,6 +3462,23 @@ function dis_reverse(dis)
Поменять местами ip адреса и порты src/dst и seq/ack.
## IP адреса и интерфейсы
```
function update_ifaddrs()
```
Обертка вокруг C функции [get_ifaddrs](#get-ifaddrs). Может так случиться, что надо узнавать адреса на каждом пакете.
Каждый раз дергать get_ifaddrs тяжело для системы. Адреса и интерфейсы меняются редко. Хотелось бы из закэшировать.
update_ifaddrs() берет на себя функцию ведения кэша, который обновляется не чаще 1 раза в секунду.
Результат кладется в глобальную переменную ifaddrs.
```
function ip2ifname(ip)
```
Получить имя интерфейса, на котором находится ip адрес, используя кэш ifaddrs. nil, если не найден.
## Отсылка
Следующие функции могут брать несколько блоков описанных выше опций, каждый из которых представлен полем параметра options.
@@ -3676,7 +3845,7 @@ function syndata(ctx, desync)
- arg: [standard reconstruct](#standard-reconstruct)
- arg: [standard rawsend](#standard-rawsend)
- arg: blob - [blob](#передача-блобов), содержащий фейковый payload. Должен помещаться в один пакет, сегментация невозможна.
- arg: tls_mod - применить указанный tls_mod к пейлоаду blob
- arg: tls_mod - применить указанный [tls_mod](#tls_mod) к пейлоаду blob
Функция добавляет в tcp SYN пакет пейлоад, применяет к нему модификации и отправляет вместо оригинала, вынося VERDICT_DROP.
Если проходит пакет без SYN, выполняется [instance cutoff](#instance_cutoff).
@@ -3727,7 +3896,7 @@ function fake(ctx, desync)
- arg: [standard rawsend](#standard-rawsend)
- arg: blob - blob, содержащий фейковый payload. Может быть любой длины - сегментация выполняется автоматически.
- arg: optional - отказ от операции, если blob отсутствует
- arg: tls_mod - применить указанный tls_mod к пейлоаду blob
- arg: tls_mod - применить указанный [tls_mod](#tls_mod) к пейлоаду blob
- payload фильтр по умолчанию - "known"
Это прямой фейк - отдельный пакет или группа пакетов. Функция не выносит вердикт и не блокирует отправку оригинала.