Конфигурационный файл
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, защита от RSTfragmentation- метод фрагментации и его параметрыfaking- SNI faking, SYN-фейки, мутацияudp- фильтр QUIC, фильтр портов и режим действия для UDPdns- резолвер сета, DoH URL и пиныrouting- режим маршрутизации, выходной интерфейс, вышестоящий прокси или блокировкаescalate- на какой сет переключаться, когда этот перестаёт работать
Чтобы перенести сет между устройствами, используйте вкладку Импорт/Экспорт в редакторе сета. Она показывает тот же JSON и принимает вставленный обратно.
Правка вручную
version в начале файла - версия формата конфигурации. b4 читает её, чтобы понять, что нужно мигрировать, поэтому при правке всего остального её трогать не нужно.
Править вручную можно, но веб-интерфейс проверяет значения и применяет миграции при обновлении. После ручной правки перезапустите b4, чтобы изменения применились.
Миграции
Когда формат меняется между выпусками, b4 мигрирует файл при запуске: новые поля приходят со значениями по умолчанию, переименованные переносятся. Прежде чем что-либо тронуть, b4 кладёт рядом резервную копию с именем по версии, с которой мигрирует, например b4.json.v51.bak.
Файл, у которого version выше, чем понимает запущенная сборка, загружается как есть, с предупреждением: незнакомые этой сборке настройки будут отброшены при следующем сохранении конфигурации.