Jump to content

ipset-dns для выборочного роутинга


Recommended Posts

Автор, дай бог тебе здоровья. Я уже устал искать нормальный способ, чтобы можно было просто вбить сайт и всё. Настроил, всё работает, спасибо!

  • Thanks 1
Link to comment
Share on other sites

  • Replies 90
  • Created
  • Last Reply

Top Posters In This Topic

Помогите советом), пытаюсь настроить следующую цепочку:

устройства -> роутер -> выход в интернет с обходом заблокированных сайтов.

  • Белый IP есть;
  • Локальный доступ сделать получилось, есть доступ к админке;
  • «ipset-dns для выборочного роутинга» уже успешно работает на роутере.

Но не выходит сделать выход в интернет. Делал всё как в статье «Доступ в Интернет через WireGuard-туннель», однако после команды

interface Wireguard0 security-level private

перестает работать обход заблокированных сайтов. 

А после того как я меняю приоритет подключений как в инструкции

вовсе пропадает интернет везде. Тут я предполагаю я не верно настраиваю маршрутизацию, хотя делал как в инструкции

Edited by Сергей Грищенко
решил, нужно было прописать Wireguard2
Link to comment
Share on other sites

  • 2 weeks later...

Прошу помощи. Просто перестало работать... Несколько дней твиттер и инста просто плохо грузили картинки. Приходилось обновлять несколько раз, прежде чем прогружалось. Фейсбук перестал открываться вообще. Решил перезагрузить роутер, теперь не открывается тупо ничего кроме рутрекера. Причём он работает так, будто блокировка снята) Пробовал прописывать вместо 8.8.8.8 1.1.1.1, как тут советовали ранее - не помогает. Куда копать?

Link to comment
Share on other sites

В 20.02.2024 в 22:43, soldout5918 . сказал:

Прошу помощи. Просто перестало работать... Несколько дней твиттер и инста просто плохо грузили картинки. Приходилось обновлять несколько раз, прежде чем прогружалось. Фейсбук перестал открываться вообще. Решил перезагрузить роутер, теперь не открывается тупо ничего кроме рутрекера. Причём он работает так, будто блокировка снята) Пробовал прописывать вместо 8.8.8.8 1.1.1.1, как тут советовали ранее - не помогает. Куда копать?

Тоже столкнулся с этим, простая проверка через трассировку показывает следующее:

Цитата

  9     *       71 ms     *     10.73.249.66
 10    71 ms    71 ms    71 ms  fra-fr5-sbb1-nc5.de.eu [91.121.215.116]
 11    90 ms    90 ms    90 ms  be103.waw-wa2-sbb1-nc5.pl.eu [213.251.128.114]
 12    90 ms    90 ms    90 ms  10.200.0.83
 13   122 ms   134 ms   128 ms  msk-ix.ertelecom.ru [195.208.209.132]
 14   149 ms   143 ms   134 ms  188x186x145x2.static.cc-perm.ertelecom.ru [188.186.145.2]
 15   140 ms   138 ms   140 ms  188x186x145x1.static.cc-perm.ertelecom.ru [188.186.145.1]

думал может днс как то перехватывают, подключение dot и doh не помогло. Странно что не работает именно на роутере, напрямую подключение телефона и сервера через wg всё ок.

Link to comment
Share on other sites

С сегодняшнего дня у меня начали перехватывать DNS (информация выше) и перестал работать VPN. Если вы столкнулись с этим, проверить можно очень легко, добавляем в обход 2ip.ru и смотрим, если его обойти удалось, а остальные сайт нет, значит вероятнее всего вы столкнулись с этим тоже или сделайте трассеровку, как я постом выше.

Как обойти перехват DNS для данного решения, чтобы VPN вновь работал:

1. Устанавливаем и настраиваем по инструкции DOH и DOT. Список доступных DOH и DOT тут.

2. Заходим в консоль порт 222, смотрим под какими портами у нас DOH и DOT, вводим команду

~ # cat /tmp/ndnproxymain.stat

Total incoming requests: 19
Proxy requests sent:     19
Cache hits ratio:        0.000 (0)
Memory usage:            20.75K

