# 12. Сессии и трансляции на фильтре

[← Оглавление](../README.md) · [← Раздел 11: Фильтр: аппаратная платформа](11.md)

---

## 12.1. Понятие сессии: local IP:port + global IP:port + remote IP:port

Вся обработка трафика на фильтре построена на понятии **сессии**. Сессия — это запись, описывающая конкретное соединение между абонентом и удалённым ресурсом. Каждая сессия содержит следующие поля:

```text
    <направление> <протокол> <local IP>:<port> <global IP>:<port> <remote IP>:<port> <время> <тайм-аут>
```

| Поле              | Описание                                                    |
| ----------------- | ----------------------------------------------------------- |
| **Направление**   | Egress (от абонента) или Ingress (к абоненту) — по первому пакету |
| **Протокол**      | Протокол L4: TCP, UDP, ICMP                                |
| **Local IP:port** | IP-адрес и порт абонента (серый, до NAT)                    |
| **Global IP:port**| IP-адрес и порт после NAT-трансляции (белый)                |
| **Remote IP:port**| IP-адрес и порт удалённого ресурса в интернете              |
| **Время**         | Время последнего пакета в рамках данной сессии              |
| **Тайм-аут**      | Время, через которое сессия будет удалена при отсутствии трафика |

Сессия создаётся автоматически при прохождении первого пакета нового соединения через фильтр. Все последующие пакеты в рамках этого же соединения привязываются к уже существующей сессии.

## 12.2. Понятие трансляции: local IP:port ↔ global IP:port

**Трансляция** — это более простая сущность, описывающая связку между локальным (серым) адресом абонента и глобальным (белым) адресом из NAT-пула:

```text
    <local IP>:<port> ↔ <global IP>:<port>
```

В отличие от сессии, трансляция **не содержит** remote-адреса. Это внутренняя абстракция фильтра, описывающая, каким образом транслируется адрес конкретного абонента.

Для просмотра трансляций используется команда `show xl` (в отличие от `show session` для сессий).

## 12.3. Режим без NAT: local = global

В проекте ТСПУ **NAT-трансляция не используется** — фильтр работает как прозрачное L2-устройство и не изменяет IP-адреса в пакетах. В этом режиме:

- **Local IP** всегда **совпадает** с **Global IP**;
- Local port всегда совпадает с Global port;
- Для IPv6-трафика NAT в принципе отсутствует.

```text
    Режим с NAT (не используется в ТСПУ):
    ┌──────────────┐     ┌──────────────┐     ┌──────────────┐
    │ Local IP     │ ──► │ Global IP    │ ──► │ Remote IP    │
    │ 10.0.0.1:80  │     │ 203.0.113.5  │     │ 93.184.216.34│
    └──────────────┘     └──────────────┘     └──────────────┘

    Режим без NAT (используется в ТСПУ):
    ┌──────────────┐     ┌──────────────┐     ┌──────────────┐
    │ Local IP     │  =  │ Global IP    │ ──► │ Remote IP    │
    │ 10.0.0.1:80  │     │ 10.0.0.1:80  │     │ 93.184.216.34│
    └──────────────┘     └──────────────┘     └──────────────┘
```

Несмотря на то, что в режиме без NAT поля Local и Global дублируются, структура сессии остаётся прежней — это наследие архитектуры платформы, начинавшейся как CGNAT-устройство (подробнее — в [разделе 11.6](11.md)). На практике это означает, что команды фильтрации с ключевым словом `global` в нашем проекте **не имеют большого смысла** — достаточно использовать `local` и `remote`.

## 12.4. Направление сессии: Egress (от абонента) / Ingress (к абоненту)

Каждая сессия имеет **направление**, которое определяется **по первому пакету**, создавшему эту сессию:

| Направление | Первый пакет пришёл со стороны | Значение                          |
| ----------- | ------------------------------ | --------------------------------- |
| **Egress**  | LAN-порт (абонент)             | Абонент инициировал соединение    |
| **Ingress** | WAN-порт (интернет)            | Соединение инициировано извне     |

Направление фиксируется **один раз** в момент создания сессии и больше не меняется. Никакого другого смысла, кроме указания стороны первого пакета, у направления нет.

Типичный сценарий: абонент открывает веб-страницу — первый SYN-пакет приходит со стороны LAN, сессия создаётся как **Egress**. Если же к абоненту приходит входящее соединение из интернета — первый пакет приходит со стороны WAN, сессия создаётся как **Ingress**.

## 12.5. Принцип: локальный IP абонента всегда на первом месте

Независимо от направления трафика, фильтр **всегда записывает** локальный IP-адрес абонента в поле **Local IP** — первое поле адресов в сессии:

```text
    Пакет от абонента (LAN → WAN):
    ┌─────────────────────────────────────────────────────┐
    │ Source IP: 10.0.0.1  →  записывается в Local IP     │
    │ Dest IP:   93.184.216.34  →  записывается в Remote IP│
    └─────────────────────────────────────────────────────┘

    Пакет к абоненту (WAN → LAN):
    ┌─────────────────────────────────────────────────────┐
    │ Source IP: 93.184.216.34  →  записывается в Remote IP│
    │ Dest IP:   10.0.0.1  →  записывается в Local IP     │
    └─────────────────────────────────────────────────────┘
```

