Почему Podkop использует Sing-box для направления трафика, а не Dnsmasq + nftables sets
Сначала чутка дедовых историй. Помните Getdomains? Это скрипт настраивающий OpenWrt на "точечную маршрутизацию" по списку доменов. Я его написал, потому что два года назад десяток людей в чате попросили автоматизировать развёртывание этих настроек на роутере, и чтобы без Ansible! 😣 Скрипт набрал популярность. Думаю, из-за его простоты и чёткого выполнения своей задачи. Мы его допиливали по необходимости, но всё равно не хватало гибкости, более удобного управления и, конечно же, веб-интерфейса.
Прошлым летом, имея за плечами фидбэк от нескольких тысяч людей и с пониманием, что именно нужно, я начал делать Podkop. Начал с той же схемы, что и у Getdomains: Dnsmasq + nftables sets. Но она имеет свои недостатки:
1. Добавление IP-адресов CDN-сервисов в список, который уходит в VPN/Proxy.
Мне въелся в память пример: сходили к ChatGPT (который за Cloudflare), IP-адреса добавились, игра Escape from Tarkov лагает 🤷♂️ потому что у них что-то тоже находится за Cloudflare и частично пошло через VPN/Proxy.
В общем, то что должно было не ходить в туннель, пошло в него и получили проблемы. Это лишь один пример, в чате проблемы с CF всплывали стабильно несколько раз в неделю.
2. Если одна точка выхода не устраивает и нужно две, три и более, то возникают сложности с разруливанием между ними по доменам.
Разделить по подсетям/IP-адресам не составляет труда, а когда доходит до доменов, получается каша. Это особенно становится заметно, когда вы используете два сервиса одной компании, отправляя их в разные "точки выхода". Я пытался костылить, жонглировать приоритетом правил в nftables, но по итогу всё равно получалось 💩
3. Есть ещё несколько приятных вещей, которые позволяют делать Sing-box/Xray. И настройка логики в целом проще: просто раскидываешь всё по тегам, и оно работает.
FakeIP
Со схемы dnsmasq+sets хоть и было болезненно уходить, но это необходимо для развития. Зимой я переписал логику управления трафиком на sniffing через Sing-box. А для снижения нагрузки на CPU роутера была выбрана схема FakeIP. В этом случае ядро Sing-box перегоняет через себя не весь трафик, а только часть, ту самую часть со списком доменов. Вместе с технологией ядра Linux tproxy получаем высокое быстродействие и ещё более "точечную маршрутизацию" без каши. При этом всём с низкой нагрузкой на CPU, потому что не гоним весь трафик через Sing-box.
Тут я хочу поблагодарить наше комьюнити: один пытливый ум откапал эту схему и настроил у себя, потом подтянулось ещё два умных человека и развили эту тему. А дальше уже все подхватили и пошло-поехало. По итогу имеем несколько мануалов по ручной настройке FakeIP/FakeDNS, скрипты для Sing-box/Xray и продукт, который базируется на FakeIP.
Плюсы, надеюсь, понятны. Теперь про минусы:
1. Нужно использовать Sing-box в качестве DNS-сервера. Что плохого, ведь он умеет в DoH, DoT и больше не нужны сторонние программы?
Он должен быть единственным сервером в /etc/config/dhcp, и если по какой-то причине вы сломали Sing-box, то DNS на клиентах вместе с ним пропадает. На самом деле та же самая петрушка, что и со Stubby и подобными: сбилось время? Досвидос 🙋♂️ Но Sing-box легче ломается, потому что в нём не только настройки DNS. Это слабое место. Поэтому я сделал обвязку, которая решает эту проблему.
2. Sing-box в OpenWrt весит около 12MB. Роутеры с маленьким количеством флешки грустят без Sing-box/Xray. Но с наличием на рынке Xiaomi AX3000T за 2300р жалобы не принимаются 🙅♂️ На самом деле и с маленькими флешками есть варианты, хоть и придётся поднапрячься.
Минусы больше натянутые. Купить нормальный роутер сейчас трудности не составляет и по кошельку не ударит. А перевести домашних клиентов на DNS-сервер роутера - это хорошая практика, даже без использования FakeIP.
Сначала чутка дедовых историй. Помните Getdomains? Это скрипт настраивающий OpenWrt на "точечную маршрутизацию" по списку доменов. Я его написал, потому что два года назад десяток людей в чате попросили автоматизировать развёртывание этих настроек на роутере, и чтобы без Ansible! 😣 Скрипт набрал популярность. Думаю, из-за его простоты и чёткого выполнения своей задачи. Мы его допиливали по необходимости, но всё равно не хватало гибкости, более удобного управления и, конечно же, веб-интерфейса.
Прошлым летом, имея за плечами фидбэк от нескольких тысяч людей и с пониманием, что именно нужно, я начал делать Podkop. Начал с той же схемы, что и у Getdomains: Dnsmasq + nftables sets. Но она имеет свои недостатки:
1. Добавление IP-адресов CDN-сервисов в список, который уходит в VPN/Proxy.
Мне въелся в память пример: сходили к ChatGPT (который за Cloudflare), IP-адреса добавились, игра Escape from Tarkov лагает 🤷♂️ потому что у них что-то тоже находится за Cloudflare и частично пошло через VPN/Proxy.
В общем, то что должно было не ходить в туннель, пошло в него и получили проблемы. Это лишь один пример, в чате проблемы с CF всплывали стабильно несколько раз в неделю.
2. Если одна точка выхода не устраивает и нужно две, три и более, то возникают сложности с разруливанием между ними по доменам.
Разделить по подсетям/IP-адресам не составляет труда, а когда доходит до доменов, получается каша. Это особенно становится заметно, когда вы используете два сервиса одной компании, отправляя их в разные "точки выхода". Я пытался костылить, жонглировать приоритетом правил в nftables, но по итогу всё равно получалось 💩
3. Есть ещё несколько приятных вещей, которые позволяют делать Sing-box/Xray. И настройка логики в целом проще: просто раскидываешь всё по тегам, и оно работает.
FakeIP
Со схемы dnsmasq+sets хоть и было болезненно уходить, но это необходимо для развития. Зимой я переписал логику управления трафиком на sniffing через Sing-box. А для снижения нагрузки на CPU роутера была выбрана схема FakeIP. В этом случае ядро Sing-box перегоняет через себя не весь трафик, а только часть, ту самую часть со списком доменов. Вместе с технологией ядра Linux tproxy получаем высокое быстродействие и ещё более "точечную маршрутизацию" без каши. При этом всём с низкой нагрузкой на CPU, потому что не гоним весь трафик через Sing-box.
Тут я хочу поблагодарить наше комьюнити: один пытливый ум откапал эту схему и настроил у себя, потом подтянулось ещё два умных человека и развили эту тему. А дальше уже все подхватили и пошло-поехало. По итогу имеем несколько мануалов по ручной настройке FakeIP/FakeDNS, скрипты для Sing-box/Xray и продукт, который базируется на FakeIP.
Плюсы, надеюсь, понятны. Теперь про минусы:
1. Нужно использовать Sing-box в качестве DNS-сервера. Что плохого, ведь он умеет в DoH, DoT и больше не нужны сторонние программы?
Он должен быть единственным сервером в /etc/config/dhcp, и если по какой-то причине вы сломали Sing-box, то DNS на клиентах вместе с ним пропадает. На самом деле та же самая петрушка, что и со Stubby и подобными: сбилось время? Досвидос 🙋♂️ Но Sing-box легче ломается, потому что в нём не только настройки DNS. Это слабое место. Поэтому я сделал обвязку, которая решает эту проблему.
2. Sing-box в OpenWrt весит около 12MB. Роутеры с маленьким количеством флешки грустят без Sing-box/Xray. Но с наличием на рынке Xiaomi AX3000T за 2300р жалобы не принимаются 🙅♂️ На самом деле и с маленькими флешками есть варианты, хоть и придётся поднапрячься.
Минусы больше натянутые. Купить нормальный роутер сейчас трудности не составляет и по кошельку не ударит. А перевести домашних клиентов на DNS-сервер роутера - это хорошая практика, даже без использования FakeIP.