DNS Servers

                      Ip   Port  R.Sent  A.Rcvd  NX.Rcvd  Med.Resp  Avg.Resp  Rank  
             192.168.1.1   5354       0       0        0       0ms       0ms     2  
             192.168.1.1   5353       0       0        0       0ms       0ms     4  
               127.0.0.1  40500       0       0        0       0ms       0ms     5  
               127.0.0.1  40501       1       1        0      78ms      78ms     4  
               127.0.0.1  40502       0       0        0       0ms       0ms     3  
               127.0.0.1  40503       0       0        0       0ms       0ms     2  
               127.0.0.1  40508       0       0        0       0ms       0ms     3  
               127.0.0.1  40509      18      18        0      10ms      20ms    10  

Всё что с портами 40500-405++ как раз doh или dot. Запоминаем любой порт.

3. Меняем DNS в ipset-dns

~ # nano /opt/etc/bypass.conf

DNS=127.0.0.1:40509

Перезагружаем роутер и проверяем, у меня всё вновь работает. 

Дополнительно, как выбрать наиболее быстрый DOH и DOT. Меняем только порт, проверяем какой будет быстрее.

while true; do dig google.com @127.0.0.1 -p 40509 | grep time; sleep 1; done

P.S. DOH и DOT можно настроить на весь трафик, я так делать не стал, сделал только для обхода. Смотрите скрин.

chrome_XlBISLsyi0.png

Edited by Сергей Грищенко
Link to comment
Share on other sites

4 минуты назад, keenet07 сказал:

А кто у вас его перехватывает? ДНС запросы ведь по умолчанию в этом решение идут внутри ВПН.

Запрос ДНС идёт в ipset-dns. DNS прописан в /opt/etc/bypass.conf. Если делать обычный прямой конфиг wireguard клиент телефон -> wireguard сервер, то тогда да, ДНС будет внутри VPN. В случае с решением от ТС это так не работает, иначе роутеру не будут видны адреса и он не будет понимать какие нужно гнать под ВПН, а какие нет.

 

Link to comment
Share on other sites

53 минуты назад, Сергей Грищенко сказал:

Запрос ДНС идёт в ipset-dns. DNS прописан в /opt/etc/bypass.conf. Если делать обычный прямой конфиг wireguard клиент телефон -> wireguard сервер, то тогда да, ДНС будет внутри VPN. В случае с решением от ТС это так не работает, иначе роутеру не будут видны адреса и он не будет понимать какие нужно гнать под ВПН, а какие нет.

 

Домены для резолва прописаны в прошивочном окружении/интерфейсе. IPSET-DNS резолвит их прописанным в своем конфиге DNS. Который при подключенном VPN также маршрутизируется через него. Т.е. утечки быть не должно. Если только он не резолвит их ещё и тогда когда не поднят VPN (временно отключен или недоступен), т.е. через провайдера. Вот тогда в таблицу могут попасть не верные/перехваченные значения ip адресов для некоторых доменов. И соответственно ресурс открываться будет либо через раз, либо совсем не будет, в зависимости от количества этих адресов на одном домене.

Edited by keenet07
Link to comment
Share on other sites

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

Домены для резолва прописаны в прошивочном окружении/интерфейсе. IPSET-DNS резолвит их прописанным в своем конфиге DNS. Который при подключенном VPN также маршрутизируется через него. Т.е. утечки быть не должно. Если только он не резолвит их ещё и тогда когда не поднят VPN (временно отключен или недоступен), т.е. через провайдера. Вот тогда в таблицу могут попасть не верные/перехваченные значения ip адресов для некоторых доменов. И соответственно ресурс открываться будет либо через раз, либо совсем не будет, в зависимости от количества этих адресов на одном домене.

Видимо да, во всяком случае могу точно подтвердить, что мой метод сработал и помог решить проблему.

Link to comment
Share on other sites

1 час назад, Сергей Грищенко сказал:

Видимо да, во всяком случае могу точно подтвердить, что мой метод сработал и помог решить проблему.

Либо, вы просто отчистили таблицу ip адресов, перезагрузив устройства и она собралась обратно со включенным VPN. Поэтому проблемы пока не наблюдается.

В любом случае с вашей модификацией неправильные Ip попадать в неё уже не должны.

Edited by keenet07
Link to comment
Share on other sites

  • 2 weeks later...

@Александр Рыжов можете подсказать по двум моментам почему так. 

1. После перезагрузки роутера служба иногда не стартует, приходится запускать ее вручную через /opt/etc/init.d/S52ipset-dns start. Причем такое чаще бывает именно при установке на OPKG установленный во внутреннюю память. Походу какой-то race condition, не могу понять.

