回答:
OK、まず最初に完全な開示:私は、現在Google Playストアにあり、Android 4.4のモバイル接続のDNSを変更できるアプリの作成者です。アプリにはルートが必要で、数ドルの費用がかかり、オーバーライドDNSと呼ばれます。削除された回答について、明確に公開している限り、アプリにリンクしても問題ないと言われました。
今回のAndroid(4.4)のリリースで見つかった問題は、明らかにキャッシュの理由で、システムの動作が変更され、すべてのDNSクエリが次のシステムデーモンにリダイレクトされることですnetd
(4.4より前のAndroidネットワーキングに関連するプレゼンテーションへのリンクです)ただし、これらのトピックの一部をカバーしています)。
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>
アプリが自動的にネットワークデバイス名を推測し、これらはモバイルネットワークがアクティブになるたびにコマンドを適用します。
iptablesルールを使用してすべてのポート53接続を目的のDNSサーバーに転送することにより、この問題を「解決」しました。3Gへの接続中にDNS設定を変更しようとしたAndroid 4.4.2での私の経験は、レオが説明したとおりです。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すべてのアプリDO DNSルックアップNETDによっては/ dev /ソケット/ dnsproxyd Unixソケット経由。このスレッドは、システムプロパティが無視される理由も説明します。
これを元に戻すには、次の操作を行います
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を試すことは可能です。あなたが根ざしている場合、これは動作する可能性がありますが、保証はありません。
使用するのに適したDNSサービスは、GoogleのパブリックDNSサービスです。この種の問題については、ここでうまく機能する傾向があります。
これでもうまくいかない場合は、答えを探し続けてください。このようなものに適したサイトはXDA Developersです。彼らは、Androidに関して多くの答えを持っている傾向があります。
私はKitKat Cyanogenmod 11を使用しています。つまり、デフォルトでルート化されています。それにもかかわらず、私は失敗のみを報告することができます:
第一の方法:
を試してみる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番目の方法[a]:
私が試した別の方法は/system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf
、そこに修正されたものを修正することです(ただし、ネットワーク名とリゾルバの数は異なる可能性があることに注意してください)。成功なし。
2番目の方法[b]:
また、/system/etc/dhcpcd/dhcpcd.conf
DHCPネゴシエーションでリゾルバを受け入れるためのパラメータを削除しました。成功しません。
3番目の方法:
これまでのところ、少しうまくいく唯一のことは、「貧乏人VPN」、アプリ「SSHトンネル」、SOCKS4を使用することですが、それを使用しても良い結果が得られませんでした。
履歴書:
他の場所に設定されたDNS、またはネットワークがモバイルになるとすぐにすべてが転送される(ハイジャックされる)ようです。
それで、どうして?キャリアにネットワークの中立性を破壊するツールを提供する別の汚い方法ですか?
あなたの場合、あなたの質問はそのためでした。SSHTunnelがキャリア検閲を回避するための代替ソリューションである場合、試してみるSSHがありますか?
今日、同じ問題に遭遇しました。輸血のおかげです。私はそれを解決するために「DNS forwarde r」というアプリを開発しようとしました。システム上のDNSサーバーは変更しませんが、DNSクエリを別のサーバーに転送します。この回避策は、Kitkat(Nexus 5 / 4.4.3およびMoto Razr / CM11)でうまく機能します。他の人にも役立つことを願っています。
ndc resolver setifdns <iface> <domains> <dns1> <dns2> ...
。例:ndc resolver setifdns eth0 "" 8.8.8.8 8.8.4.4