Как это работает#
Путь пакета#
- DNS. Устройство в сети спрашивает имя. Вопрос приходит к резолверу ядра steer. Если имя
есть в списке правила, резолвер отвечает служебным адресом из
198.18.0.0/15и запоминает пару «служебный → настоящий». Остальные имена получают настоящий ответ. - Метка. Первый пакет соединения проходит цепочки
nftablesядра steer: адрес назначения ищется в наборах правил сверху вниз, и совпавшее правило ставит пакету метку своего выхода. - DNAT. Служебный адрес меняется на настоящий по карте резолвера — приложение об этом не узнаёт.
- Маршрут. По метке
ip ruleотправляет пакет в таблицу маршрутизации выхода, где маршрут по умолчанию ведёт в его устройство:wg0, туннель VLESS, hysteria2, xsteer. Пакет без метки идёт обычным путём, напрямую.
Всё это — средства ядра Linux. Процесс нужен только туннелям протоколов, и то как устройство TUN, а не прокси на каждое соединение.
Спека#
Ядро steer настраивается одним файлом — спекой (/etc/steer/spec.yaml или spec.json):
| Раздел | Что описывает |
|---|---|
lan, clients |
чей трафик забирать: устройства раздачи, клиенты по адресу или MAC |
lists |
куда: файлы доменов и адресов, наборы sing-box .srs, сужение по протоколу и портам |
outputs |
через что: интерфейс, туннель по подписке, группа выходов, zapret, напрямую |
rules |
какой трафик каких клиентов в какой выход; проверяются сверху вниз |
dns |
режим (fake-IP или настоящие адреса), свои серверы DNS у правил |
steer apply применяет спеку одной транзакцией: либо новые правила встают целиком, либо остаются
прежние. Панель splify2 и коннектор пишут спеку сами — руками её трогать не нужно.
Выходы и отказы#
- Сторож проверяет выходы и переключает трафик на первое живое устройство или узел.
- Группа собирает выходы:
order— первый живой,latency— самый быстрый с допуском,manual— выбор человека,balance— новые соединения по весам. on_failрешает, что делать, когда не работает ничего: остановить трафик правила (drop, по умолчанию), пустить напрямую (direct) или через zapret.
Панель и коннектор#
splify2 — страница LuCI и объект rpcd: каталог сервисов со списками, которые обновляются сами, редактор правил, выходы и подписки. Она пишет спеку и читает состояние ядра через его сокет.
steer-box-connector занимает место пакета sing-box: podkop или forkop пишут конфиг sing-box
и запускают службу как обычно, а коннектор переводит конфиг в спеку и ведёт свой экземпляр ядра.
TPROXY и прозрачный прокси не используются.