2. При попытке использовать прошивочный DoT/DOH резолвер в логах спамятся ошибки:

При использовании DoT (127.0.0.1:40500 -> CloudFlare 1.1.1.1):

Мар 11 19:21:20 stubby
Could not get qname from query: A helper function for dicts had a name argument that for a name that is not in the dict.

При использовании DoH (127.0.0.1:40508 -> CloudFlare https://cloudflare-dns.com/dns-query)

Мар 11 19:05:21 https-dns-proxy
0000: 0000: 49 6e 76 61 6c 69 64 20 71 75 65 72 79 2e Invalid query.

При этом вроде все работает, странно. 

Link to comment
Share on other sites

1 час назад, Александр Рыжов сказал:

1. Ровно так же. Пока не отловил причину.

Пока решил диким костылем.

S52ipset-dns:

#!/bin/sh

PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

. /opt/etc/bypass.conf

if [ "$1" = "start" ]; then
    ipset create $SET_NAME hash:ip
    ip rule add fwmark 1001 table 1001
    ipset-dns $SET_NAME $SET_NAME 0.0.0.0:5353 $DNS
    sleep 30s
    ipset-dns $SET_NAME $SET_NAME 0.0.0.0:5353 $DNS
fi

 

1 час назад, Александр Рыжов сказал:

2. Не могу сказать, не использую.

Не хотите попробовать? :) Все-таки работа через локальный (прошивочный) резолвер мне показалась гораздо быстрее, чем если гнать DNS через туннель. Плюс он вроде как должен кешировать. ipset-dns походу всегда стучит в upstream на каждый запрос (что логично), из-за этого первичное открытие сайта прям сильно долгое. Последующие, когда браузер уже закешировался по DNS лучше, но до перезагрузки браузера или ttl. А интеграция Bosch Home Connect (с недавнего времени их API не работает в РФ) в Home Assistant вообще не может подключится если DNS через туннель и выпадает с ошибкой таймаута.

 

 

Edited by Drafted
Link to comment
Share on other sites

13 часа назад, Drafted сказал:

2. При попытке использовать прошивочный DoT/DOH резолвер в логах спамятся ошибки:

При использовании DoT (127.0.0.1:40500 -> CloudFlare 1.1.1.1):

Мар 11 19:21:20 stubby
Could not get qname from query: A helper function for dicts had a name argument that for a name that is not in the dict.

При использовании DoH (127.0.0.1:40508 -> CloudFlare https://cloudflare-dns.com/dns-query)

Мар 11 19:05:21 https-dns-proxy
0000: 0000: 49 6e 76 61 6c 69 64 20 71 75 65 72 79 2e Invalid query.

При этом вроде все работает, странно. 

Да, у меня в логах точно так же.

Link to comment
Share on other sites

12 часа назад, Drafted сказал:

Пока решил диким костылем.

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

12 часа назад, Drafted сказал:

 ipset-dns походу всегда стучит в upstream на каждый запрос (что логично), из-за этого первичное открытие сайта прям сильно долгое.

Все современные браузеры кэшируют DNS-запросы, поэтому я бы искал причину тормозов в чём-то другом. Начал бы с согласования MSS c MTU внутри туннеля.

12 часа назад, Drafted сказал:

Все-таки работа через локальный (прошивочный) резолвер мне показалась гораздо быстрее, чем если гнать DNS через туннель. Плюс он вроде как должен кешировать.

Загляните в /tmp/ndnproxymain.conf. Прелесть в том, что прошивочная служба (со своим кэшем) обращается в ipset-dns. Т.е. для клиента за роутером любой кэшированный DNS-ответ исходит от прошивки, а не от ipset-dns.

Link to comment
Share on other sites

  • 4 weeks later...

@Александр Рыжов здравствуйте! Подскажите пожалуйста, как можно сделать, что бы можно было указывать диапазон IP адресов?

Я предположил, что раз не выходит в штатный-интернет фильтр, то нужно создать свой txt файл, с указанием диапазонов IP адресов, а дальше добавлять проверку в 

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

Верно ли я мыслю? 

Если подскажете как доработать, буду очень благодарен)

P.S. нужно для приложений, которые редко используют домены и чаще IP адреса, например тот же телеграм

