5

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

Я как-то обманул (*) маршрутизатор, чтобы он передавал локальный IP-адрес DNS-сервера (192.168.1.99), когда он раздает адреса DHCP. На устройстве под управлением Windows 10 я вижу, что это тот случай, потому что, когда я просматриваю сетевые свойства, я вижу, что он использует первичные и вторичные IP-адреса DNS, которые мне нужны, и корректно разрешает локальные серверы по локальным адресам из общедоступных имен узлов.

(*) По сути, маршрутизатор не позволил бы мне установить DNS-серверы, радио-блок не выбрал бы. Проверка javascript позволила мне установить точку останова, чтобы я мог обойти логику, которая, очевидно, позволяет устанавливать DNS-сервер, только если у вас есть статический IP-адрес, которого у меня нет (и радиоблок для установки статического IP-адреса может ' даже не быть выбранным в любом случае!). Когда я отправил форму, оказалось, что изменение не произошло, но некоторые устройства теперь получают соответствующий DNS-сервер! Обновление: я обнаружил другой маршрутизатор, который не требовал каких-либо хитростей для прохождения DNS-серверов при назначении адресов DHCP, но Android по- прежнему не использует DNS-сервер, который он возвращает!

Но на Android он не работает, он разрешает имя хоста в видимый на весь мир IP-адрес, предполагая, что он не использует DNS-сервер, который раздает DHCP. (И необъяснимо, что доступ к серверам через внешний IP-адрес перестал работать, что и стало причиной необходимости разрешения имени хоста преобразовывать во внутренний адрес!)

Я использую Termux, чтобы попытаться устранить проблему, и обнаружил, что getprop net.dns1 и getprop net.dns2 вернули адреса IPv6, дальнейшее копание показало эти адреса в маршрутизаторе как адреса DNS, предоставленные провайдером. Поэтому я подумал, что, возможно, по какой-то причине трюк, который я использовал на роутере, не работал на Android.

Поэтому я попытался вручную настроить DNS-сервер для устройства. Использование Settings -> WiFi -> (long press network name) -> Modify network -> IP settings: Static Я ввел ту же самую конфигурацию сети, которую устройство получает через DHCP, например

IP address: 192.168.1.2
Gateway: 192.16.8.1.1
Network prefix length: 24
DNS 1: 192.168.1.99
DNS 2: 8.8.8.8

Но с этой ручной настройкой я вообще не могу получить доступ к чему-либо в локальной сети! Например, я не могу получить доступ к веб-странице локального маршрутизатора по адресу 192.168.1.1, браузер говорит, что он недоступен. Я не могу пропинговать тот же IP-адрес в Termux, он говорит: «Сеть недоступна». Если я запускаю ifconfig wlan0 и route в termux, вывод выглядит идентично выводу, когда я устанавливаю настройки IP для настройки через DHCP. Однако getprop net.dns1 прежнему возвращает IPv6-адрес, поэтому теперь я не уверен, что верю, что команда возвращает действительные данные. Обновление: Хорошо, на самом деле есть четыре адреса DNS: первые два - это адреса IPv6 от моего провайдера, которые каким-то образом просачиваются, а последние два - это два IPv4-адреса, которые я установил.

Похоже, что это характерно для более новых версий Android, более старое устройство Android 4.3 не имеет проблем (ему даже не нужна статическая IP-конфигурация для правильного разрешения имен хостов).

Какие еще вещи я могу попытаться решить эту проблему и заставить DNS работать должным образом?

Обновление: я нашел этот пост, который относится к случаю, когда:

  • Существует два DNS-сервера: локальный IPv4 (192.168.1.230) и ISP IPv6 (2a01: e00:: 1).
  • DNS-сервер IPv4 знает о локальном домене, а IPv6 - нет.
  • Android, случается, использует DNS-сервер IPv6, и поэтому не может разрешить хосты в локальной сети.

Это соответствует тому, что я вижу с моей конфигурацией. Но тогда плакат заявляет:«Это работает, как задумано», с чем у меня есть проблемы. Затем перечисляются четыре возможных обходных пути:

  • Добавление IPv6-адреса на локальный DNS-сервер и настройка маршрутизатора для объявления этого адреса как DNS-сервера IPv6, если это возможно. Это не будет работать, потому что маршрутизатор не позволит мне указать адрес IPv6 для DNS.
  • Настройка локальных имен на роутере, если это возможно. Я не уверен, что это значит. Сам роутер не предоставляет возможности DNS
  • Использование общедоступного домена, чтобы маршрутизатор ISP мог разрешать внутренние имена. Я тоже не уверен, что это значит - как публичный домен сможет ссылаться на внутренний IP-адрес ???
  • Отключение IPv6 DNS (или отключение IPv6) на маршрутизаторе. Маршрутизатор не предоставляет какого-либо метода для отключения или другой настройки чего-либо в отношении IPv6.

Поэтому я все еще застрял в системе, которая по сути является DOA, потому что некоторые устройства в сети не могут видеть ресурсы, которые им необходимы для функционирования.

Обновление: я установил отдельный DHCP-сервер и отключил один на маршрутизаторе, но устройство Android все еще получает два DNS-сервера IPv6 в своем списке - кажется, что задержка секунды или две после того, как DHCP-сервер сообщил о DNS серверы появляются раньше, чем появляются IPv6, и они всегда вставляются перед адресами, указанными сервером. Я попытался увеличить число DNS-серверов, о которых сообщалось, чтобы попытаться заполнить любую таблицу, которая может быть у Android, но даже с 32 другими DNS-серверами он все еще вставляет еще два в начале, в общей сложности 34! Как Android получает эти адреса, и как я могу заставить его сбить его ?! Это сводит меня с ума!

Обновление: я нашел приложение под названием "DNS Changer", которое, похоже, решает проблему, хотя у меня есть некоторые сомнения относительно того, может ли это быть больше, чем обходной путь, пока не будет найдено реальное исправление. Кажется, для создания VPN какой-то, но я хотел бы знать больше, как это работает. Это маршрутизация трафика за пределами моего брандмауэра? Куда? Мне интересно, если он все маршрутизирует, потому что тест скорости на моем собственном сервере дает около 20% средней скорости передачи по сравнению с тем, если я запускаю тот же тест с IP-адресом вместо имени хоста. Я использовал другое приложение, которое сообщает о 7 различных именах внешних хостов и утверждает, что вся передача прошла через каждое из них. Кроме того, этот обходной путь не работает, если сеть выходит из строя!

Обновление: я также вижу эту проблему в рутированном устройстве под управлением Android 5.1 ... Я установил статический IP-адрес и DNS, указывающий на внутренний сервер, и даже зашел так далеко, что использовал setprop для установки каждого DNS-сервера на IP-адрес моего внутреннего DNS-сервера ... все же в termux, когда я использую nslookup, он по-прежнему настаивает на использовании 8.8.8.8 для поиска имени. Как заставить Android фактически использовать указанный мной DNS-сервер?

6 ответов6

1

заблокируйте весь другой трафик исходящего порта 53 (DNS) в маршрутизаторе, кроме DNS, который вы хотите использовать, и устройство Android будет использовать то, что вы назначаете ему в dhcp, похоже, добавит их в конец списка, так что это не удастся другим и использовать те, которые вы хотели, не знаю, почему Google это сделал

0

У меня та же проблема. Трудно поверить, что такая ошибка существует в Android и не исправлена.

Вы можете обойти это, вручную установив преобразователи DNS из командной строки. Проблема в том, что для этого нужен root.

Например

ncd resolve setifdns wlan0 8.8.8.8 4.4.4.4

Я обнаружил, что DNSman поддерживает этот метод, поэтому вам не нужно вводить его каждый раз при перезагрузке или изменении разделов. Это приложение с открытым исходным кодом, доступное в F-Droid, для которого требуется root.

Я надеюсь, что это помогает.

0

Начиная с Android 6.1.x, вы можете изменить DNS только для привязанного устройства и ничего больше. Все остальное игнорируется, независимо от того, что вы установили, или какое приложение вы используете

с DNS проблемы.

(Где Android 6.1.x, я думаю, это Android 6.0.x)

0

Я нашел рабочее решение. Это приложение https://play.google.com/store/apps/details?id=com.frostnerd.dnschanger, которое называется "opensource" (только цитируется). Https://git.frostnerd.com/PublicAndroidApps/DnsChanger создает VPN подключение к устройству для перенаправления всех DNS-запросов.

Мне это не очень нравится, потому что он размещен на собственном Gitlab, где все можно сделать и отменить.

О том, как создать туннели adhoc openvpn для достижения того же самого.

0

Вот решение, которое я нашел для работы на Android 5.1. Обратитесь к этой статье для получения дополнительной информации [ https://developer.mozilla.org/en-US/docs/Archive/B2G_OS/Developing_Firefox_OS/Customizing_DNS][1]

adb pull /system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf 20-dns.conf

Измените строки 22-26 на то, что вам нужно. На моем устройстве я удалил строки 22-26 и изменил строки 17-20 на:

count=1
    for i in 1 2 3 4; do
        setprop dhcp.${intf}.dns${i} ""
    done

в

count=1
    for i in 1 2 3 4; do
        setprop dhcp.${intf}.dns${i} "192.168.7.8"
    done

Измените этот IP на то, что вам нужно

После того, как вы изменили файл, размонтируйте систему и перезапишите файл по умолчанию на тот, который вы только что изменили:

adb shell shell mount -o rw,remount /system
adb push /yourpath/20_dns.conf /system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf
adb shell chmod 644 /system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf
adb shell mount -o ro,remount /system

Я обнаружил, что перемонтирование может быть не таким, как здесь, поэтому запустите adb shell mount чтобы увидеть все точки монтирования и найти подходящую на вашем устройстве

После перемонтирования перезагрузитесь. Проверьте, работает ли он, зайдя в оболочку устройства через adb, и запустите tcpdump udp port 53 чтобы увидеть

-2
  1. Откройте настройку беспроводного модема, введя 192.168.1.1 в адресной строке браузера или другой IP-адрес, если вы его изменили.
  2. Отключите настройку IPv6 DHCP и измените настройку на eui 64

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .