Outbounds
Outbounds сообщают keen-pbr, куда отправить совпавший трафик.
Каждый outbound tag должен соответствовать маске ^[a-z][a-z0-9_]*$ и быть не длиннее 24 символов.
Большинству пользователей достаточно:
- одного outbound типа
interfaceдля VPN-соединения - одного outbound типа
tableсid=254для прямого соединения, как правилоwan - при необходимости — одного outbound типа
urltestдля автоматического выбора лучшего из нескольких соединений
Если не знаете, с чего начать, возьмите тип interface и вернитесь к остальным позже.
Общий пример
{
"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.
{
"outbounds": [
{
"type": "interface",
"tag": "vpn",
"interface": "tun0",
"gateway": "10.8.0.1",
"gateway6": "2001:db8::1"
}
]
}table
Используйте только если другой сервис в системе уже создал для вас отдельную таблицу маршрутизации и вы хотите, чтобы keen-pbr повторно использовал её.
Чтобы найти существующие ID таблиц перед выбором, проверьте текущее состояние политической маршрутизации и маршруты. Чтобы увидеть соответствия имён таблиц, проверьте /etc/iproute2/rt_tables:
ip rule show
cat /etc/iproute2/rt_tables| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
tag |
string | да | Уникальный идентификатор |
type |
string | да | "table" |
table |
integer | да | Номер существующей таблицы маршрутизации |
{
"outbounds": [
{
"type": "table",
"tag": "custom_table",
"table": 200
}
]
}blackhole
Отбрасывает весь соответствующий трафик. Полезно для блокировки доступа к конкретным ресурсам.
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
tag |
string | да | Уникальный идентификатор |
type |
string | да | "blackhole" |
{
"outbounds": [
{
"type": "blackhole",
"tag": "block"
}
]
}ignore
Пропускает трафик без какой-либо модификации маршрутизации. Используйте это, чтобы явно исключить трафик из других правил.
Когда правило маршрутизации разрешается в outbound типа ignore, keen-pbr устанавливает вердикт прохождения через firewall для этого трафика. Это останавливает дальнейшую обработку правил keen-pbr без установки mark или отбрасывания пакета. Ни таблица маршрутизации, ни ip rule не создаются для этого совпадения, поэтому пакет следует обычной системной маршрутизации. Поскольку правила маршрутизации оцениваются сверху вниз и первое совпадение выигрывает, ignore наиболее полезен для исключающих правил, размещённых перед более широкими перехватывающими правилами.
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
tag |
string | да | Уникальный идентификатор |
type |
string | да | "ignore" |
{
"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— тестирование восстановления с ограниченными запросами проверки
{
"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
}
}
]
}