Link to comment
Share on other sites

Короче заменил ipset-dns на dnsmasq и все полетело, не висит на резолвинге и нормально работает с локальным DoT/DoH. И стартует всегда без проблем при перезапуске :)

Dnsmasq тоже может добавлять все зарезолвенные адреса в ipset:

ipset=/#/bypass

В остальном все тоже самое.

Edited by Drafted
Link to comment
Share on other sites

Если кому интересно вот инструкция:

Сносим opkg и ставим заново на всякий случай. Я устанавливаю во внутреннюю память роутера. Все нужные пакеты занимают около 7мб.

После установки opkg заходим по SSH в Entware. Для этого в командной строке:

ssh root@192.168.1.1 -p 222

Устанавливаем пакеты:

opkg update && opkg install ipset iptables dnsmasq

Создаем файл конфигурации:

vi /opt/etc/bypass.conf

В него вставляем содержимое, отредактировав VPN_NAME и VPN_SUBNET (можно подсмотреть командой: ip addr):

VPN_NAME=nwg0
VPN_SUBNET=10.77.77.0/24

Даем права на запуск:

chmod +x /opt/etc/bypass.conf

Создаем скрипт запуска:

vi /opt/etc/init.d/S52ipset-bypass

В него вставляем содержимое:

#!/bin/sh

PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

. /opt/etc/bypass.conf

if [ "$1" = "start" ]; then
    ipset create bypass hash:ip
    ip rule add fwmark 1001 table 1001
fi

Даем права на запуск:

chmod +x /opt/etc/init.d/S52ipset-bypass

Создаем хук ifstatechanged.d:

vi /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh

В него вставляем содержимое:

#!/bin/sh

. /opt/etc/bypass.conf

[ "$1" == "hook" ] || exit 0
[ "$system_name" == "$VPN_NAME" ] || 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

. /opt/etc/init.d/S56dnsmasq restart

Даем права на запуск:

chmod +x /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh

Создаем хук netfilter.d:

vi /opt/etc/ndm/netfilter.d/010-bypass-table.sh

В него вставляем содержимое:

#!/bin/sh

. /opt/etc/bypass.conf

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

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

Даем права на запуск:

chmod +x /opt/etc/ndm/netfilter.d/010-bypass-table.sh

Правим конфиг dnsmasq.conf:

vi /opt/etc/dnsmasq.conf

В него вставляем новый конфиг, заменяя старый. Адрес в server можно поменять на предпочтительный DNS сервер, например 1.1.1.1 или 9.9.9.9.

user=nobody
pid-file=/var/run/opt-dnsmasq.pid
port=5353

min-port=4096
cache-size=1536

bogus-priv
no-negcache
no-resolv
no-poll
no-hosts
clear-on-reload

server=8.8.8.8
ipset=/#/bypass

Если вы используете прошивочный DoT или DoH, то можно указать его, чтобы DNS запросы к перенаправленным хостам также шифровались. Подсмотреть адреса и порты локальных резолверов можно командой cat /tmp/ndnproxymain.stat Все что с портами 405***  это DoH/DoT серверы кинетика. Выбираем любой. Адрес с портом указываем так:

server=127.0.0.1#40500

Готово! Перезапускаем роутер.

Добавляем нужные хосты в интернет-фильтр, как в инструкции в шапке темы:

DNS_add_record.png

Если @Александр Рыжов сделает из этого пакет, то будет вообще сказка)

Повторюсь это решение работает намного стабильнее и быстрее чем при использовании ipset-dns.

Edited by Drafted
  • Thanks 2
  • Upvote 2
Link to comment
Share on other sites

В 05.04.2024 в 08:39, Сергей Грищенко сказал:

здравствуйте! Подскажите пожалуйста, как можно сделать, что бы можно было указывать диапазон IP адресов?

Кстати, диапазон или конкретный IP для роутинга в нужный интерфейс можно указать в UI, через панель Статические маршруты. Вот например 111.111.111.X

image.thumb.png.bf6c020242c1a8b333a28f260f1b1c11.png

Edited by Drafted
Link to comment
Share on other sites

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

Кстати, диапазон или конкретный IP для роутинга в нужный интерфейс можно указать в UI, через панель Статические маршруты. Вот например 111.111.111.X

