Перейти к содержимому

Outbounds

Outbounds сообщают keen-pbr, куда отправить совпавший трафик.

Каждый outbound tag должен соответствовать маске ^[a-z][a-z0-9_]*$ и быть не длиннее 24 символов.

Большинству пользователей достаточно:

  • одного outbound типа interface для VPN-соединения
  • одного outbound типа table с id=254 для прямого соединения, как правило wan
  • при необходимости — одного outbound типа urltest для автоматического выбора лучшего из нескольких соединений

Если не знаете, с чего начать, возьмите тип interface и вернитесь к остальным позже.

Общий пример

config.json
{
  "outbounds": [
    {
      "type": "interface",
      "tag": "vpn",
      "interface": "tun0",
      "gateway": "10.8.0.1",
      "gateway6": "2001:db8::1"
    },
    {
      "type": "table",
      "tag": "wan",
      "table": 254
    }
  ]
}

Типы

interface

Используйте, когда хотите отправить трафик через конкретное соединение, например VPN-туннель или обычное интернет-соединение.

Поле Тип Обязательно Описание
tag string да Уникальный идентификатор
type string да "interface"
interface string да Имя исходящего сетевого интерфейса (напр. tun0)
gateway string нет Необязательный IPv4-адрес шлюза
gateway6 string нет Необязательный IPv6-адрес шлюза

Если не заданы ни gateway, ни gateway6, keen-pbr создаёт и IPv4-, и IPv6-маршрут по умолчанию для этого interface outbound.

Если задан только один шлюз, keen-pbr создаёт обычный маршрут по умолчанию для соответствующего семейства адресов и маршрут unreachable для второго семейства, чтобы помеченный трафик не мог утечь за пределы таблицы outbound.

Если заданы и gateway, и gateway6, keen-pbr создаёт отдельные маршруты по умолчанию для IPv4 и IPv6.

config.json
{
  "outbounds": [
    {
      "type": "interface",
      "tag": "vpn",
      "interface": "tun0",
      "gateway": "10.8.0.1",
      "gateway6": "2001:db8::1"
    }
  ]
}

table

Используйте только если другой сервис в системе уже создал для вас отдельную таблицу маршрутизации и вы хотите, чтобы keen-pbr повторно использовал её.

Чтобы найти существующие ID таблиц перед выбором, проверьте текущее состояние политической маршрутизации и маршруты. Чтобы увидеть соответствия имён таблиц, проверьте /etc/iproute2/rt_tables:

bash
ip rule show
cat /etc/iproute2/rt_tables
Поле Тип Обязательно Описание
tag string да Уникальный идентификатор
type string да "table"
table integer да Номер существующей таблицы маршрутизации
config.json
{
  "outbounds": [
    {
      "type": "table",
      "tag": "custom_table",
      "table": 200
    }
  ]
}

blackhole

Отбрасывает весь соответствующий трафик. Полезно для блокировки доступа к конкретным ресурсам.

Поле Тип Обязательно Описание
tag string да Уникальный идентификатор
type string да "blackhole"
config.json
{
  "outbounds": [
    {
      "type": "blackhole",
      "tag": "block"
    }
  ]
}

ignore

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

Когда правило маршрутизации разрешается в outbound типа ignore, keen-pbr устанавливает вердикт прохождения через firewall для этого трафика. Это останавливает дальнейшую обработку правил keen-pbr без установки mark или отбрасывания пакета. Ни таблица маршрутизации, ни ip rule не создаются для этого совпадения, поэтому пакет следует обычной системной маршрутизации. Поскольку правила маршрутизации оцениваются сверху вниз и первое совпадение выигрывает, ignore наиболее полезен для исключающих правил, размещённых перед более широкими перехватывающими правилами.

Поле Тип Обязательно Описание
tag string да Уникальный идентификатор
type string да "ignore"
config.json
{
  "outbounds": [
    {
      "type": "ignore",
      "tag": "direct"
    }
  ]
}

urltest

Используйте это, когда у вас есть несколько кандидатов outbound и вы хотите, чтобы keen-pbr автоматически выбирал лучший доступный.

keen-pbr всегда добавляет в конец сгенерированной таблицы urltest терминальные маршруты unreachable по умолчанию для IPv4 и IPv6. Это работает как kill-switch: если выбранный маршрут или fallback-маршруты недоступны, помеченный трафик блокируется, а не уходит через обычную системную маршрутизацию.

Поле Тип Обязательно Описание
tag string да Уникальный идентификатор
type string да "urltest"
url string да URL для проверки доступности и задержки
interval_ms integer нет (по умолчанию: 180000) Интервал между проверками в миллисекундах
probe_timeout_ms integer нет (по умолчанию: 5000) Таймаут каждой отдельной попытки проверки в миллисекундах
tolerance_ms integer нет (по умолчанию: 100) Допуск задержки в мс; предотвращает переключение outbound, если разница задержки между текущим и новым лучшим outbound меньше этого допуска
outbound_groups array да Упорядоченный список групп outbound (см. ниже)
retry object нет Конфигурация повторов (см. ниже)
circuit_breaker object нет Конфигурация circuit breaker (см. ниже)

Группы outbound

Группы проверяются по порядку. Внутри первой здоровой группы outbounds выбираются по наименьшей задержке. Если все outbounds в группе нездоровы, оценивается следующая группа. Это позволяет определить более сложные правила приоритета. Например, можно предпочесть один из двух более медленных outbounds сначала, и если оба недоступны, переключиться на другой outbound, который быстрее, но дороже.

Поле Тип Обязательно Описание
outbounds array of string да Упорядоченный список тегов outbound для попытки

Конфигурация повторов

Поле Тип Обязательно Описание
attempts integer нет (по умолчанию: 3) Количество попыток проверки перед пометкой outbound как неработающего
interval_ms integer нет (по умолчанию: 1000) Задержка между попытками повтора в миллисекундах

Конфигурация Circuit Breaker

Поле Тип Обязательно Описание
failure_threshold integer нет (по умолчанию: 5) Количество последовательных сбоев перед открытием circuit
success_threshold integer нет (по умолчанию: 2) Количество последовательных успехов в состоянии half-open для закрытия circuit
timeout_ms integer нет (по умолчанию: 30000) Время перед переходом из открытого в состояние half-open
half_open_max_requests integer нет (по умолчанию: 1) Максимальное количество запросов проверки в состоянии half-open

Состояния circuit breaker:

  • closed — здоров, трафик проходит нормально
  • open — сбой, трафик блокируется в период охлаждения
  • half-open — тестирование восстановления с ограниченными запросами проверки
config.json
{
  "outbounds": [
    {
      "type": "urltest",
      "tag": "auto_select",
      "url": "https://www.gstatic.com/generate_204",
      "interval_ms": 180000,
      "probe_timeout_ms": 5000,
      "tolerance_ms": 100,
      "outbound_groups": [
        { "outbounds": ["vpn1", "vpn2"] },
        { "outbounds": ["wan"] }
      ],
      "retry": {
        "attempts": 3,
        "interval_ms": 1000
      },
      "circuit_breaker": {
        "failure_threshold": 5,
        "success_threshold": 2,
        "timeout_ms": 30000,
        "half_open_max_requests": 1
      }
    }
  ]
}