---
title: out-range / in-range — диапазоны обработки пакетов
zapret2-version: v0.9.4.5
tags: out-range, in-range, диапазон, пакеты, conntrack, data-packet
created: 2026-03-29
updated: 2026-04-15
source: community
---

## Формат `--out-range` / `--in-range`:

```
--out-range=[(n|a|d|s|p|b|x)<int>](-|<)[(n|a|d|s|p|b|x)<int>]
             ───────────────────────────────────────────
                  FROM          SEPARATOR      TO
```

### Префиксы (режимы счёта):

| Префикс | Значение          | Что считает                                                      |
|---------|-------------------|------------------------------------------------------------------|
| `n`     | packet **n**umber | Порядковый номер перехваченного пакета (в выбранном направлении) |
| `d`     | **d**ata packet   | Только пакеты с payload (данными)                                |
| `s`     | **s**equence      | Относительный TCP sequence number                                |
| `p`     | data **p**osition | Относительная позиция данных в TCP sequence                      |
| `b`     | **b**yte count    | Количество переданных байт                                       |
| `a`     | **a**lways        | Всегда (без числа)                                               |
| `x`     | ne**x**t/never    | Никогда (без числа)                                              |

> Важно: все счётчики (`n/d/b/s/p`) считаются **только по тем пакетам, которые реально попали в движок** (перехвачены
> NFQUEUE/WinDivert и не отфильтрованы раньше).
> Если какой-то пакет “мимо” (не перехвачен или отсеян, например пустые ACK в winws2), он **не увеличит `n`**, и “номер
> пакета” для `--out-range` сместится.

### Разделители:

| Разделитель | Значение                         |
|-------------|----------------------------------|
| `-`         | **Включает** конечную позицию    |
| `<`         | **Не включает** конечную позицию |

---

## Примеры с `d`:

| Значение | Расшифровка                                       |
|----------|---------------------------------------------------|
| `d1-d10` | С 1-го по 10-й data-пакет **включительно**        |
| `d1<d10` | С 1-го по 9-й data-пакет (10-й **не** включён)    |
| `-d10`   | С начала (always) по 10-й data-пакет включительно |
| `d5-`    | С 5-го data-пакета и до конца (бесконечно)        |

### Что такое "data packet"?

**Data packet** (`d`) — это пакет, содержащий **payload** (данные L7). Пустые ACK, FIN, RST без данных **не считаются**.

```bash
out (клиент → сервер):
  1) SYN               → n=1, d=0
  2) ACK (пустой)      → n=2, d=0   (если этот ACK перехвачен)
  3) ClientHello/HTTP  → n=3, d=1

in (сервер → клиент):
  1) SYN-ACK           → n=1, d=0   (для --in-range, т.к. это входящее направление)
```

> Частая ловушка: пытаться считать `n` “глобально по соединению” и включать туда SYN-ACK.
> На самом деле `--out-range` считает только **outgoing**, а `--in-range` — только **incoming**.

## Важно про Windows / winws2: `--wf-tcp-empty=0` ломает ожидания по `n`

В winws2 по умолчанию обычно включено `--wf-tcp-empty=0` — это **не перехватывает пустые ACK** ради экономии CPU.
Следствие: второй исходящий пакет TCP (handshake ACK) часто **не попадает в движок**, `n` “перескакивает”, и `n2<n3`
может сработать на ClientHello.

Что делать:

- если тебе нужен именно пустой ACK — включай `--wf-tcp-empty=1`
- если тебе нужно целиться в “первый пакет с данными”, используй `d` (он стабильнее при отсеивании пустых ACK)

---

## Практический пример:

```bash
--out-range=d1-d3 --lua-desync=my_func
```

→ `my_func` будет вызываться только для **1-го, 2-го и 3-го исходящих пакетов с данными** в соединении.

```bash
--out-range=d10-d10    # ровно 10-й data packet
--out-range=d10-       # с 10-го и до бесконечности  
--out-range=-d10       # с начала до 10-го включительно
--out-range=d10<d11    # только 10-й (11-й исключён)
```
