Устранение неполадок
Начните с логов и статуса сервисов, затем переходите к DNS, firewall, таблицам маршрутизации и интерфейсам. В keen-pbr 3.x демон активно пишет причины ошибок в системный журнал, поэтому логи почти всегда быстрее угадывания по симптомам.
Быстрый порядок диагностики
- Проверьте системный журнал на ошибки
keen-pbrиdnsmasq. - Проверьте, что сервисы
keen-pbrиdnsmasqзапущены. - Если
keen-pbrпадает при запуске, запустите его вручную в foreground-режиме, чтобы увидеть больше логов:keen-pbr --log-level verbose service. - Проверьте DNS: устройство должно использовать DNS роутера, а
dnsmasqдолжен отвечать локально. - Проверьте firewall: правила
keen-pbrдолжны быть вKeenPbrTable. - Проверьте policy routing:
fwmarkдолжен вести в нужную таблицу маршрутизации. - Проверьте интерфейсы и VPN-туннели.
- Если проблема остаётся, проверьте удалённые списки,
urltest, фильтры правил и конфликты низкоуровневой маршрутизации.
Системный журнал
Это первое место для диагностики. Ищите сообщения keen-pbr, dnsmasq, а также уровни [E] и [W]: так keen-pbr помечает ошибки и предупреждения. Если не хватает библиотек iptables / nftables, не найден интерфейс, занят порт API или сломан JSON, причина обычно будет написана именно здесь.
В веб-интерфейсе Keenetic откройте Диагностика → Системный журнал.
Из консоли можно прочитать журнал так:
ndmc -c "show log once" | grep -E 'keen-pbr|dnsmasq|\[E\]|\[W\]|error|warn|warning'Сервис не запускается
В этом сценарии не начинайте с редактирования конфигурации вслепую. Сначала проверьте статус и сразу откройте логи.
- Убедитесь, что конфигурация существует:
bash
ls -l /opt/etc/keen-pbr/config.json - Перезапустите
keen-pbr:bash/opt/etc/init.d/S80keen-pbr restart - Проверьте статус
keen-pbr:bash/opt/etc/init.d/S80keen-pbr status - Проверьте статус
dnsmasq:bash/opt/etc/init.d/S56dnsmasq status - Прочитайте системный журнал:
bash
ndmc -c "show log once" | grep -E 'keen-pbr|dnsmasq|\[E\]|\[W\]|error|warn|warning'
Если keen-pbr не остаётся запущенным, остановите managed service и запустите демон вручную в foreground-режиме с подробными логами. Так ошибка появится прямо в консоли.
/opt/etc/init.d/S80keen-pbr stop
keen-pbr --log-level verbose serviceОжидаемо, foreground-команда не вернёт prompt, пока демон работает. Если она сразу завершилась, последняя ошибка в выводе обычно и есть причина.
Расширенные проверки
- Проверьте JSON:
jq . /opt/etc/keen-pbr/config.json- Убедитесь, что каталог для
daemon.pid_fileсуществует и доступен для записи. - Убедитесь, что
daemon.cache_dirсуществует и доступен для записи. - Если API включён, проверьте, что адрес и порт из
api.listenне заняты другим процессом. - Если в логах есть ошибка про firewall backend, проверьте установку
iptables/ipsetилиnftablesдля вашей платформы. - Если
keen-pbrжив, но Web UI не открывается, убедитесь, что конфигурация не заменена headless-примером и вconfig.jsonесть секцияapi.
Сайты не идут через VPN
- Убедитесь, что устройство пользователя использует DNS роутера.
- Откройте
http://<ip-роутера>:12121/и посмотрите на виджет проверки DNS. Там должно быть сказано “DNS-запрос из браузера достиг dnsmasq”. - Альтернативно, выполните с вашего ПК:
nslookup check.keen.pbr. Должен вернуться127.0.0.88.
- Откройте
- Запустите тест маршрутизации:
- Откройте
http://<ip-роутера>:12121/и введите домен или IP в виджет “Куда пойдёт этот трафик?”. - Альтернативно, выполните с роутера или сервера:
bash
keen-pbr test-routing google.com
- Откройте
- Убедитесь, что домен или IP находится в правильном списке.
- Убедитесь, что правило маршрутизации для этого списка указывает на нужный outbound.
- Убедитесь, что VPN-интерфейс действительно поднят и пропускает трафик.
Если ожидаемый и фактический outbound различаются, переходите последовательно к разделам DNS, firewall и маршрутизации ниже.
DNS и dnsmasq
DNS должен пройти всю цепочку: клиент использует DNS роутера, dnsmasq запущен, сгенерированный конфиг keen-pbr подключён, домены попадают в ipset или nftset, а обычные домены уходят в dns.fallback.
Проверка DNS с устройства пользователя
Откройте http://<ip-роутера>:12121/ и проверьте DNS Check. Если Web UI недоступен, выполните с клиентского устройства:
nslookup check.keen.pbrОжидаемый ответ: 127.0.0.88. Если ответа нет, устройство не использует DNS роутера или dnsmasq не отвечает.
Проверка dnsmasq на роутере или сервере
/opt/etc/init.d/S56dnsmasq status
nslookup google.com 127.0.0.1Если DNS-запросы клиентов не доходят до Entware dnsmasq, проверьте уникальную для Keenetic настройку:
opkg dns-overrideПосле изменения сохраните конфигурацию Keenetic:
system configuration saveОжидаемо, nslookup <домен> 127.0.0.1 возвращает IP-адреса. Если видите Connection refused, dnsmasq не запущен или слушает не на 127.0.0.1:53.
Проверка сгенерированного resolver config
Выберите backend, который используется на вашей системе.
keen-pbr generate-resolver-config dnsmasq-ipsetОжидаемо, вывод содержит директивы вида ipset=/example.com/<set>.
Команда не должна завершаться ошибкой. Если она пишет, что кэш удалённого списка отсутствует, выполните:
keen-pbr downloadЕсли DNS-правила не работают
- Убедитесь, что имя списка в
dns.rulesточно совпадает с именем списка вlists. - Убедитесь, что DNS-правило указывает на правильный тег DNS-сервера.
- Если DNS-сервер использует
detour, убедитесь, что выбранный outbound работает. - Убедитесь, что конфигурация
dnsmasqподключает generated config черезconf-file=илиconf-script=. - Перезапустите
keen-pbrиdnsmasq, затем снова проверьте логи.
Веб-сайты не открываются: DNS_PROBE_FINISHED_NXDOMAIN / ERR_NAME_NOT_RESOLVED
- Убедитесь, что
dns.fallbackнастроен и указывает как минимум на один рабочий тег DNS-сервера. - Убедитесь, что fallback DNS-сервер достижим с роутера или сервера. Если этот DNS-сервер использует
detour, проверьте выбранный outbound. - Убедитесь, что устройство пользователя использует DNS роутера.
- Перезапустите
keen-pbrпосле изменения DNS-конфигурации.
Пример:
{
"dns": {
"servers": [
{
"tag": "default_dns",
"address": "1.1.1.1"
}
],
"fallback": ["default_dns"]
}
}Без dns.fallback домены, которые не соответствуют ни одной записи dns.rules, могут не разрешиться.
Веб-сайты не открываются: DNS_PROBE_FINISHED_BAD_CONFIG
Это обычно означает, что dnsmasq не запущен или не смог применить свою конфигурацию.
- Проверьте логи
dnsmasq. - Проверьте статус
dnsmasq. - Если вы недавно меняли DNS-настройки, перезапустите
keen-pbrиdnsmasq.
ndmc -c "show log once" | grep dnsmasq
/opt/etc/init.d/S56dnsmasq statusFirewall и KeenPbrTable
Если DNS работает и домен резолвится, но трафик всё равно идёт мимо VPN, проверьте firewall. keen-pbr создаёт изолированную цепочку или таблицу KeenPbrTable; трафик должен попадать туда, сопоставляться со списками и получать нужный fwmark.
Сначала выполните общий self-check:
keen-pbr statusИщите проверки firewall со статусом missing, mismatch или ERROR.
Проверка правил firewall
iptables-save | grep KeenPbrTable
ip6tables-save | grep KeenPbrTableОжидаемо, есть переход из PREROUTING в KeenPbrTable и правила маркировки пакетов. Пример признака корректного правила:
-A KeenPbrTable -m set --match-set <set> dst -j MARK --set-xmark <mark>/<mask>Чтобы проверить наполнение set:
ipset list
ipset test <название_сета> <IP-адрес>Ожидаемый ответ для совпадения: IP находится в указанном set.
Если KeenPbrTable отсутствует, вернитесь к логам keen-pbr: обычно причина в недоступном backend, правах, отсутствующих пакетах или ошибке конфигурации.
Таблицы маршрутизации и fwmark
Если firewall маркирует пакеты, но сайт бесконечно грузится или открывается через провайдера, проверьте policy routing. ОС должна увидеть fwmark, применить ip rule и отправить пакет в таблицу маршрутизации нужного outbound.
-
Проверьте состояние, которое ожидает
keen-pbr:bashkeen-pbr statusИщите строки со статусами
missing,mismatchилиERROR. -
Проверьте конкретный домен или IP:
bashkeen-pbr test-routing google.comОжидаемо, expected и actual outbound совпадают.
-
Проверьте policy rules:
baship rule showОжидаемо, есть правило вида
fwmark <mark> lookup <table>. -
Проверьте таблицу маршрутизации:
baship route show table <номер_таблицы>Ожидаемо, в таблице есть маршрут через нужный VPN-интерфейс или gateway. Для blackhole outbound ожидаемым результатом будет blackhole route.
Если таблица пустая, интерфейс не найден или правило ведёт не туда, проверьте имя outbound, имя интерфейса и конфликты fwmark / iproute.table_start.
Интерфейсы и VPN-туннели
Если DNS, firewall и policy routing выглядят правильно, проверьте, что сам интерфейс существует, поднят и может отправлять трафик.
- Откройте
http://<ip-роутера>:12121/и проверьте runtime-состояние outbounds и интерфейсов. - Получите список интерфейсов через REST API:
bash
curl http://127.0.0.1:12121/api/runtime/interfaces - Сверьте системное состояние:
bash
ip link show ip addr show ip route - Проверьте выход через конкретный VPN-интерфейс:
bash
curl -v --interface <имя_интерфейса> https://ifconfig.co/json
Ожидаемо, curl возвращает внешний IP VPN. Если команда зависает или завершается ошибкой, проблема ниже keen-pbr: туннель не поднят, нет маршрута, недоступен gateway или блокируется исходящий трафик.
Если используется urltest или fallback
- Проверьте, что дочерние outbounds имеют корректные интерфейсы или таблицы.
- Проверьте
GET /api/health/serviceи runtime-состояние outbounds в Web UI. - Если circuit breaker находится в состоянии
"open", дождитесь истеченияcircuit_breaker.timeout_msили исправьте недоступный child outbound. - Если резервный интерфейс не включается, сначала проверьте доступность каждого child outbound отдельно через
curl --interface.
Удалённые списки не обновляются
- Выполните на роутере или сервере:
bash
keen-pbr download - Если список всё ещё не обновляется, проверьте, достижим ли URL с этой же системы.
- Если список должен скачиваться через VPN, проверьте
lists[].detourи соответствующий outbound. - Если используется автоматическое обновление, проверьте
lists_autoupdate.cron. - После ошибки снова прочитайте логи
keen-pbr.
Расширенные проверки
Если нужно принудительно выполнить полную перезагрузку:
kill -HUP $(cat /var/run/keen-pbr.pid)Если в конфигурации задан другой daemon.pid_file, используйте его путь. Также подтвердите, что daemon.cache_dir доступен для записи.
urltest всегда показывает degraded
- Убедитесь, что тестовый
urlдостижим и возвращает хороший HTTP-ответ, например200 OKили204 No Content. - Для пользовательских проверок настоятельно рекомендуется использовать HTTP-адреса вместо HTTPS. HTTPS-проверки могут работать нестабильно из-за устаревших сертификатов, неполной цепочки доверия или особенностей TLS на роутере. Успешным для
urltestсчитается финальный HTTP-код2xx. - Рекомендуемый адрес по умолчанию:
https://www.gstatic.com/generate_204. - Убедитесь, что дочерние outbounds работают по отдельности.
- Проверьте интерфейсы через
curl --interface <имя_интерфейса> https://ifconfig.co/json. - Дождитесь следующего цикла проверки или временно уменьшите
interval_msво время диагностики. - Проверьте
GET /api/health/serviceна состояние circuit breaker. Если child outbound находится в состоянии"open", дождитесьcircuit_breaker.timeout_ms.
Правила фильтра портов/адресов не сопоставляются
Если вы используете отрицание в полях src_addr / dest_addr, отрицание применяется сразу ко всем указанным в этом поле IP/подсетям. Смешивание записей с отрицанием и без отрицания в одном списке невозможно. Как альтернатива, вы можете создать два отдельных правила.
Это же применимо к src_port / dest_port.
Если правила не сопоставляются как ожидается:
- Убедитесь, что
protoустановлен корректно:nullдля любых протоколов,"tcp","udp"или"tcp/udp". - Проверьте, что имя списка в правиле точно совпадает с ключом в
lists, включая регистр. - Запустите
keen-pbr test-routing <domain-or-ip>и сравните expected / actual. - Проверьте
keen-pbr status, чтобы увидеть, созданы ли firewall rules для этого правила.
Конфликты низкоуровневой маршрутизации
Если вы изменили настройки fwmark или iproute, или другой инструмент управляет policy routing на той же системе, пакеты могут быть неправильно направлены или отброшены.
Проверьте на конфликты:
keen-pbr status
ip rule show
ip route show table allДля firewall marks:
iptables-save | grep -E 'MARK|CONNMARK|KeenPbrTable'
ip6tables-save | grep -E 'MARK|CONNMARK|KeenPbrTable'Настройте fwmark на неконфликтующий диапазон:
{
"fwmark": {
"start": "0x00020000",
"mask": "0x00FF0000"
}
}mask должна состоять из одного или нескольких смежных hex-нибблов F и быть выровнена по границе nibble. Используйте hex-строки, например "0x00FF0000" и "0x00020000".