android系统 使用iptables 设置网络访问规则,(设置网址访问黑名单,白名单)

522 阅读1分钟

1.NetworkManagementService.java

系统源码中本身有相关的防火墙设置,通过iptables实现

image.png

调用setFirewallEnabled() 时enable防火墙,会阻止所有网络访问

调用方法:

在具有系统权限的地方

import android.os.INetworkManagementService;
final INetworkManagementService netManager = INetworkManagementService.Stub
                            .asInterface(ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
netManager.setFirewallEnabled(true); 即可
有些网络配置不能放在main 线程,需开个子线程
Runnable runnable=new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
                   try {
                        netManager.enableUrl("http://www.baidu.com");
                        netManager.enableUrl("http://www.huayinghealth.com");
                        //netManager.setFirewallEgressSourceRule("120.76.47.120",false);
                        Log.d("wzb","set youku.com true");
                    } catch (RemoteException e) {
                        // ignored
                        Log.d("wzb","set youku.com err");
                    }   
        }
    };

2.iptables具体实现地方

alps/system/netd/

FirewallController.cpp

image.png 仿照系统的enablefirewall函数

写一个enbale dns ,和enable url函数

image.png 注意:需要enable dns的port 53, web的port 80

3.黑名单实现原理:

直接将域名ip地址加入iptables drop规则即可

4.白名单实现原理:

先setenablefirewall,将所有网络禁掉

然后enbale dns port53,打开dns解析功能

enable web的port 80

将白名单域名的dns解析后的ip地址加入iptables accept规则.这样就可以实现白名单

image.png 5.mConnector.execute() 是在system/netd/server/CommandListener.cpp里面解析的

image.png

image.png 实现enable dns 和url