Настройка устройства Android 7.1 для использования локального DNS-сервера
Я пытаюсь заставить устройство 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 ответов
Заблокируйте весь другой трафик исходящего порта 53 (DNS) в маршрутизаторе, кроме DNS, который вы хотите использовать, и устройство Android будет использовать то, что вы назначаете ему в dhcp, похоже, добавит их в конец списка, так что это не удастся другим и использовать те, которые вы хотели, не знаю, почему Google это сделал
У меня та же проблема. Трудно поверить, что такая ошибка существует в Android и не исправлена.
Вы можете обойти это, вручную установив преобразователи DNS из командной строки. Проблема в том, что для этого нужен root.
Например
ncd resolve setifdns wlan0 8.8.8.8 4.4.4.4
Я обнаружил, что DNSman поддерживает этот метод, поэтому вам не нужно вводить его каждый раз при перезагрузке или изменении разделов. Это приложение с открытым исходным кодом, доступное в F-Droid, для которого требуется root.
Я надеюсь, что это помогает.
Начиная с Android 6.1.x, вы можете изменить DNS только для привязанного устройства и ничего больше. Все остальное игнорируется, независимо от того, что вы установили, или какое приложение вы используете
с DNS проблемы.
(Где Android 6.1.x, я думаю, это Android 6.0.x)
Я нашел рабочее решение. Это приложение https://play.google.com/store/apps/details?id=com.frostnerd.dnschanger которое называется "opensource" (только цитируется). https://git.frostnerd.com/PublicAndroidApps/DnsChanger создает VPN подключение к устройству для перенаправления всех DNS-запросов.
Мне это не очень нравится, потому что он размещен на собственном Gitlab, где все можно сделать и отменить.
О том, как создать туннели adhoc openvpn для достижения того же самого.
Вот решение, которое я нашел для работы на 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
чтобы увидеть
- Откройте настройку беспроводного модема, введя
192.168.1.1
в адресной строке браузера, или другой IP-адрес, если вы изменили его. - Отключите настройку IPv6 DHCP и измените настройку на eui 64