Почему Android игнорирует мои изменения etc/hosts в браузере?

Я перемонтировал /sysкак rw, добавил одну запись etc/hosts(например 10.0.0.1 x.com www.x.com) и перезагрузил свое устройство.

После перезагрузки, если я проверю etc/hosts, запись в порядке. Если я пингую x.com, он пингует правильный IP-адрес, который я ввел.

Но если я открою веб-браузер (стандартный или Dolphin) и перейду к x.com, он перейдет к IP-адресу, который разрешает DNS.

Что происходит?

(Мой телефон — Nexus One, на котором установлена ​​специальная прошивка Cyanogen 7.1 на базе Android 2.3.7)

Обновление:
в приложении « LAN Droid10.0.0.1 » я тоже отлично получаю отредактированный адрес (так ). Похоже, что это только браузеры, где он ведет себя неправильно.

Просто любопытно: что, если вы сделаете это наоборот и вместо этого сделаете известный домен (или какой-то рекламный сайт) локальным хостом? Это не может загрузить это тогда? И действительно ли это такое короткое доменное имя, как в вашем примере? (Не очень забавный факт: Internet Explorer перестал принимать файлы cookie для двухбуквенных доменов . Конечно, это не имеет отношения к вашей проблеме, но, возможно , короткие доменные имена имеют другие странные ограничения в некоторых браузерах? Думаю, что нет.)
можете ли вы это сделать - ls -l /etc/hostsвозможно, проблема с разрешениями/правами собственности?
@ t0mm13b "-rw-r--r-- root root"
@ t0mm13b ты на высоте! В моем случае это были разрешения. chmod 644 /system/etc/hostsразобрался

Ответы (7)

Это звучит именно так , вплоть до работы пинга, но не браузера. Его возможное решение цитируется ниже:

Глупый вопрос, а вы файл редактируете на трубке или просто качаете файл, который выложили сюда? Тот, который вы разместили, находится в формате dos, поэтому в конце строки есть дополнительные символы перевода строки, которые могут запутать систему Linux.

Я не знаю, что вы использовали для его изменения, но вы можете проверить, какие символы перевода строки/новой строки он использует.

редактируется с помощью vi на эмуляторе терминала. попытался заставить ff=unixсейчас и set listувидеть любой разрыв строки DOS ... даже пошел дальше и запустил регулярное выражение, как если бы был какой-либо разрыв строки DOS, ничего не нашел.

Не уверен, поможет ли это, но у меня была проблема с игнорируемым файлом hosts, и ее решил парень в этой теме - ответ состоит в том, чтобы поместить пустую новую строку в конец файла.

Можете ли вы установить strace и сравнить результаты выполнения strace при пинге со strace в браузере, чтобы понять, почему запросы DNS обрабатываются по-разному?

Вы уверены , что не происходит постоянное кэширование? Какой TTL у записей вашего домена?

Android, похоже, не использует /etc/resolv.conf, но, возможно, есть некоторые свойства, которые определяют, какие приложения используют /etc/hosts, а какие идут непосредственно к поиску DNS. https://groups.google.com/forum/?fromgroups#!topic/android-platform/K2Wr4WaEneI

хорошие моменты. TTL составляет 1 час, значение по умолчанию для правила «уловить все», которое у меня есть. Поток g.groups в основном посвящен решению, какой сервер имен использовать во время DNS-запросов, эта логика происходит после etc/hosts. я надеюсь. Теперь я запущу strace (узнаю, как это сделать раньше) и отчитаюсь.

Если вы создаете файл hosts на компьютере с Windows, убедитесь, что каждая строка разделена только LF (не [CR][LF], только [LF]). Вы можете проверить это и создать правильные файлы hosts с помощью notepad++.

Я думаю, вам нужно сбросить DNS на вашем Android, проверьте этот вопрос https://stackoverflow.com/questions/2101762/android-flush-dns , особенно «зайдите в настройки -> приложения -> Сетевое расположение -> Очистить данные».

даже нет этой опции на Android 2.3.7. Но телефон с этим изменением на etc/hosts уже несколько месяцев. и я часто перезагружаю его ... я надеюсь, что DNS не кэшируется месяцами по какой-либо причине.

Я подозреваю, что браузер настроен на работу через прокси.

Возможно, вы сможете сказать, используя netstat -n или просмотрев /proc/net/tcp (или, что еще лучше, /proc/#browser_pid#/net/tcp), к какому адресу он на самом деле подключается. Если это не совпадает с адресом вашего веб-сайта, скорее всего, вы пользуетесь услугами посредника.

Обычно я бы сказал (но к вам это, увы, не относится):

Просто попробуйте перезагрузиться, если изменения останутся незамеченными, потому что экземпляр машины Dalvik или базовая система могли кэшировать прежний DNS-запрос.

Вы можете попробовать AdAway вручную добавить записи в файл hosts (просто проверить, делает ли он то же самое, что и вы вручную).