1.NetworkManagementService.java
系统源码中本身有相关的防火墙设置,通过iptables实现
调用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
仿照系统的enablefirewall函数
写一个enbale dns ,和enable url函数
注意:需要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规则.这样就可以实现白名单
5.mConnector.execute() 是在system/netd/server/CommandListener.cpp里面解析的
实现enable dns 和url