プロセスID/iptables方式
低負荷・アプリ別・root必須
・DroidWall https://play.google.com/store/apps/details?id=com.googlecode.droidwall.free&hl=ja
アプリごとにiptables(AndroidOSのベースのLinuxに組み込まれているファイアーウォール)でフィルタする。
iptableを制御するためにroot化が必要で、アプリのIDからフィルタルールを動的生成するために、常駐して実行中アプリを監視する必要がある。原理的に起動直後の通信を取りこぼす場合がある。
フィルタリング自体はAndroid自体アプリではなく、OS側が行なってくれるので、CPU負荷は少ない。
接続先や内容でフィルタすることも不可能ではないが、iptablesのルール数・ルールの表現力的に面倒。
最近の機種はiptablesへのアクセスをSelinuxで(rootでも)禁止しているものがあるため、単なるroot化でなくブートローダーアンロック・カーネルパッチなどが必要なことがある。
HTTPフィルタプロキシー方式
高負荷・URL別・一部はroot要求
・FilterProxy https://play.google.com/store/apps/details?id=com.googlecode.droidwall.free&hl=ja
・AdBlock Plus (android 3.0以前) https://adblockplus.org/en/android-about
端末内にHTTPプロキシを作成・設定してブロックする。機種によっては全アプリに対してAPNの共通プロキシ設定ができるものがあるが、それ以外ではroot化が必要。HTTPを通さない他のプロトコルの通信に効果はない。
HTTPのレイヤで動くので接続先ホスト名やURLのパス、ファイル内容でもフィルタすることが可能。(ただしHTTPSはホスト別でしかできない。)プロキシサーバーとして動く常駐アプリが必要。HTTPを解釈する必要があるので他よりも高負荷。
原理的には、アプリの通信をデフォルトでブロックしたり、アプリ別ルールも作れるはずだが、今のところそのような実装はなさそう。
hostsファイル方式
負荷なし・ホスト別・root必須
・AdAway https://f-droid.org/repository/browse/?fdid=org.adaway
ブロックしたいホスト名のIPアドレスを127.0.0.1などに上書きするhostsファイルを利用する。
事前にホスト名さえわかっていればプロトコルやアプリによらず、そのホスト名での全ての通信を遮断できる。
逆に、AdAway対策にホスト名を使わず、IPアドレスがハードコードされたアプリやホスト名が変化するような場合には効果がない。アプリ別のルールを設定することは出来ず、未知の新しいアプリをデフォルトで遮断することは出来ない。
OS側が行なっているドメイン名解決を上書きするだけなので、アプリが常駐して負荷が増加することもなく、実際の通信にアプリが関与することはない。
カスタムVPN方式
中負荷・アプリ別・root不要
https://play.google.com/store/apps/details?id=com.netspark.firewall&hl=ja
https://play.google.com/store/apps/details?id=app.greyshirts.firewall&hl=ja
Android4.0で導入されたカスタムVPN実装用APIを利用して、全てのアプリの通信を中継する。
ソケット単位で制御できるので、アプリ別・IPアドレス・ポート別でフィルタ出来る。ただしホスト名でフィルタは出来ない。
なお、ホスト名でフィルタできるというNoRootファイアウォールはIPアドレスからホスト名を逆引きしているため、正引き(見かけのドメイン名)ではフィルタ出来ない。また接続の度に逆引きするため接続開始時の遅延が大きい。
サービスとして常駐が必要だが、ソケットを開く時点で切断できるため取りこぼしがない。送受信の全てがAndroidアプリを経由するため、HTTPプロキシ程ではないにせよ、通信量に応じて負荷は増える。
原理的には通信の中身を読めば、(CPU負荷が大きいが)URLでもフィルタ出来るだろうが、そのような実装はまだないようだ。
(なおVPN利用中はテザリングができなくなる現象をAndroid4.3+norootファイアーウォールで確認)
ブラウザ拡張・userscripts方式
低負荷・一部のブラウザ
FirefoxやOpera、Sleipnirなどのブロック拡張
javascriptでHTMLの要素単位でブロックする。ブラウザに表示されるものであればなんでも自由に制御できる。
当然だが他のアプリに対しては機能しない。
当然そのブラウザ内でしか機能しないので、他アプリの通信を制御することは出来ない。
カスタム外部プロキシ
負荷なし・一部機種でroot化必須
自宅サーバーなどにフィルタを組み込んだHTTPプロキシを立てるなどして、スマートフォンの外でフィルタする
HTTPプロキシを外に置くためCPU負荷は無いが、HTTPにしか効かない。
副次的に圧縮機能(Operaの高速化機能など)を付けることが出来る。
カスタムDNSサーバー
負荷なし・WiFiならroot化不要・3G/LTEなら必須
hostsファイルの代わりに、DNSサーバーでドメイン別にフィルタする。
自作のWiFi AdBlockerはこのタイプ。実際の通信を中継する必要がないため、負荷も増えない。
通信機能が不要なアプリをアプリ単位でブロックするならカスタムVPN方式(Android4.0以降)。root化可能ならhostsファイルを追加することで大抵の不要な通信をブロックできるだろう。 個人的には、hostsファイルだとリスト化が不十分なのでカスタムDNSサーバーを使っている。
念のため、いずれの方式も、利用している通信ブロックアプリ自体が通信を傍受することが原理的に可能なので、通信ブロックアプリを使用中は重要な通信にはHTTPSなどで暗号化しておく必要がある。