Jump to content

AdGuard Home для селективной маршрутизации доменов


Recommended Posts

В 08.06.2023 в 11:01, Александр Рыжов сказал:
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

 

Александр, может вы подскажете. Какие можно добавить сюда правила iptables? Сейчас пока приходится отдельно создавать статические маршруты для всех нужных адресов:

ip route add IP dev nwg0

 

Link to comment
Share on other sites

  • 1 month later...

Обнаружилось странное поведение.

У меня в роутере две политики доступа в интернет:

image.png.88f93de689f7e6b4aaa8db4ab6d3dc36.png

 

image.png.beab966d0ce1f65651cffb74ed3efaa7.png

 

Как можно понять, есть два источника интернета. Провайдерский по оптике и запасной, на случай проблем с сетью провайдерского интернета, через мобильную связь, с ограниченным количеством траффика.

К некоторым устройствам, во-избежание неконтролируемого "выкачивания" доступного мобильного траффика, применена политика доступа, в которой нельзя использовать мобильный интернет:

 

image.png.1c28a7b0f63b983a44d15518ad423b7d.png

 

Так вот....Те устройства, к которым применена политика доступа в интернет НЕ по умолчанию, в случае подключения к роутеру по LAN-у, перестают ходить на те домены, которые прописаны в ipset.conf. С ними вообще теряется соединение.

Если эти же устройства подключить по Wi-Fi, то всё работает стабильно.

Мои познания, позволяют только предположить, что собаГа порыта, конечно же, где-то глубже скрипта или AdGuard Home, но где именно, затрудняюсь даже представить... поэтому и пишу сюда.

Edited by taravasya
Link to comment
Share on other sites

Для начала что значит

Цитата

Так вот....Те устройства, к которым применена политика доступа в интернет НЕ по умолчанию, в случае подключения к роутеру по LAN-у, перестают ходить на те домены, которые прописаны в ipset.conf. С ними вообще теряется соединение.

Если эти же устройства подключить по Wi-Fi, то всё работает стабильно.

Второе какие настройки получают ваши клиенты при подключение от роутера.

Link to comment
Share on other sites

Не понятно, что именно непонятно? ))

Например, у меня есть комп и у него есть и LAN и WiFi. Если его подключить по LAN и открыть в браузере один из сайтов из списка в ipset.conf, то в результате, в браузере будет ошибка:

image.thumb.png.ff3b4de18f9247aa7292614318af61ff.png

А если подключить этот же комп по вифи, или применить к нему "Политику доступа в интернет" по-умолчанию, то этот же сайт, без проблем откроется.

Та же петрушка касается отдельно взятых приложений. Например Spotify, Tidal, или например, в тв-боксе ютуб, все эти приложения перестают работать, независимо от протоколов соединения, теряя связь с серверами.

Домены, НЕ добавленные в ipset.conf открываются в браузере, и работают в приложениях, независимо от способа подключения и протоколов...

 

В 19.07.2023 в 08:34, vasek00 сказал:

какие настройки получают ваши клиенты при подключение от роутера.

Настройки сети? И так и эдак, это DHCP клиенты.

Edited by taravasya
Link to comment
Share on other sites

  • 2 weeks later...

Добрый день. Сегодня прилетело обновление 4.0.2, схема перестала работать. Подскажите решение, кто знает.

 

Возможно, нарушение работоспособности связанно с этой проблемой:

 

Link to comment
Share on other sites

24 минуты назад, dogoma сказал:

Добрый день. Сегодня прилетело обновление 4.0.2, схема перестала работать. Подскажите решение, кто знает.

 

Возможно, нарушение работоспособности связанно с этой проблемой:

 

Именно с ней и связано. Тут либо откат либо ждать

Edited by Denis P
  • Upvote 1
Link to comment
Share on other sites

Всем привет.

Ну вот вроде iptables обновили, я обновил его у себя, а всё-равно решение не работает.

По команде:

ip route list table 1001

вывод пустой. Подскажите, может кто уже разобрался в чём дело?

Link to comment
Share on other sites

1 час назад, dogoma сказал:

Всем привет.

Ну вот вроде iptables обновили, я обновил его у себя, а всё-равно решение не работает.

По команде:

ip route list table 1001

вывод пустой. Подскажите, может кто уже разобрался в чём дело?

Тоже столкнулся с подобной проблемой, скрипт по какой-то причине не создает таблицу, при её отсутствии, но решение простое:

ip route add default dev nwg0 table 1001

Где nwg0 имя vpn интерфейса

Edited by Denis P
  • Upvote 1
Link to comment
Share on other sites

58 минут назад, coolmen0509 сказал:

Всем доброй ночи! У кого нить после обновления на 4.02 работает? пробовал вручную ip route add, но все равно не работает.

ip route add default dev nwg0 table 1001

Link to comment
Share on other sites

1 час назад, coolmen0509 сказал:

Всем доброй ночи! У кого нить после обновления на 4.02 работает? пробовал вручную ip route add, но все равно не работает.

iptables обновили?

opkg update && opkg upgrade

у кого на 4.0 не создается таблица - файл /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh нужно привести к виду
 

#!/bin/sh

[ "$1" == "hook" ] || exit 0
[ "$system_name" == "nwg0" ] || exit 0
[ ! -z "$(ipset --quiet list bypass)" ] || exit 0
[ "${connected}-${link}-${up}" == "yes-up-up" ] || exit 0

if [ -z "$(ip route list table 1001)" ]; then
    ip route add default dev $system_name table 1001
fi

 

  • Upvote 4
Link to comment
Share on other sites

8 часов назад, Denis P сказал:

iptables обновили?

opkg update && opkg upgrade

у кого на 4.0 не создается таблица - файл /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh нужно привести к виду
 

#!/bin/sh

[ "$1" == "hook" ] || exit 0
[ "$system_name" == "nwg0" ] || exit 0
[ ! -z "$(ipset --quiet list bypass)" ] || exit 0
[ "${connected}-${link}-${up}" == "yes-up-up" ] || exit 0

if [ -z "$(ip route list table 1001)" ]; then
    ip route add default dev $system_name table 1001
fi

 

Спасибо, заработало! :) Раз такая пьянка пошла, то уже с IPv6 стало работать данное решение (я имею ввиду включенное от провайдера+VPN поддерживает IPV6))?

Link to comment
Share on other sites

6 часов назад, coolmen0509 сказал:

Спасибо, заработало! :) Раз такая пьянка пошла, то уже с IPv6 стало работать данное решение (я имею ввиду включенное от провайдера+VPN поддерживает IPV6))?

Да, с v6 тоже заработает если под него сконфигурить.

Link to comment
Share on other sites

5 минут назад, coolmen0509 сказал:

А есть уже у кого-то, готовые скрипты - так AGH поддерживает полностью v6...

Вечером накидаю рыбу с дополнениями к базовой инструкции.

  • Upvote 1
Link to comment
Share on other sites

Дополненная инструкция для поддержки ipv6. Требуется KeeneticOS 4.x+ и настроенный ipv6 на туннельном интерфейсе

Дополнен скрипт /opt/etc/init.d/S52ipset,

добавлены скрипты  /opt/etc/ndm/netfilter.d/011-bypass6.sh и /opt/etc/ndm/ifstatechanged.d/011-bypass6-table.sh