То есть для пакетов со стороны LAN: Source IP → Local IP, Destination IP → Remote IP.
Для пакетов со стороны WAN: поля **меняются местами** — Destination IP → Local IP, Source IP → Remote IP.

Это **крайне важный принцип** для траблшутинга. Если при просмотре сессий в поле Local IP появляются интернет-адреса (которые там быть не должны), это признак проблемы на пути прохождения трафика — например, **перепутки LAN/WAN** (подробнее — в [разделе 24.6](24.md)).

## 12.6. Связь трансляций и сессий: одна трансляция — много сессий

В рамках одной трансляции может существовать **несколько сессий**:

```text
    Трансляция (одна):
    10.0.0.1:12345 ↔ 10.0.0.1:12345

        Сессия 1:  10.0.0.1:12345 → 93.184.216.34:443
        Сессия 2:  10.0.0.1:12345 → 151.101.1.69:443
        Сессия 3:  10.0.0.1:12345 → 104.16.132.229:80
        ...
        Сессия N:  10.0.0.1:12345 → 8.8.8.8:53
```

Логика жизненного цикла:

1. Проходит первый пакет нового соединения → создаётся **трансляция** и одновременно с ней первая **сессия**;
2. Если с того же локального адреса и порта устанавливаются соединения к другим ресурсам → создаются **новые сессии** в рамках той же трансляции;
3. Сессии удаляются индивидуально по своим тайм-аутам;
4. Трансляция **удаляется только после того**, как умерла последняя сессия в её рамках.

Пример: один абонентский порт может иметь одну трансляцию и сотни связанных сессий к различным ресурсам.

## 12.7. Тайм-ауты сессий и трансляций

Тайм-ауты для сессий и трансляций задаются **раздельно** в секции NAT Defaults конфигурации фильтра (подробнее — в [разделе 15.3](15.md)):

- **Тайм-аут сессии** — время с момента последнего пакета, после которого сессия удаляется;
- **Тайм-аут трансляции** — время с момента удаления последней связанной сессии, после которого удаляется сама трансляция.

Параметры тайм-аутов устанавливаются в секции NAT Defaults в качестве значений по умолчанию. При создании конкретного пула эти значения наследуются, но могут быть **переопределены** на уровне пула, если необходимо.

В выводе команды `show session` для каждой сессии отображаются:
- **Время последнего пакета** — когда был последний пакет в рамках данной сессии;
- **Оставшееся время жизни** — через сколько сессия будет удалена при отсутствии нового трафика.

## 12.8. Команды: `show session`, `show xl`, фильтрация по `local`/`remote`, pipe и count

### Основные команды

| Команда          | Назначение                          |
| ---------------- | ----------------------------------- |
| `show session`   | Просмотр таблицы сессий             |
| `show xl`        | Просмотр таблицы трансляций         |

### Фильтрация по адресам

Обе команды поддерживают фильтрацию по ключевым словам:

| Ключевое слово | Фильтрация по             | Пример                                    |
| -------------- | ------------------------- | ----------------------------------------- |
| `local`        | Локальный IP-адрес         | `show session local 10.0.0.1`             |
| `global`       | Глобальный IP-адрес        | В проекте ТСПУ не имеет смысла (= local)  |
| `remote`       | Удалённый IP-адрес         | `show session remote 93.184.216.34`       |
| `la`           | Локальный IP + порт        | `show session la 10.0.0.1:12345`          |
| `ga`           | Глобальный IP + порт       | В проекте ТСПУ не имеет смысла (= la)     |
| `ra`           | Удалённый IP + порт        | `show session ra 93.184.216.34:443`       |

В контексте проекта ТСПУ (без NAT) наиболее полезны фильтры `local` и `remote`, поскольку `global` всегда дублирует `local`.

### Pipe-операторы

Результат вывода можно обработать через **pipe** (`|`), поддерживающий несколько операторов:

| Оператор    | Назначение                                        |
| ----------- | ------------------------------------------------- |
| `include`   | Показать только строки, содержащие заданный паттерн |
| `exclude`   | Исключить строки, содержащие заданный паттерн      |
| `count`     | Подсчитать количество строк в выводе               |
| `more`      | Постраничный вывод                                 |

Pipe-операторы можно **комбинировать последовательно**. Пример:

```text
    show session local 10.0.0.1 | include 6881 | count
```

Эта команда выведет количество сессий абонента `10.0.0.1`, в которых присутствует порт `6881` (характерный для BitTorrent).

### Удалённый доступ к сессиям

API для удалённого доступа к данным фильтра отсутствует. Однако можно получить информацию удалённо через **SSH-команду**:

```text
    ssh admin@<IP-фильтра> "show session local 10.0.0.1"
```

Соединение с фильтром устанавливается, команда выполняется, результат возвращается на терминал. Дальнейшая обработка выполняется средствами операционной системы (bash-скрипты, grep и т.д.). Внутренние pipe-операторы фильтра при удалённом вызове через SSH могут **не работать** — в этом случае следует использовать внешние средства обработки вывода.

---

[← Оглавление](../README.md) · [← Раздел 11: Фильтр: аппаратная платформа](11.md) · [Раздел 13: Фильтр: первоначальная настройка и CLI →](13.md)
