AdguardTeam / AdGuardHome

Network-wide ads & trackers blocking DNS server
https://adguard.com/adguard-home.html
GNU General Public License v3.0
24.79k stars 1.79k forks source link

External/Internal dns-request #4005

Open apnagaev opened 2 years ago

apnagaev commented 2 years ago

Hi! My AdGuard Home version is v0.107 It is docker container in virtual machine vith Ubuntu 20.04, intel x64 I have Inernal Domain (microsoft) DNS-server and AdGuard Home. All internal clients request dns from adguard and adguard request dns from ms dns-server (for domain compatibility) for internal clients. For part of device I use DoH and DoT. Some devices (mobile phones) can request dns from adguard from internal network and from internet (I use DoT, but this issue will be repeat and with dns:53). This device must resolve dns from internal with internal ip and from external with external ip. For this device I use upstrim with inernal dns-server. In version v0.106.3 it worked correctly. From internet resolved external ip, from internal network - internal ip. In v0.107 it is not work. Device use DoT and have one clientid in both network. It is resolve internal dns from internal and external networks, so if I add internal upstrim, I can't use adguard over internet and if I add external upstrim, I can't use adguard in internal network. Can you check it and help with issue? Thanks in advance

EugeneOne1 commented 2 years ago

@apnagaev, hello and thanks for the report. Could you please clarify some points:

  1. How did you configured the devices to use your internal DNS server? Have it been done via client's setting? If so, how do you identify them?
  2. If the internal DNS server is configured for the devices by it's IP address? Or some special domain name is used?

Could you also provide some examples of queries that are preformed but shouldn't along with the appropriate entries from query log?

apnagaev commented 2 years ago

thanks for answer!

  1. I use standart DoT in android mobilephones with DoT-address=ap.dot.mydomain.ru. In client profile in adguard I use DNS-id = ap
  2. I added internal IP in client profile, but adguard use only DoT-id (ap) It is example from internal network: image

It is from external: image

But in version v0.106.3 for internal request adguard gived internal dns-record and for external request - external record.

It is client profile: image

I drawed schem, may be it will be useful. image

ainar-g commented 2 years ago

(Вижу, у вас интерфейс на русском, так что, если можно, давайте на нём.)

@apnagaev, спасибо за подробный ответ и схему! Если я правильно понял, 10.255.255.2 — это ваш приватный DNS-сервер? В версиях до v0.107.0 функционал кастомных апстримов для клиентов с ClientID не работал, а в v0.107.0 мы его починили, см #3186. Как я вижу, у вашего клиента есть ClientID и кастомный апстрим, поэтому все запросы от него теперь корректно перенаправляются на приватный апстрим.

Если вам для клиента ap_ph совсем не нужны ответы от приватного DNS-сервера, то просто исключите его адрес из настроек клиента. Если вам нужны, например, только для домена my.local, то замените список апстримов на что-то типа:

[/my.local/]10.255.255.2
1.1.1.1
apnagaev commented 2 years ago

думал здесь принято на английском) на русском будет продуктивнее, спасибо!

Ваш вариант был одним из первых, которыми я пытался самостоятельно решить проблему) но так не подойдет. Клиент ap_ph должен получать внешнюю запись при обращении через мобильную сеть и внутреннюю при обращении через WiFi, домен mydomain.ru маршрутизируемый и ресурс cloud.mydomain.ru внутри периметра имеет адрес 10.255.x.x, а за пределами периметра 83.x.x.x. Если я применю конфиг таким образом, то на любое обращение к mydomain.ru будет отдавать внутренний адрес, даже если я за пределами периметра. Не знаю почему в 106 все работало правильно, но работало, у меня в докере обе версии и этот кейс легко повторяется. На ум приходит какойто параметр который бы менял апстрим дополнительно в зависимости от реального ip клиента.

ainar-g commented 2 years ago

В настоящее время такое можно сделать либо через правила $dnsrewrite:

||cloud.mydomain.ru^$client=10.255.255.123,dnsrewrite=NOERROR;A;10.255.254.1

Где 10.255.255.123 — IP-адрес клиента ap_ph. Либо сделав двух клиентов, ap_ph_external и ap_ph_internal, расставив им соотв. апстримы.

apnagaev commented 2 years ago

Разные апстримы для ap_ph_external и ap_ph_internal решило бы вопрос, но это один клиент, просто дома подключается к wifi, а за пределами, соответственно, другие сети. в этом случае придется переписывать профиль DoT в настройках телефона при каждом переключении сети, что не очень удобно. Вариант с $dnsrewrite возможен, но тоже не идеален, т.к. кроме cloud.mydomain.ru в сети есть еще достаточно большое количество ресурсов, которые также резолвятся по разному снаружи и внутри. придется по сути повторить все записи внутреннего dns на adguard. было бы здорово если бы появился параметр вроде: ||*.mydomain.ru^$client=10.255.0.0/16,dnsserver=10.255.123.123 Пока у меня позникает только желание развернуть еще один контейнер, перед ними поставить haproxy и завернуть запросы с внутренних адресов на "внутренний" adguard, а с внешних на "внешний", но тогда статистика будет не централизованной, да и вцелом такое решение кажется избыточным

ainar-g commented 2 years ago

Модификатор client (как и настройки перманентных клиентов) поддерживает CIDR, так что вы могли бы сделать что-то типа:

||site1.mydomain.ru^$client=10.255.0.0/16,dnsrewrite=NOERROR;A;10.255.254.1
||site2.mydomain.com^$client=10.255.0.0/16,dnsrewrite=NOERROR;A;10.255.254.2
||site3.mydomain.local^$client=10.255.0.0/16,dnsrewrite=NOERROR;A;10.255.254.3
…

То есть, создание DNS-зоны для клиентов в подсети. По сути заменяя ваш приватный DNS-сервер на AGH. Более того, правила $dnsrewrite будут работать и с фильтрлистами, так что вы можете добавить список со всеми IP приватных сервисов в таком виде в качестве списка на странице «Фильтры → Чёрные списки DNS».

По-другому сейчас сделать будет сложно, так как тут переплетаются идентификация клиента по подсети/IP-адресу, идентификация по ClientID, а также кастомные апстримы для доменов. Мы рассмотрим другие варианты на след. неделе.

apnagaev commented 2 years ago

Если что-то подобное реализовать получится или будет в плане, то пока буду сидеть на версии 106.3, т.к. ресурсов внутри достаточно много. Если возьмёте в работу, буду внимательно следить и с нетерпением ждать))

apnagaev commented 2 years ago

пока новостей нет?

ainar-g commented 2 years ago

@apnagaev, в ближайшее время подобная фича вряд ли будет реализована. Модель с двумя разными клиентами пока остаётся главным вариантом решения подобных задач.

apnagaev commented 2 years ago

Понял, спасибо. А внешняя СУБД для логов не планируется? чтобы хотябы статистику в одном месте собирать

ainar-g commented 2 years ago

Зависит от вашего определения «внешней». Рекомендую подписаться на этот тикет: #2290. Мы в любом случае хотим сделать какой-то дружественный к обработке формат.