# Локальные политики

Локальные политики позволяют настраивать различные уровни пользователей и соответствующие им политики, например, настройки тайм-аута подключения.  
Каждое соединение, обрабатываемое Xray, соответствует определенному пользователю, и к нему применяются политики в соответствии с уровнем пользователя (level).

## PolicyObject

`PolicyObject` соответствует полю `policy` в конфигурационном файле.

```json
{
  "policy": {
    "levels": {
      "0": {
        "handshake": 4,
        "connIdle": 300,
        "uplinkOnly": 2,
        "downlinkOnly": 5,
        "statsUserUplink": false,
        "statsUserDownlink": false,
        "statsUserOnline": false,
        "bufferSize": 4
      }
    },
    "system": {
      "statsInboundUplink": false,
      "statsInboundDownlink": false,
      "statsOutboundUplink": false,
      "statsOutboundDownlink": false
    }
  }
}
```

> `level`: map{string: [LevelPolicyObject](#levelpolicyobject)}

Набор пар ключ-значение, где каждый ключ - это число в виде строки (требование JSON), например `"0"`, `"1"` и т.д. (кавычки обязательны).  
Это число соответствует уровню пользователя.  
Каждое значение - это [LevelPolicyObject](#levelpolicyobject).

::: tip
Теперь можно настроить уровень пользователя для каждого входящего и исходящего подключения.  
Xray будет применять различные локальные политики в соответствии с фактическим уровнем пользователя.
:::

> `system`: [SystemPolicyObject](#systempolicyobject)

Политики уровня системы Xray.

### LevelPolicyObject

```json
{
  "handshake": 4,
  "connIdle": 300,
  "uplinkOnly": 2,
  "downlinkOnly": 5,
  "statsUserUplink": false,
  "statsUserDownlink": false,
  "bufferSize": 10240
}
```

> `handshake`: number

Ограничение времени на установление соединения (рукопожатие).  
Измеряется в секундах.  
Значение по умолчанию - `4`.  
При обработке нового соединения входящим прокси, если время, затраченное на рукопожатие, превышает это значение, соединение разрывается.

> `connIdle`: number

Ограничение времени простоя соединения.  
Измеряется в секундах.  
Значение по умолчанию - `300`.  
При обработке соединения входящим или исходящим прокси, если в течение времени `connIdle` не было передано никаких данных (включая исходящие и входящие данные), соединение разрывается.

> `uplinkOnly`: number

Ограничение времени ожидания после закрытия исходящего канала соединения.  
Измеряется в секундах.  
Значение по умолчанию - `2`.  
Когда сервер (например, удаленный веб-сайт) закрывает исходящее соединение, исходящий прокси разрывает соединение через `uplinkOnly` секунд.

> `downlinkOnly`: number

Ограничение времени ожидания после закрытия входящего канала соединения.  
Измеряется в секундах.  
Значение по умолчанию - `5`.  
Когда клиент (например, браузер) закрывает входящее соединение, входящий прокси разрывает соединение через `downlinkOnly` секунд.

::: tip
При просмотре веб-страниц можно установить `uplinkOnly` и `downlinkOnly` в `0`, чтобы ускорить закрытие соединений.
:::

> `statsUserUplink`: true | false

Если значение равно `true`, включить учет исходящего трафика для всех пользователей текущего уровня.

> `statsUserDownlink`: true | false

Если значение равно `true`, включить учет входящего трафика для всех пользователей текущего уровня.

> `statsUserOnline`: true | false

Если значение равно `true`, включить учет пользоватлей онлайн для всех пользователей текущего уровня по электронной почте.

> `bufferSize`: number

Размер внутреннего буфера для каждого запроса, в килобайтах. Обратите внимание, что несколько запросов могут мультиплексироваться по одному соединению (например, при использовании `mux.cool` или GRPC). Это означает, что даже если они используют одно и то же базовое соединение, их пулы буферов являются независимыми.

Когда размер внутреннего буфера превышает это значение, данные из него будут отправляться до тех пор, пока размер буфера не станет меньше или равен указанному значению, и только после этого будет выполнена следующая операция записи.

Важно: для UDP-запроса, если при попытке записи буфер оказывается полным, операция записи не блокируется, а данные **отбрасываются**. Слишком низкое значение (или `0`) может привести к непредвиденной трате пропускной способности.

Значение по умолчанию:

- На платформах ARM, MIPS, MIPSLE значение по умолчанию - `0`.
- На платформах ARM64, MIPS64, MIPS64LE значение по умолчанию - `4`.
- На других платформах значение по умолчанию - `512`.

Значение по умолчанию можно переопределить с помощью переменной окружения `XRAY_RAY_BUFFER_SIZE`. Обратите внимание, что для переменной окружения единицей измерения являются мегабайты (МБ) (например, установка значения `1` в переменной окружения эквивалентна установке `1024` в конфигурации).

### SystemPolicyObject

```json
{
  "statsInboundUplink": false,
  "statsInboundDownlink": false,
  "statsOutboundUplink": false,
  "statsOutboundDownlink": false
}
```

> `statsInboundUplink`: true | false

Если значение равно `true`, включить учет исходящего трафика для всех входящих подключений.

> `statsInboundDownlink`: true | false

Если значение равно `true`, включить учет входящего трафика для всех входящих подключений.

> `statsOutboundUplink`: true | false

Если значение равно `true`, включить учет исходящего трафика для всех исходящих подключений.

> `statsOutboundDownlink`: true | false

Если значение равно `true`, включить учет входящего трафика для всех исходящих подключений.
