Я пытаюсь заставить Android-устройство использовать DNS-сервер в локальной сети для разрешения имени хоста сервера в качестве локального адреса, но он не работает.
я каким-то образом обманом(*) маршрутизатор в передаче по локальному IP-адресу DNS-сервера (192.168.1.99), когда он раздает DHCP-адреса. С устройства под управлением Windows 10 я вижу, что это так, потому что, когда я смотрю в разделе Сетевые свойства, я вижу, что он использует первичные и вторичные IP-адреса DNS, которые я хочу, и это правильно разрешает локальные серверы на локальные адреса из мировых видимых имен хостов.
(*)в принципе, маршрутизатор не позволил бы мне установить DNS-серверы, поле радио не будет выбирать. Проверка javascript позволила мне установить точку останова, чтобы я мог обойти логику, которая, по-видимому, позволяет устанавливать DNS-сервер, если у вас есть статический IP-адрес, которого у меня нет (и радио-блок для установки статического IP-адреса даже не может быть выбран в любом случае!). Когда я отправил форму, она появилась чтобы изменения не приняли, все же некоторые устройства теперь получают правильный DNS-сервер! Update: я нашел другой маршрутизатор, который не требовал никаких трюков, чтобы заставить его пройти DNS-серверы при назначении адресов DHCP, но Android еще не использует возвращаемый DNS-сервер!
но на Android он не работает, он разрешает имя хоста в мире видимый IP-адрес, предполагая, что он не использует DNS-сервер, который DHCP раздает. (И необъяснимо, доступ к серверам через внешний IP-адрес перестал работать, что и послужило причиной необходимости получения имени хоста для разрешения на внутренний адрес!)
я использую Termux чтобы попытаться устранить проблему, и обнаружил, что getprop net.dns1
и getprop net.dns2
возвращенные IPv6 адреса, дальнейшее копание показало эти адреса в маршрутизаторе как DNS-адреса, предоставленные провайдером. Поэтому я подумал, что, возможно, по какой-то причине трюк, который я использовал на маршрутизаторе, не работал Андроид.
поэтому я попытался вручную настроить 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, он говорит: "сеть недостижимый."If I run ifconfig wlan0
и route
в termux выход выглядит идентичным выходу, когда я устанавливаю настройки IP для настройки через DHCP. Однако,getprop net.dns1
по-прежнему возвращает IPv6-адрес, поэтому теперь я не уверен, что верю, что команда возвращает действительные данные. Update: хорошо, на самом деле есть четыре DNS-адреса: первые два-это IPv6-адреса от моего провайдера, которые каким-то образом протекают, а последние два-это два IPv4-адреса, которые я установил.
это, кажется, характерно для более новые версии Android, более старое устройство Android 4.3 не имеет никаких проблем (ему даже не нужна статическая конфигурация IP для правильного разрешения имен хостов).
какие другие вещи я могу попытаться устранить эту проблему, и получить DNS работает должным образом?
обновление: я нашел этот пост который относится к случаю, когда:
- есть два DNS-сервера, локальный IPv4 один (192.168.1.230) и провайдер IPv6 один (2a01:e00::1)
- IPv4 DNS сервер знает о локальном домене, IPv6-нет.
- Android, случается, Использовать IPv6 DNS-сервер, и поэтому не может разрешить хосты в локальной сети.
это соответствует тому, что я вижу с моей конфигурации. Но тогда плакат утверждает ,что" это работает как задумано", с которым у меня есть проблемы. Затем он перечисляет четыре возможных решения:
- добавление IPv6-адреса на локальный DNS-сервер и настройка маршрутизатора для объявления этот адрес как IPv6 DNS-сервер, если это возможно. это не сработает, потому что маршрутизатор не позволит мне указать IPv6-адрес для DNS.
- настройка локальных имен на маршрутизаторе, если это возможно. я не уверен, что это означает. Сам маршрутизатор не предоставляет возможности DNS
- использование общедоступного домена, чтобы маршрутизатор ISP мог разрешать внутренние имена. я не уверен, что это значит - как бы общественным достоянием быть в состоянии обратиться к внутреннему IP-адресу???
- отключение IPv6 DNS (или отключение IPv6) на маршрутизаторе. маршрутизатор не предоставляет какой-либо метод для отключения или иным образом настроить что-либо в отношении IPv6
так что я все еще застрял с системой, которая эффективно DOA, потому что некоторые устройства в сети не могут видеть ресурсы, необходимые для того, чтобы функционировать.
обновить: я создал отдельный сервер DHCP и отключен один на маршрутизаторе, но устройство Android все еще получает два DNS - сервера IPv6 в своем списке-похоже, что есть задержка на секунду или две после того, как сервер DHCP сообщил, что DNS-серверы появляются до появления IPv6, и они всегда вставляешь перед сервер адресам. Я попытался увеличить количество DNS-серверов, о которых сообщается, чтобы попытаться заполнить любую таблицу, которую может иметь Android, но даже с 32 другими DNS-серверами вставляет еще два в начале всего 34! Как Android получает эти адреса и как я могу заставить его сбить его?! Это сводит меня с ума!
Update: я нашел приложение под названием "DNS Changer", которое, как представляется, решить эту проблему, хотя у меня есть некоторые сомнения относительно того, может ли это быть больше, чем обходной путь, пока реальное исправление не может быть найдено. Похоже, что он создает VPN, но я хотел бы узнать больше, как это работает. Это маршрутизация трафика вне моего брандмауэра? К где? Мне интересно, маршрутизирует ли он все, потому что тест скорости на мой собственный сервер дает около 20% средней скорости передачи по сравнению с тем, если я запускаю тот же тест с IP-адресом вместо имени хоста. Я использовал другое приложение, которое сообщает о 7 различных именах внешних хостов и утверждает, что вся передача прошла через каждый из них. Кроме того, этот обходной путь отказывает, если сеть выключается!
обновление: я также вижу эту проблему в корневом устройстве работает Android 5.1 ... Я установил статический IP-адрес и DNS, указывающий на внутренний сервер, и даже зашел так далеко, чтобы использовать setprop
установить каждый DNS-сервер на IP-адрес внутреннего DNS-сервера... тем не менее, в termux, когда я использую nslookup, он все еще настаивает на использовании 8.8.8 для поиска имени. Как заставить Android использовать указанный DNS-сервер?