android应用上网屏蔽

Android 4.3
为了实现某个应用的上网控制,需要为Setting应用添加控制接口。
先说下原理,使用iptables控制应用uid访问网络。但是iptables命令的执行必须是root权限,也就是说不能在systemserver相关的系统服务中直接执行该命令,这个进程并不是root进程,执行命令不会生效。这样就有以下两个方案,简要说一下:
1 . 原生方案:
Android系统的防火墙或是带宽控制都是NetworkManagementService通过NativeDaemonConnector的excute()方法向Netd发送命令,Netd中CommandListener.cpp中持有该连接的socket进行通信,也就是说netd具有root权限,可以执行iptables指令,具体在init.rc也能看到netd的启动:

service netd /system/bin/netd
    class main
    socket netd stream 0660 root system
    socket dnsproxyd stream 0660 root inet
    socket mdns stream 0660 root system
socket <name> <type> <perm> [ <user> [ <group> ] ]
可见其user 为 root。
具体的init.rc解析见:http://www.cnblogs.com/lxjshuju/p/6915468.html

这样就可以在NetworkManagementService中添加接口,在netd中实现。
正常操作是在Firewall模块中实现对应cmd。但是Firewall可能是disable的,所以这个方案用起来不太方便。启用防火墙要更改访问规则,因为默认所有的应用是不能上网的:

int FirewallController::enableFirewall(void) {
    int res = 0;

    // flush any existing rules
    disableFirewall();

    // create default rule to drop all traffic
    res |= execIptables(V4V6, "-A", LOCAL_INPUT, "-j", "DROP", NULL);
    res |= execIptables(V4V6, "-A", LOCAL_OUTPUT, "-j", "REJECT", NULL);
    res |= execIptables(V4V6, "-A", LOCAL_FORWARD, "-j", "REJECT", NULL);

    return res;
}

所有的input、output及forward都reject了。所以启用防火墙还得再配置。
为什么会这样,科普下防火墙策略:
1)黑名单策略:
先允许所有应用都能上网,然后配置黑名单禁止
2)白名单策略:
先禁止所有应用上网,然后配置白名单允许
android采用了白名单策略。
这个方案网上已经有了很多实现,这里不再详述:
https://blog.csdn.net/xiaoxsen/article/details/78034353
https://book.2cto.com/201405/43233.html
2 . 其他方案:
写一个bindserver及client,生成可执行程序cmd。
这个程序在init.rc中启动以root账户启动

service cmd /system/bin/cmd
   class main
   user root

cmd程序的server端执行 popen(input,“r”),input传入iptables指令。
具体的binder c++版不再详述。
执行iptables指令如下:

String inputReject = "iptables -A INPUT -m owner --uid-owner " + applicationInfo.uid +" -j REJECT";
String outputReject = "iptables -A OUTPUT -m owner --uid-owner " + applicationInfo.uid +" -j REJECT";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值