Перейти к содержанию

Александр Рыжов

Модераторы
  • Постов

    1 244
  • Зарегистрирован

  • Посещение

  • Победитель дней

    25

Весь контент Александр Рыжов

  1. Контент последней статьи с сайта keenetic-gi.ga, архив доступен здесь. В самом алгоритме нет ничего нового, но благодаря недавнему обновлению AdGuard Home (далее AGH) его можно реализовать довольно изящно: использование VPN для заданных вами доменов возможно тройкой коротких скриптов. Требования Развёрнутая среда Entware, Рабочее VPN-соединение поверх провайдерского, по которому будет идти обращение к определённым доменам. Установка пакетов Подразумевается, что AGH будет использоваться вместо встроенной в прошивку службы DNS Proxy. Установите необходимые пакеты: opkg install adguardhome-go ipset iptables Выполните первоначальную настройку AGH, для чего в CLI роутера наберите: opkg dns-override system configuration save В этот момент Entware-сервисы будут перезапущены, а интерфейс для первоначальной настройки AGH станет доступен по адресу http://192.168.1.1:3000, где 192.168.1.1 — IP-адрес роутера. Настройки по умолчанию подходят для большинства случаев. Скриптовая обвязка Результаты разрешения указанных доменных имён AGH будет помещать в ipset (bypass в примере), правилами iptables трафик по этим IP-адресам будет помечаться fwmark, а для роутинга помеченного трафика будет использоваться своя таблица маршрутизации. Первый скрипт — создание ipset'а при старте роутера. Создайте файл /opt/etc/init.d/S52ipset со следующим содержимым: #!/bin/sh PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin if [ "$1" = "start" ]; then ipset create bypass hash:ip ip rule add fwmark 1001 table 1001 fi Второй — для поддержания актуальности таблицы роутинга. Файл /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh с содержимым: #!/bin/sh [ "$system_name" == "nwg0" ] || exit 0 [ ! -z "$(ipset --quiet list bypass)" ] || exit 0 [ "${change}-${connected}-${link}-${up}" == "link-yes-up-up" ] || exit 0 if [ -z "$(ip route list table 1001)" ]; then ip route add default dev $system_name table 1001 fi где nwg0 — сетевой интерфейс VPN-соединения для выборочного доступа. Если затрудняетесь в его поиске, то посмотрите вывод ip addr, его адрес будет совпадать с тем, что виден в веб-интерфейсе.Третий — пометка трафика с помощью fwmark. Актуальная прошивка активно использует эту возможность, поэтому маркировать трафик приходится точечно. Создайте файл /opt/etc/ndm/netfilter.d/010-bypass.sh c контентом: #!/bin/sh [ "$type" == "ip6tables" ] && exit [ "$table" != "mangle" ] && exit [ -z "$(ip link list | grep nwg0)" ] && exit [ -z "$(ipset --quiet list bypass)" ] && exit if [ -z "$(iptables-save | grep bypass)" ]; then iptables -w -t mangle -A PREROUTING ! -s 192.168.254.0/24 -m conntrack --ctstate NEW -m set --match-set bypass dst -j CONNMARK --set-mark 1001 iptables -w -t mangle -A PREROUTING ! -s 192.168.254.0/24 -m set --match-set bypass dst -j CONNMARK --restore-mark fi где nwg0 — снова сетевой интерфейс VPN-соединения, 192.168.254.0/24 — его подсеть. Её так же можно найти в выводе ip addr. Сделайте скрипты исполняемыми: chmod +x /opt/etc/init.d/S52ipset chmod +x /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh chmod +x /opt/etc/ndm/netfilter.d/010-bypass.sh и переходите к финальному пункту. Список доменов для выборочного доступа Найдите в конфигурационном файле AGH /opt/etc/AdGuardHome/AdGuardHome.yaml строчку ipset_file: "" и поменяйте на ipset_file: /opt/etc/AdGuardHome/ipset.conf. Файл /opt/etc/AdGuardHome/ipset.conf будет единственным, требующим редактирования время от времени, в зависимости от изменения вашего персонального списка доменов для выборочного доступа. Он имеет следующий синтаксис: intel.com,ipinfo.io/bypass instagram.com,cdninstagram.com/bypass epicgames.com,gog.com/bypass Т.е. в левой части через запятую указаны домены, требующие доступа, справа после слэша — ipset, в который AGH складывает результаты разрешения DNS-имён. Можно указать всё в одну строчку, можно разделить логически на несколько строк как в примере. Домены третьего уровня и выше также включаются в правило доступа, т.е. указание intel.com включает www.intel.com, download.intel.com и пр. Рекомендую добавить какой-нибудь «сигнальный» сервис, показывающий ваш текущий IP-адрес (ipinfo.io в примере). Так вы сможете проверить работоспособность настроенного решения. Учтите, что AGH не перечитывает изменённый файл, поэтому после правки перезапустите его с помощью: /opt/etc/init.d/S99adguardhome restart При желании можно использовать несколько VPN-соединений для обращения к разным доменам, для простоты понимания здесь это не описано. Диагностика проблем Убедитесь в том, что набор ipset создан и наполняется в процессе работы: ipset --list bypass Вывод должен быть не пустой. Убедитесь в существовании нужной таблицы роутинга для выборочного доступа: ip rule list | grep 1001 Убедитесь, что в таблице присутствует необходимый маршрут: ip route list table 1001 Посмотрите, существуют ли правила netfilter для пометки пакетов: iptables-save | grep bypass После перезагрузки роутера проверьте в веб-интерфейсе Системный журнал, в нём не должно быть красных строк, связанных с настроенными скриптами. Удачи в начинаниях!
  2. AdGuardHome никак не лимитирует объём используемой оперативной памяти при своей работе, однако лимиты можно задавать как для любого другого приложения на GO с помощью переменных среды. GOMEMLIMIT — максимальный объём памяти, доступной для использования в байтах, GOGC — агрессивность сборщика мусора в процентах. Меньше — агрессивнее, т.е. память освобождается чаще за счёт повышения нагрузки на проц. Значения можно задать в стартовом скрипте /opt/etc/init.d/S99adguardhome следующим образом: PREARGS="env GOMEMLIMIT=64MiB GOGC=40" в примере выше для AGH задан лимит в 64MB RAM и более агрессивное поведение по освобождению RAM (дефолтное значение 100), за что придётся заплатить появлением пиков в графике загрузки проца в момент обновления списков блокировки.
  3. Я бы не стал на это рассчитывать. Расстановка тэгов в зависимости от опций клиента — это (замечательная!) фича dnsmasq.
  4. Со стороны кинетика они ни чем не отличается от уже существующей. Всё зависит от того, какой контент вы размещаете для загрузки по PXE.
  5. IMHO, логи существуют отнюдь не для того, чтобы кому-то нравится. Если они помогают в диагностике проблем — это хорошие логи.
  6. Похоже из [ "${change}-${connected}-${link}-${up}" == "link-yes-up-up" ] можно выкинуть $change. Поскольку "${connected}-${link}-${up}" == "yes-up-up" и у меня и у вас встречается только один раз и, следственно, однозначно определяет статус интерфейса. Обновлю линк на пакет в первом посте.
  7. По идее можно, у записей в ipset'е предусмотрено поле для комментов. Проверял на 3.9.х. Перед отловом нужных событий сперва собираю все возможные варианты, положив в нужную папку /opt/etc/ndm/<name it>.d такое: #!/bin/sh LOG='/opt/tmp/hook.log' echo -e "\n\n--- $(date '+%T') $0 fired ---" >> $LOG echo $@ >> $LOG set | grep -vE "^'\$|^HOME|^HOSTNAME|^IFS|^LANG|^LD_|^LINENO|^LOG|^NDM_MOUNT|^OPTIND|^PATH|^PPID|^PS|^PWD|^SHELL|^SHLVL|^TERM|^timezone|^USER|^FUNCNAME" >> $LOG exit 0 Во вложении выхлоп скрипта при выключении и повторном включении VPN-соединения. hook.log
  8. Никаких. Лишь бы список выбранных доменов влез на флешку. Хотя такой способ уже трудно будет назвать точечным:) Посмотрите раздел «Диагностика проблем». netfilter c доменами не работает, после того как ipset-dns разрешила очередное доменное имя в IP-адрес(а), способа сопоставить назад эти адреса с исходным доменом нет. Reverse DNS resolving будет не всегда показательным и я бы на него не стал ориентироваться вовсе. Вы вольны выбрать любой DNS-сервер для работы утилиты ipset-dns в конфиге /opt/etc/bypass.conf Он первым делом добавится в ipset, следственно, обращения к нему будут идти тем же путём, что и к выбранным для выборочного роутинга ресурсам. В принципе, можно, только в общем случае не нужно (см. выше). В соседних темах можно найти инфу на каких портах работают прошивочные DoH/DoT.
  9. Что-нибудь основанное на dnsmasq или adguardhome, они так же умеют наполнять ipset по результатам разрешения DNS-имён. Лично я до последнего использовал это. Ещё отмечу, если DNS-сервер в ответ присылает сразу несколько A/AAAA-записей, то они заносятся в ipset сразу все. С лёгкой доработкой это решение может быть развёрнуто на любом кинетике, где USB-накопители вообще не предусмотрены. Дело в том, что нужные хук скрипты работают и там, хоть это нигде не документировано. Именно поэтому в роутерах без USB доступен в компонентах OPKG. Другими словами, если вы соберёте прошивку со своими дополнительными компонентами (busybox, iptables, ipset), то оно будет прекрасно себя чувствовать, к примеру, на Keenetic Start. Никаких логов или динамических конфигов у приведённого решения нет, все файлы статичные. Ни USB-флешку, ни флешку роутера протирать не будут.
  10. Не собирается хостовый cmake. Либо хостовое окружение (Ubuntu? Debian?) не отвечают требованиям сборки, либо собираемая версия стара настолько, что не собирается на (слишком:) современном для неё хосте.
  11. Поддержка занимается заводским функционалом. Сторонние OPKG-пакеты уже за его пределами.
  12. Если уж делать в прошивке, то законченную фичу по выборочному роутингу.
  13. В первой прикидке все зависимости менее одного мегабайта, а значит, решение с помощью SDK можно поднять хоть на Keenetic Start. Необходимые для конфигурирования имена VPN-интерфейса и его подсеть можно выуживать, к примеру, по названию соединения. Если надо больше, то вряд ли стоит это помещать в прошивочный конфиг или WebUI. Я бы использовал другое решение. @keenet07, всё так. По вопросам: Да, всё в памяти. Решение, по сути, три статичных файла обвязки вокруг iptables и ipset. Ничего. Таблица наполняется адресами, но роутинг ничем не отличается от роутинга по умолчанию. Прошивка. Глубина бесконечна. Да. Понимаю, что при высоких аптаймах сет может накапливать лишнее, но при точечном обходе я бы не стал заморачиваться. Если хочется такое реализовать, то создавайте ipset сразу указывая время жизни элементов и ограничивайте TTL записей DNS-кэша в прошивочном сервисе с помощью dns-proxy max-ttl … Нет. Прошивка не отображает роутинг по таблицам/сетам. Т.е. маршруты по умолчанию так же окажутся в таблице для отдельного роутинга. Зачем?
  14. Ещё один легковесный способ выборочного роутинга с однократной настройкой в консоли. Основан на том, что актуальная прошивка может использовать разные DNS-серверы для указанных пользователем доменов. Желаемые домены можно будет менять прямо в веб-интерфейсе. Решение основано на немного допиленной мелкой утилите ipset-dns. Прошивка будет обращаться к ней для разрешения определённого доменного имени из пользовательского перечня, а та, в свою очередь, будет складывать результаты работы в отдельный набор ip-адресов. Далее этот набор используется для выборочного роутинга в VPN-соединение ровно так же, как в аналогичных решениях по соседству. Тем самым сохраняются все возможности прошивочного сервиса. Перед установкой настройте в веб-интерфейсе любое VPN-соединение. Установка возможна с помощью пакета, подходящего под любую архитектуру кинетика: opkg install http://bin.entware.net/mipselsf-k3.4/test/ipset-dns-keenetic_0.2-1_all.ipk Для настройки вам понадобится имя и подсеть VPN-интерфейса. Их можно увидеть в выводе команды ip addr. В примере это nwg3 и 10.7.0.0/24: … 37: nwg3: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1324 qdisc noqueue qlen 50 link/[65534] inet 10.7.0.8/24 scope global nwg3 Внесите эти два параметра любым удобным способом в /opt/etc/bypass.conf по имеющемуся примеру в переменные VPN_NAME и VPN_SUBNET: vi /opt/etc/bypass.conf После чего решение готово к использованию. Запустите утилиту ipset-dns или просто перегрузите роутер: /opt/etc/init.d/S52ipset-dns start Список ресурсов для открытия через VPN-соединение удобно вести на странице Сетевые правила → Интернет фильтры → Настройка DNS. Пример добавления домена intel.com вместе с субдоменами: где 192.168.1.1 — IP-адрес роутера. Если вам привычней CLI-интерфейс, то аналог записи выше: ip name-server 192.168.1.1:5353 intel.com Число записей ограничено 64. Изменение списка доменов применяется налету. Для того, чтобы новые настройки вступили в силу ничего делать не надо.
  15. В новой версии изменился формат конфига. Проще переименовать старый и настроить заново. mv /opt/etc/AdGuardHome/AdGuardHome.yaml /opt/etc/AdGuardHome/AdGuardHome.yaml.prev
  16. Вареза в репозитории не будет.
  17. Часто используемые (и тяжело собираемые нативно) python-модули уже есть в репозитории, в том числе python3-pillow.
  18. Только довольно устаревший из-за использования ndmq. Надо бы переписать под актуальный API.
  19. Тоже был вынужден ограничить журнал запросов до 24 часов из-за размера лога, теперь: # du -hs /opt/etc/AdGuardHome/data/* 961.0K /opt/etc/AdGuardHome/data/filters 7.5M /opt/etc/AdGuardHome/data/querylog.json 29.2M /opt/etc/AdGuardHome/data/querylog.json.1 25.0K /opt/etc/AdGuardHome/data/sessions.db 185.0K /opt/etc/AdGuardHome/data/stats.db
  20. У роутера нет цепей, способных отключить собственное питание. Может сгодится простой механический таймер?
  21. Пару лет назад прошивочный DNS-сервис научили запоминать имена хостов, которыми они представляются в момент обращения к DHCP.
×
×
  • Создать...

Важная информация

На этом сайте используются файлы cookie. Нажимая "Я принимаю" или продолжая просмотр сайта, вы разрешаете их использование: Политика конфиденциальности.