# 12. Сессии и трансляции на фильтре [← Оглавление](../README.md) · [← Раздел 11: Фильтр: аппаратная платформа](11.md) --- ## 12.1. Понятие сессии: local IP:port + global IP:port + remote IP:port Вся обработка трафика на фильтре построена на понятии **сессии**. Сессия — это запись, описывающая конкретное соединение между абонентом и удалённым ресурсом. Каждая сессия содержит следующие поля: ```text <направление> <протокол> : : : <время> <тайм-аут> ``` | Поле | Описание | | ----------------- | ----------------------------------------------------------- | | **Направление** | 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 :: ``` В отличие от сессии, трансляция **не содержит** 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@ "show session local 10.0.0.1" ``` Соединение с фильтром устанавливается, команда выполняется, результат возвращается на терминал. Дальнейшая обработка выполняется средствами операционной системы (bash-скрипты, grep и т.д.). Внутренние pipe-операторы фильтра при удалённом вызове через SSH могут **не работать** — в этом случае следует использовать внешние средства обработки вывода. --- [← Оглавление](../README.md) · [← Раздел 11: Фильтр: аппаратная платформа](11.md) · [Раздел 13: Фильтр: первоначальная настройка и CLI →](13.md)