Не выходит :(, по какой логике добавлять?

chrome_qklj8geqNm.png

chrome_v2cIzWpql1.png

Link to comment
Share on other sites

А зачем вы всякую ерунду туда вводите?

Статический маршрут до сети позволяет настроить правило маршрутизации трафика для диапазона IP адресов заданных маской подсети через выбранный интерфейс. Как вам выше показали. С DNS это не связано. К примеру вы нашли где-то/выяснили на каких IP адресах хостится определенный сайт или несколько и хотите чтобы трафик на них шёл через выбранный VPN. 

Не нужно никакой адрес шлюза указывать. Достаточно интерфейса.

Это будет работать когда ваш VPN подключен.

Edited by keenet07
  • Thanks 1
Link to comment
Share on other sites

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

А зачем вы всякую ерунду туда вводите?

Статический маршрут до сети позволяет настроить правило маршрутизации трафика для диапазона IP адресов заданных маской подсети через выбранный интерфейс. Как вам выше показали. С DNS это не связано. К примеру вы нашли где-то/выяснили на каких IP адресах хостится определенный сайт или несколько и хотите чтобы трафик на них шёл через выбранный VPN. 

Не нужно никакой адрес шлюза указывать. Достаточно интерфейса.

Это будет работать когда ваш VPN подключен.

Спасибо! 

Если кто будет тупить так же как и я, то вот пример рабочих настроек

image.thumb.png.8aa4f6a0f96b0f6e37f73343b9bf3a09.png

Link to comment
Share on other sites

В 08.04.2024 в 21:14, Drafted сказал:
vi /etc/ndm/netfilter.d/010-bypass-table.sh

Тут вот ошибка мелкая, нужно /opt/etc/ndm/netfilter.d/010-bypass-table.sh

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

  • Thanks 1
Link to comment
Share on other sites

19 часов назад, Сергей Грищенко сказал:

Тут вот ошибка мелкая, нужно /opt/etc/ndm/netfilter.d/010-bypass-table.sh

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

Спасибо👍Исправил.

  • Thanks 1
Link to comment
Share on other sites

  • 2 weeks later...
В 08.04.2024 в 21:14, Drafted сказал:

Если @Александр Рыжов сделает из этого пакет, то будет вообще сказка)

Повторюсь это решение работает намного стабильнее и быстрее чем при использовании ipset-dns.

Погонял на KN-2710, при старте роутера так же race condition где-то остался. Как и ранее, помогает рестарт dnsmasq.

Link to comment
Share on other sites

6 часов назад, Александр Рыжов сказал:

Погонял на KN-2710, при старте роутера так же race condition где-то остался. Как и ранее, помогает рестарт dnsmasq.

В /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh строчку внизу на рестарт dnsmasq не забыли добавить?

#!/bin/sh

. /opt/etc/bypass.conf

[ "$1" == "hook" ] || exit 0
[ "$system_name" == "$VPN_NAME" ] || 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

. /opt/etc/init.d/S56dnsmasq restart
Edited by Drafted
Link to comment
Share on other sites

19 часов назад, Drafted сказал:

В /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh строчку внизу на рестарт dnsmasq не забыли добавить?

Не то, чтобы забыл, не делал. 

Зачем перезапускать dnsmasq, если его работоспособность зависит только от наличия ipset'а, создаваемого при старте роутера?

Link to comment
Share on other sites

43 минуты назад, Александр Рыжов сказал:

Зачем перезапускать dnsmasq, если его работоспособность зависит только от наличия ipset'а, создаваемого при старте роутера?

Есть подозрение что сначала нужно указать роут таблицы через нужный интерфейс, и только потом работать с ipset. По правде говоря я в этом не спец, может не прав. Но в любом случае перезапуск dnsmasq после поднятия интерфейса и добавления роута помогает всегда. Из 10 рестартов устройства все 10 успешные.

Edited by Drafted
Link to comment
Share on other sites

В 16.12.2023 в 10:38, Сергей Грищенко сказал:

вот скрипты для второго подключения, если вдруг кому нужно, всё точно так же, только порт для сайтов теперь 
192.168.1.1:5354

ipset-dns-keenetic.rar 1.71 \u041a\u0431 · 27 downloads

Подскажите, пожалуйста, алгоритм действий. Куда нужно поместить эти файлы, нужно ли их распаковывать и как запустить Makefile. 

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   1 member

×
×
  • Create New...