Скрипт с примером /opt/etc/AdGuardHome/ipset.conf дополнен ipset`ом bypass6

ЗЫ работоспособность скриптов проверил, но сейчас в локации без v6 так что полностью проверю через пару дней как буду дома(там аналогичная конструкция работает).

 

В 08.06.2023 в 11:01, Александр Рыжов сказал:

Контент последней статьи с сайта keenetic-gi.ga, архив доступен здесь

В самом алгоритме нет ничего нового, но благодаря недавнему обновлению AdGuard Home (далее AGH) его можно реализовать довольно изящно: использование VPN для заданных вами доменов возможно тройкой коротких скриптов. 

 

Требования

  • Развёрнутая среда Entware,
  • Рабочее VPN-соединение поверх провайдерского, по которому будет идти обращение к определённым доменам.

 

Установка пакетов

Подразумевается, что AGH будет использоваться вместо встроенной в прошивку службы DNS Proxy. Установите необходимые пакеты:

opkg install adguardhome-go ipset iptables ip-full

Выполните первоначальную настройку 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
    ipset create bypass6 hash:ip family inet6
    ip rule add fwmark 1001 table 1001
    ip -6 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
[ "${connected}-${link}-${up}" == "yes-up-up" ] || exit 0

if [ -z "$(ip route list table 1001)" ]; then
    ip route add default dev $system_name table 1001
fi

Тоже упражнение но для поддержки ipv6. Файл /opt/etc/ndm/ifstatechanged.d/011-bypass6-table.sh с содержимым:

#!/bin/sh

[ "$system_name" == "nwg0" ] || exit 0
[ ! -z "$(ipset --quiet list bypass6)" ] || exit 0
[ "${connected}-${link}-${up}" == "yes-up-up" ] || exit 0

if [ -z "$(ip -6 route list table 1001)" ]; then
    ip -6 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 ! -i nwg0 -m conntrack --ctstate NEW -m set --match-set bypass dst -j CONNMARK --set-mark 1001
     iptables -w -t mangle -A PREROUTING ! -i nwg0 -m set --match-set bypass dst -j CONNMARK --restore-mark
fi

Тоже упражнение но для поддержки ipv6. Создать скрипт /opt/etc/ndm/netfilter.d/011-bypass6.sh

#!/bin/sh

[ "$type" != "ip6tables" ] && exit
[ "$table" != "mangle" ] && exit
[ -z "$(ip -6 link list | grep nwg0)" ] && exit
[ -z "$(ipset --quiet list bypass6)" ] && exit

if [ -z "$(ip6tables-save | grep bypass6)" ]; then
     ip6tables -w -t mangle -A PREROUTING ! -i nwg0 -m conntrack --ctstate NEW -m set --match-set bypass6 dst -j CONNMARK --set-mark 1001
     ip6tables -w -t mangle -A PREROUTING ! -i nwg0 -m set --match-set bypass6 dst -j CONNMARK --restore-mark
fi

где nwg0 — снова сетевой интерфейс VPN-соединения.

Сделайте скрипты исполняемыми:

chmod +x /opt/etc/init.d/S52ipset
chmod +x /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh
chmod +x /opt/etc/ndm/ifstatechanged.d/011-bypass6-table.sh
chmod +x /opt/etc/ndm/netfilter.d/010-bypass.sh
chmod +x /opt/etc/ndm/netfilter.d/011-bypass6.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,bypass6
instagram.com,cdninstagram.com/bypass,bypass6
epicgames.com,gog.com/bypass,bypass6

Т.е. в левой части через запятую указаны домены, требующие обхода блокировок, справа после слэша — ipset, в который AGH складывает результаты разрешения DNS-имён. Можно указать всё в одну строчку, можно разделить логически на несколько строк как в примере. Домены третьего уровня и выше также включаются в обход блокировок, т.е. указание intel.com включает www.intel.com, download.intel.com и пр.
Рекомендую добавить какой-нибудь «сигнальный» сервис, показывающий ваш текущий IP-адрес (ipinfo.io в примере). Так вы сможете проверить работоспособность настроенного решения. Учтите, что AGH не перечитывает изменённый файл, поэтому после правки перезапустите его с помощью:
 

/opt/etc/init.d/S99adguardhome restart

При желании можно использовать несколько VPN-соединений для обращения к разным доменам, для простоты понимания здесь это не описано.

 

Диагностика проблем

  • Убедитесь в том, что набор ipset создан и наполняется в процессе работы:
# Проверка  ipv4
ipset --list bypass
# Проверка  ipv6
ipset --list bypass6

Вывод должен быть не пустой.

  • Убедитесь в существовании нужной таблицы роутинга для обхода блокировок:
# Проверка  ipv4
ip rule list | grep 1001
# Проверка  ipv6
ip -6 rule list | grep 1001
  • Убедитесь, что в таблице присутствует необходимый маршрут:
# Проверка  ipv4
ip route list table 1001
# Проверка  ipv6
ip -6 route list table 1001
  • Посмотрите, существуют ли правила netfilter для пометки пакетов:
# Проверка  ipv4
iptables-save | grep bypass
# Проверка  ipv6
ip6tables-save | grep bypass6
  • После перезагрузки роутера проверьте в веб-интерфейсе Системный журнал, в нём не должно быть красных строк, связанных с настроенными скриптами.

Удачи в начинаниях!

 

  • Thanks 1
  • Upvote 2
Link to comment
Share on other sites

57 минут назад, r13 сказал:
  • Убедитесь, что в таблице присутствует необходимый маршрут:
# Проверка  ipv4
ip route list table 1001
# Проверка  ipv6
ip -6 route list table 1001

Не создаются маршруты, не надо добавлять - ниже процитировал? 

м

20 часов назад, Denis P сказал:
[ "$1" == "hook" ] || exit 0

 

Link to comment
Share on other sites

33 минуты назад, coolmen0509 сказал:

Не создаются маршруты, не надо добавлять - ниже процитировал? 

м

 

Да, этот кусок

[ "$1" == "hook" ] || exit 0

не нужен.

Зы, если все равно не создастся,  отлавливать какое из условий скрипта не отрабатывает.

Зы2 chmod +x для новых скриплов было выполнено?

Edited by r13
Link to comment
Share on other sites

9 часов назад, r13 сказал:

Да, этот кусок

[ "$1" == "hook" ] || exit 0

не нужен.

Зы, если все равно не создастся,  отлавливать какое из условий скрипта не отрабатывает.

Зы2 chmod +x для новых скриплов было выполнено?

Chmod +x конечно сделано, причем не работает именно эти скрипты, которые маршруты добавляют .. маркирование трафика работает ..

Link to comment
Share on other sites

1 час назад, coolmen0509 сказал:

Chmod +x конечно сделано, причем не работает именно эти скрипты, которые маршруты добавляют .. маркирование трафика работает ..

Такс, подправил скрипт, сократив количество проверок, попробуйте с ним.

 

Edited by r13
Link to comment
Share on other sites

Также можно упростить инструкцию и вместо создания маршрутов скриптами использовать нативные политики keenos, которые уже являются таблицами маршрутизации.

Просто создаем политику и включаем в нее требуемый vpn туннель.

Далее с помощью команды cli show ip policy смотрим связанный с политикой номер таблицы маршрутизации:

Скрытый текст

(config)> show ip policy

           policy, name = Policy1, description = VPN:
                 mark: ffffd00
               table4: 42
 

И используем эту таблицу в скрипте /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
    ipset create bypass6 hash:ip family inet6
    ip rule add fwmark 1001 table 42
    ip -6 rule add fwmark 1001 table 42
fi

в таком случае скрипты /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh и /opt/etc/ndm/ifstatechanged.d/011-bypass6-table.sh вообще не нужны. Эту функцию будет выполнять сама KeenOS, ну и бонусом будет резервирование/агрегация каналов предоставляемая политиками.

  • Thanks 4
Link to comment
Share on other sites

Здравствуйте! Спасибо за обновлённые скрипты, всё заработало! Хочу сделать то же самое, но без AdGuardHome (он мне не нужен), чтобы было минимум лишних элементов, но для меня это пока сверх-сложная-задача. Чисто технически есть такая возможность? Вроде во встроенном в KeeneticOS DNS-сервере нет таких возможностей, чтобы добавлять резолвнутые ip-адреса в ipset. Как вариант (плохой), сделать cron, который раз в час будет резолвить все домены и добавлять ip-адреса в ipset, или даже в статические маршруты (не знаю как лучше)

Link to comment
Share on other sites

8 минут назад, Freedom сказал:

Как вариант (плохой), сделать cron, который раз в час будет резолвить все домены и добавлять ip-адреса в ipset, или даже в статические маршруты (не знаю как лучше)

Смотрите в сторону

 

 

  • Thanks 1
Link to comment
Share on other sites

10 часов назад, r13 сказал:

Также можно упростить инструкцию и вместо создания маршрутов скриптами использовать нативные политики keenos, которые уже являются таблицами маршрутизации.

Просто создаем политику и включаем в нее требуемый vpn туннель.

Далее с помощью команды cli show ip policy смотрим связанный с политикой номер таблицы маршрутизации:

  Скрыть содержимое

(config)> show ip policy

           policy, name = Policy1, description = VPN:
                 mark: ffffd00
               table4: 42
 

И используем эту таблицу в скрипте /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
    ipset create bypass6 hash:ip family inet6
    ip rule add fwmark 1001 table 42
    ip -6 rule add fwmark 1001 table 42
fi

в таком случае скрипты /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh и /opt/etc/ndm/ifstatechanged.d/011-bypass6-table.sh вообще не нужны. Эту функцию будет выполнять сама KeenOS, ну и бонусом будет резервирование/агрегация каналов предоставляемая политиками.

Спасибо.ю сейчас попробую настроить. Как я понимаю скрипты /opt/etc/ndm/netfilter.d/011-bypass6.sh и /opt/etc/ndm/netfilter.d/019-bypass.sh тоже не нужны...

Link to comment
Share on other sites

28 минут назад, coolmen0509 сказал:

Спасибо.ю сейчас попробую настроить. Как я понимаю скрипты /opt/etc/ndm/netfilter.d/011-bypass6.sh и /opt/etc/ndm/netfilter.d/019-bypass.sh тоже не нужны...

Нет, нетфильтр остается, это маркировка трафика для перенаправления в нужную таблицу маршрутизации

Link to comment
Share on other sites

6 минут назад, coolmen0509 сказал:

там ссылки на 1001е таблицы, тогда тоже нужно менять на те, что с политик?

Нет там ссылка на маркировку, а привязка к таблице в первом скрипте:

42 минуты назад, coolmen0509 сказал:

ip rule add fwmark 1001 table 42

Если маркировка 1001 то идти в таблицу 42. Если очень хочется можно везде сменить и маркировку тоже на номер таблицы, но это если хочется чтоб было красиво), на функционал не влияет.

Link to comment
Share on other sites

А понял, глупый вопрос конечно - как в политиках по умолчанию убрать ВПН соединение, или если только для интернета основного новую политику?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...