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

Конфигурационный файл

b4 хранит конфигурацию в одном JSON-файле. По умолчанию это /etc/b4/b4.json, а флаг --config указывает на другой путь.

Расположение по платформам

ПлатформаПуть
Linux/etc/b4/b4.json
OpenWRT (с extroot или USB-накопителем)/opt/etc/b4/b4.json
OpenWRT (без USB-накопителя)/etc/b4/b4.json
ASUS Merlin/opt/etc/b4/b4.json
Keenetic/opt/etc/b4/b4.json
Docker/etc/b4/b4.json внутри контейнера

Без --config b4 ищет b4.json и config.json в каталогах /etc/b4 и /opt/etc/b4, а если не находит - берёт /etc/b4/b4.json. Выбранный путь пишется в лог при запуске.

Хранится только то, что отличается от умолчаний

Файл разрежённый. Настройка, у которой остаётся встроенное значение по умолчанию, в него вообще не попадает, поэтому свежая установка даёт очень короткий файл, а раздел, которого вы не касались, просто отсутствует. Это не признак пропавшей настройки, и дописывание её вручную с тем же значением ничего не меняет.

То же самое касается API и веб-интерфейса: обратно вы читаете отличия от умолчаний, а не полную действующую конфигурацию.

Структура

{
"version": 52,
"queue": {
"start_num": 537,
"threads": 4,
"mark": 32768,
"ipv4": true,
"ipv6": false,
"tcp_conn_bytes_limit": 19,
"udp_conn_bytes_limit": 8,
"interfaces": [],
"mss_clamp": { "enabled": false, "size": 88 },
"devices": { "enabled": false, "vendor_lookup": false }
},
"system": {
"tables": {
"skip_setup": false,
"monitor_interval": 10,
"engine": "",
"masquerade": { "enabled": false, "interfaces": [] }
},
"logging": {
"level": 1,
"directory": "/var/log/b4",
"instaflush": true,
"syslog": false
},
"web_server": {
"port": 7000,
"bind_address": "0.0.0.0",
"tls_cert": "",
"tls_key": "",
"username": "",
"password": "",
"language": "en",
"mcp": { "enabled": false, "allow_writes": false }
},
"dns": {
"tcp_disabled": false,
"tcp_port": 5453,
"query_timeout_sec": 5,
"keep_ipv6_answers": false
},
"socks5": {
"enabled": false,
"port": 1080,
"bind_address": "0.0.0.0",
"allowed_sources": ["192.168.1.0/24", "127.0.0.1/32"]
},
"mtproto": { "enabled": false, "port": 3128, "bind_address": "0.0.0.0" },
"checker": {
"discovery_timeout": 5,
"config_propagate_ms": 1500,
"reference_domain": "yandex.ru",
"validation_tries": 1
},
"geo": { "sitedat_path": "", "ipdat_path": "", "sitedat_url": "", "ipdat_url": "" },
"timezone": ""
},
"sets": []
}

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

socks5.allowed_sources - один из таких ключей: пока список пуст, его в файле нет, и это значение по умолчанию, при котором прокси принимает соединения с любого источника. Каждая запись - IP-адрес или CIDR-диапазон; 0.0.0.0/0, ::/0 и некорректные записи отклоняются при загрузке и сохранении. Ключ определяет, какие адреса доходят до прокси, так же как правило файрвола, и не заменяет имя пользователя с паролем. Подробнее - Разрешённые источники.

Раздел queue

КлючСмыслПо умолчанию
start_numНомер очереди netfilter, к которой привязываются воркеры537
threadsКоличество рабочих потоков4
markМетка, которую b4 ставит на уже обработанный трафик32768
ipv4Обрабатывать IPv4-трафикtrue
ipv6Обрабатывать IPv6-трафикfalse
tcp_conn_bytes_limitГлобальный потолок на количество анализируемых TCP-пакетов в соединении19
udp_conn_bytes_limitГлобальный потолок на количество анализируемых UDP-пакетов в соединении8
interfacesИнтерфейсы, к которым привязываются правила. Пустой список означает все[]

queue.ipv6

queue.ipv6 - это переключатель Поддержка IPv6 из Настройки → Основные, а флаг --ipv6 задаёт то же самое на один запуск. Он говорит, какие семейства адресов обрабатывает b4, а не что роутер делает с IPv6.

Выключенное значение, а оно по умолчанию, означает, что b4 привязывает очередь только к IPv4 и не пишет IPv6-правил файрвола ни для одного сета. Стратегии обхода, маршрутизация, блокировка и отказ в QUIC у прокси-сета существуют тогда только в IPv4, поэтому назначение, отвечающее ещё и по IPv6, доступно там беспрепятственно. Если у хоста есть рабочий глобальный IPv6-адрес, а настройка выключена, b4 пишет предупреждение в лог и вырезает IPv6-адреса из DNS-ответов для совпавших доменов, чтобы удержать клиентов на защищённом IPv4-пути. См. Откат на IPv4.

Семейства адресов привязываются при старте сервиса, поэтому изменение здесь вступает в силу в полном объёме только после перезапуска.

Раздел sets

Каждый сет - объект в массиве sets, несущий всю свою конфигурацию. Его ключи соответствуют вкладкам редактора сета:

  • targets - домены, IP, категории GeoSite и GeoIP, устройства-источники
  • tcp - общие настройки TCP, desync, window, incoming, защита от RST
  • fragmentation - метод фрагментации и его параметры
  • faking - SNI faking, SYN-фейки, мутация
  • udp - фильтр QUIC, фильтр портов и режим действия для UDP
  • dns - резолвер сета, DoH URL и пины
  • routing - режим маршрутизации, выходной интерфейс, вышестоящий прокси или блокировка
  • escalate - на какой сет переключаться, когда этот перестаёт работать
Импорт и экспорт

Чтобы перенести сет между устройствами, используйте вкладку Импорт/Экспорт в редакторе сета. Она показывает тот же JSON и принимает вставленный обратно.

Правка вручную

version в начале файла - версия формата конфигурации. b4 читает её, чтобы понять, что нужно мигрировать, поэтому при правке всего остального её трогать не нужно.

warning

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

Миграции

Когда формат меняется между выпусками, b4 мигрирует файл при запуске: новые поля приходят со значениями по умолчанию, переименованные переносятся. Прежде чем что-либо тронуть, b4 кладёт рядом резервную копию с именем по версии, с которой мигрирует, например b4.json.v51.bak.

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