Я пытаюсь заставить устройство 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-сервер?