Как изменить DNS мобильных подключений на Android KitKat?

Я хочу избежать цензуры со стороны моего местного мобильного провайдера (например, он блокирует imgur по какой-то неизвестной причине.

Скриншот
Скриншот (щелкните изображение, чтобы увеличить его)

Я почти уверен, что смогу обойти это, изменив свой DNS на Google DNS или OpenDNS, но я не совсем уверен, как это сделать на KitKat.

Info:
Device: Nexus 5
Android version: 4.4.2
Device status: rooted

Ответы (6)

Хорошо, прежде всего полное раскрытие : я являюсь автором приложения, которое теперь находится в магазине Google Play и которое позволяет вам изменять DNS для любого мобильного подключения на Android 4.4. Приложение требует root , стоит пару баксов и называется Override DNS . В уже удаленном ответе мне сказали, что справедливо ссылаться на мое приложение, если я ясно его раскрываю.

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

Метод getprop/ setpropбольше не работает. Эти значения при изменении просто игнорируются netdдемоном.

Необходимо напрямую общаться с демоном через /dev/socket/netdсокет. В Android теперь есть инструмент, ndcкоторый выполняет именно эту работу.

Синтаксис для вещей, связанных с DNS, таков:

# ndc resolver flushif <iface>
# ndc resolver flushdefaultif
# ndc resolver setifdns <iface> <domains> <dns1> <dns2>
# ndc resolver setdefaultif <iface>

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

Правильный синтаксис setifdns: ndc resolver setifdns <iface> <domains> <dns1> <dns2> .... Пример:ndc resolver setifdns eth0 "" 8.8.8.8 8.8.4.4
@Christiand'Heureuse, вы правы, я обновил ответ, спасибо.

Я «решил» эту проблему, используя правило iptables для переадресации всех соединений через порт 53 на предполагаемый DNS-сервер; мой опыт на Android 4.4.2 с попыткой изменить настройки DNS при подключении к 3G был точно таким, как описал Лео; незнание значений в getprop |grep dns[0-9]\]: и dhcpd.conf.

iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 8.8.8.8:53

Причина описана здесь: http://forum.xda-developers.com/showpost.php?p=44722857&postcount=6 Все приложения выполняют поиск DNS через netd через unix-сокет /dev/socket/dnsproxyd. В этом потоке также описывается, почему системные свойства игнорируются.

Чтобы отменить это, сделайте

iptables -t nat -L OUTPUT -n -v --line-numbers

, найдите номер строки, соответствующий udp dpt:53 to:xxx.xxx.xxx.xxx:53, и выполните

iptables -t nat -D OUTPUT *linenumber*
Спасибо! Кроме того, краткое изложение причины: Google играет в гонку вооружений с блокировщиками рекламы. они пытались отключить текущие средства, блокировщики рекламы работали, и блокировщики рекламы переместились на другой, в то время как все пользователи (независимо от того, используют блокировщик рекламы или нет) будут навсегда раздражены этим ходом Google. …Я думал, что все уже знают, что бороться с блокировщиками рекламы — глупость. глупый гугл. (также приложение с открытым исходным кодом AFWALL — удобный способ легко добавить это пользовательское правило)
Вики AfWall+ о том, как применить пользовательское правило iptables, подобное этому

К сожалению, это может быть невозможно сделать прямо сейчас, однако можно попробовать DNS Changer . Это может сработать, если у вас есть root-права, но нет никаких гарантий.

Хорошей службой DNS для использования будет публичная служба DNS Google. Это, как правило, работает очень хорошо для таких проблем прямо здесь.

Если ничего из этого не работает, продолжайте искать ответы. Хороший сайт для таких вещей — XDA Developers . У них, как правило, есть много ответов на вопросы об Android.

У меня стоит KitKat Cyanogenmod 11, то есть у меня рут по умолчанию. Несмотря на это, я могу сообщить только о неудаче:

1-й метод:

Когда я пытаюсь adb shellс

setprop net.rmnet0.dns1 208.67.222.222
setprop net.rmnet0.dns2 208.67.222.222
setprop net.rmnet1.dns1 208.67.222.222
setprop net.rmnet1.dns2 208.67.222.222
setprop net.rmnet2.dns1 208.67.222.222
setprop net.rmnet2.dns2 208.67.222.222
setprop net.dns1 208.67.222.222
setprop net.dns1 208.67.222.222

