Конфигурационный файл
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. Выбранный путь пишется в лог при запуске.
Карточка Скачать конфигурацию в разделе Настройки, Система, Бэкап сохраняет конфигурацию в том виде, в каком b4 записывает этот файл. Безопасная копия маскирует учётные данные и частные имена хостов для передачи другим, а конфигурацию, в которой остались её заглушки [redacted], b4 не загружает и не сохраняет.
Хранится только то, что отличается от умолчаний
Файл разрежённый. Настройка, у которой остаётся встроенное значение по умолчанию, в него вообще не попадает, поэтому свежая установка даёт очень короткий файл, а раздел, в котором ничего не менялось, отсутствует. Это не признак пропавшей настройки, и дописывание её вручную с тем же значением ничего не меняет.
То же самое касается сохранения через 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": [] },
"dscp": { "enabled": false, "value": 0, "interfaces": [] }
},
"logging": {
"level": 1,
"directory": "/var/log/b4",
"instaflush": true,
"syslog": false
},
"web_server": {
"port": 7000,
"bind_address": "0.0.0.0",
"expose": false,
"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",
"expose": false,
"allowed_sources": ["192.168.1.0/24", "127.0.0.1/32"]
},
"mtproto": { "enabled": false, "port": 3128, "bind_address": "0.0.0.0", "expose": false },
"checker": {
"discovery_timeout": 5,
"config_propagate_ms": 1500,
"dns_server": ""
},
"geo": { "sitedat_path": "", "ipdat_path": "", "sitedat_url": "", "ipdat_url": "" },
"timezone": ""
},
"sets": []
}
Пример показывает только часть разделов. В каждом разделе ключей больше, чем показано, и ни один из них не появляется в реальном файле, пока не отличается от умолчания.
В секции mtproto ключей больше, чем показано выше. secrets - массив именованных записей, у каждой есть id, name, secret и enabled; файл, записанный до версии конфигурации 50, содержал одну строку mtproto.secret, которую миграция переносит в этот массив записью с именем default. web_proxy - объект с полями enabled и hostname, оба со значениями по умолчанию, поэтому в файле они появляются только при настроенном релее. bridge содержит единственное поле enabled - переключатель Telegram через WebSocket - и появляется в файле, только пока он включён. Подробнее - Настройки, Telegram.
socks5.allowed_sources - один из таких ключей: пока список пуст, его в файле нет, и это значение по умолчанию, при котором прокси принимает соединения с любого источника. Каждая запись - IP-адрес или CIDR-диапазон; 0.0.0.0/0, ::/0 и некорректные записи отклоняются при загрузке и сохранении. Ключ определяет, какие адреса доходят до прокси, так же как правило файрвола, и не заменяет имя пользователя с паролем. Подробнее - Разрешённые источники.
Раздел queue
| Ключ | Смысл | По умолчанию |
|---|---|---|
start_num | Номер очереди netfilter, к которой привязываются воркеры | 537 |
threads | Количество рабочих потоков | 4 |
mark | Метка очереди: метка на фейках, сегментах после разделения и пакетах, которые b4 отправляет обратно, и на DNS-запросах, которые он отправляет за клиентов и для своих сетов, см. Метки пакетов | 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, ASN, устройства-источникиtcp- общие настройки TCP, desync, window, incoming, защита от RSTfragmentation- метод фрагментации и его параметрыfaking- SNI faking, SYN-фейки, мутацияudp- фильтр QUIC, фильтр портов и режим действия для UDPdns- резолвер сета, DoH URL и пиныrouting- режим маршрутизации, выходной интерфейс, вышестоящий прокси или блокировкаescalate- на какой сет переключаться, когда этот перестаёт работать
В редакторе сета есть вкладка Импорт/Экспорт для переноса сета между устройствами. Она показывает сет в виде JSON и принимает вставленный обратно. В экспортируемом JSON нет значений, равных умолчаниям, настроек выключенных функций, идентификатора сета, его устройств-источников, переключателя мониторинга и настроек эскалации.
Правка вручную
version в начале файла - версия формата конфигурации. b4 читает её, чтобы понять, что нужно мигрировать, поэтому при правке всего остального её трогать не нужно.
Править вручную можно, но значения в файле проверяются только при запуске b4, и файл, не прошедший проверку, останавливает b4 с ошибкой invalid configuration. Веб-интерфейс отклоняет недопустимое значение уже при сохранении. b4 читает файл только при запуске, поэтому ручная правка вступает в силу после перезапуска. Сохранение до перезапуска, будь то из веб-интерфейса, через MCP, при восстановлении мониторингом, при закачке геоданных или при обновлении префиксов ASN, записывает в файл работающую конфигурацию, и ручная правка теряется.
Миграции
Когда формат меняется между выпусками, b4 мигрирует файл при запуске: новые поля приходят со значениями по умолчанию, переименованные переносятся. Прежде чем что-либо тронуть, b4 кладёт рядом резервную копию с именем по версии, с которой мигрирует, например b4.json.v51.bak.
Файл, который не удаётся прочитать при запуске, например обрезанный при пропадании питания во время сохранения или с синтаксической ошибкой JSON после ручной правки, копируется рядом как b4.json.corrupt, или b4.json.corrupt.1 и далее, если там уже лежит копия с другим содержимым, и строка с ошибкой в журнале называет эту копию. Затем b4 запускается со значениями по умолчанию, а следующее сохранение заменяет исходный файл, так что непрочитанные настройки остаются только в этой копии.
Файл, у которого version выше, чем понимает запущенная сборка, загружается как есть, с предупреждением: незнакомые этой сборке настройки будут отброшены при следующем сохранении конфигурации.