Я хочу избежать цензуры со стороны моего местного мобильного провайдера (например, он блокирует imgur по какой-то неизвестной причине.
Скриншот (щелкните изображение, чтобы увеличить его)
Я почти уверен, что смогу обойти это, изменив свой DNS на Google DNS или OpenDNS, но я не совсем уверен, как это сделать на KitKat.
Info:
Device: Nexus 5
Android version: 4.4.2
Device status: rooted
Хорошо, прежде всего полное раскрытие : я являюсь автором приложения, которое теперь находится в магазине 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>
Приложение автоматически угадывает имя сетевого устройства и применяет эти команды каждый раз , когда активируется мобильная сеть.
ndc resolver setifdns <iface> <domains> <dns1> <dns2> ...
. Пример:ndc resolver setifdns eth0 "" 8.8.8.8 8.8.4.4
Я «решил» эту проблему, используя правило 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*
К сожалению, это может быть невозможно сделать прямо сейчас, однако можно попробовать 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 альтернативным решением для обхода цензуры ваших операторов?
Сегодня я столкнулся с той же проблемой, и благодаря Transfusion. Я попытался разработать приложение « DNS forwarder r», чтобы решить эту проблему. Он не меняет DNS-сервер в системе, а перенаправляет DNS-запросы на другой сервер. Этот обходной путь отлично работает на Kitkat (Nexus 5/4.4.3 и Moto Razr/CM11). Надеюсь, это может помочь и другим.
В настоящее время я не думаю, что есть какой-либо способ изменить ваш DNS на ваших мобильных данных. Но если ваш телефон рутирован, вы можете использовать такие приложения, как Set DNS .
Ирфан Латиф