а затем проверьте, какой IP-адрес hjfdkhfjkyuiwnwetbyebvtwgqwdi.tk разрешает... Я получаю ответ NXDOMAIN, что означает, что он не пришел от сервера имен OpenDNS, который я установил (который вернет ответ с альтернативным IP-адресом, чтобы служить вам добавляет).

При выполнении

getprop | grep dns

Я бы видел только то, что я настроил. Однако при переключении с WiFi на мобильную связь (3G или 4G/LTE) я вижу IP-адреса, которые я распознаю как назначенные моему оператору мобильной связи. Такие приложения, как «DNSwitch» или «DNS Changer», могут автоматически переустанавливать эти преобразователи при изменении сети. Однако то, что getpropсообщает мне, все еще не то, что действительно решает.

2-й способ [а]:

Другой способ, который я пробовал, - это изменить /system/etc/dhcpcd/dhcpcd-hooks/20-dns.confнабор фиксированных вещей (но имейте в виду, что сетевые имена и количество распознавателей могут отличаться). Безуспешно.

2-й способ [б]:

И в /system/etc/dhcpcd/dhcpcd.confя удалил параметр принимать резолверы при согласовании DHCP. Тоже никакого успеха.

3-й способ:

Пока что единственное, что немного сработает, это использование «VPN для бедняков», использование приложения «SSH Tunnel», использование SOCKS4, но с его помощью я не получил хорошего результата.

Продолжить:

Похоже, либо DNS установлен в другом месте, либо все перенаправлены (захвачены), как только сеть становится мобильной.

Итак, почему? Это еще один грязный способ предоставить операторам связи инструмент для разрушения сетевого нейтралитета?

В вашем случае ваш вопрос был из-за этого. Есть ли у вас SSH, чтобы попробовать, является ли SSHTunnel альтернативным решением для обхода цензуры ваших операторов?

Я нашел способ обойти блокировку, но это громоздко и в каждом конкретном случае. У меня root, поэтому у меня есть доступ к файлу hosts. Затем я искал прямые IP-адреса imgur, а затем вручную вводил эти значения в файл hosts. Проблема решена на данный момент.

Сегодня я столкнулся с той же проблемой, и благодаря Transfusion. Я попытался разработать приложение « DNS forwarder r», чтобы решить эту проблему. Он не меняет DNS-сервер в системе, а перенаправляет DNS-запросы на другой сервер. Этот обходной путь отлично работает на Kitkat (Nexus 5/4.4.3 и Moto Razr/CM11). Надеюсь, это может помочь и другим.

Это действительно работает, не знаю, почему за тебя проголосовали

В настоящее время я не думаю, что есть какой-либо способ изменить ваш DNS на ваших мобильных данных. Но если ваш телефон рутирован, вы можете использовать такие приложения, как Set DNS .

К сожалению, похоже, что это приложение не поддерживает Android 4.3 и выше :( Взято из описания приложения: «ПОЖАЛУЙСТА, НЕ УСТАНАВЛИВАЙТЕ НА ANDROID 4.3 НА МОМЕНТ, ЕСТЬ ПРОБЛЕМЫ, СВЯЗАННЫЕ С СПОСОБОМ ОБРАБОТКИ DNS В ЯДРЕ. Я СНЯЛ ЕГО С РЫНКА ДЛЯ УСТРОЙСТВ 4.3».
В вашем вопросе говорится, что вам это нужно для Android KitKat, который является Android 4.4. *, тогда как Android 4.3 - это Jellybean.
Я уже открывал страницу приложения в плеймаркете на своем устройстве, а там прямо вверху написано: «Ваше устройство несовместимо с этой версией». Так что я уверен, что проблема сохраняется от версии 4.3 до KitKat.
Согласно часто задаваемым вопросам, рекомендации приложений на самом деле не являются частью этого сайта. Я ответил на вопрос, может ли Android сделать это нативно. Рекомендую поискать в Play Store самостоятельно.
Подсказка: при посещении страницы приложений в AppBrain перечислены несколько альтернатив (справа вверху 4). Однако обратите внимание, что для большинства решений в этом секторе требуется root-доступ.