详解Android利用Iptables实现网络黑白名单(防火墙)

  

  

为了使读此简笔的人对Iptables有一个简单的了解,此处强行百度了一波概念,如果想深入的了解Iptables的各种配置规则和内核对其的管理运行机制请自行www.baidu.com,这些并不是本简笔的目的所在。

  

,闲言少叙,开始正文

  

——在以下概述来自百度,读者可酌情跳过

  

iptables的前身叫ipfirewall(内核1.倍时代),是从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2. x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

  

他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做netfilter。(网络过滤器)

  

<强>——在以下是本文所关注的重点

  

  

因为考虑到一些权限的问题所以在实现方法上采用的是创建一个systemserver来运行这些方法。并提供出经理到三方应用,这样在调用时可以排除一些权限的限制。同时本文只是做一个简单的参考概述,所以在后文中只提供了增加黑白名单的方法和iptables规则,并没有提供相应的删除规则等,原理类似大家可自行补充添加。

  

<强> 2.1,创建systemserver

  

2.1.1,在/系统/sepolicy service.te中添加

        类型fxjnet_service、system_api_service system_server_service service_manager_type;      2.2.2

,在/系统/sepolicy service_contexts中添加如下,

        fxjnet u: object_r: fxjnet_service: s0      

2.2.3,在框架/基地/核心/java/android/内容/Context.java中添加

  

也可以不添加这个,只不过为了后面调用方便所以添加了。如果跳过此步,那么后面出现Context.FXJNET_SERVICE的地方都用字串代替即可。

        公共静态最终字符串FXJNET_SERVICE=癴xjnet”;      

2.2.4,在/框架/基地/核心/java/android/app/SystemServiceRegistry.java的静态代码块中添加如下代码注册服务。

        registerService(上下文。FXJNET_SERVICE FXJNETManager.class,   新的CachedServiceFetcher () {   @Override   公共FXJNETManager createService (ContextImpl ctx) {   内部b=ServiceManager.getService (Context.FXJNET_SERVICE);   IFXJNETService服务=IFXJNETService.Stub.asInterface (b);   返回新FXJNETManager (ctx、服务);   }});   之前      2.2.5

),在框架/基地/服务/java/com/android/server/SystemServer.java中添加如下代码,将服务加入systemserver中。

        ServiceManager.addService(上下文。FXJNET_SERVICE,新的FXJNETService ());   之前      2.2.6

。, AIDL文件

        包android.os;   接口IFXJNETService {   空白addNetworkRestriction (ListipName, int类型);   }   之前      

2.2.7,提供给外部的FXJNETManager

        包android.app;   进口android.os.IFXJNETService;   进口android.os.RemoteException;   进口android.content.Context;   公开课FXJNETManager {      IFXJNETService mService;   公共FXJNETManager(上下文ctx IFXJNETService服务){   mService=服务;   }   公共空间addNetworkRestriction (ListipName, int类型){   尝试{   mService.addNetworkRestriction (ipName、类型);   }抓住RemoteException (e) {   }   }//addNetworkRestriction结束   }      之前      

2.2.8,系统服务即AIDL的实现服务器

        包com.android.server;      进口android.os.IFXJNETService;   进口java.io.File;   进口java.io.FileOutputStream;   进口java.io.IOException;      公共类FXJNETService IFXJNETService延伸。存根{   最终文件文件=新文件(“/数据/fxj/?“firewall.sh”);/* *   *增加{网络IP访问}黑白名单数据   */公共空间addNetworkRestriction (List

详解Android利用Iptables实现网络黑白名单(防火墙)