iptables是android上可用的网络管控工具,它与kernel中的netfilter配合,为netfilter设置一些过滤规则,当kernel收到网络数据包后,依据iptables设置的规则进行相应的处理。
iptables包括5条链表,分别为:PREROUTING(路由前),INPUT(输入),FORWARD(转发),OUTPUT(输出),POSTROUTING(路由后)。
如果我要管控外部对本机的网络访问,就管控INPUT这条链路;如果要管控本机对外部的网络访问,就管控OUTPUT这条链路。
规则主要有如下几种:
(1)ACCEPT:接收数据包
(2)DROP:丢弃数据包,不给任何回应
(3)REJECT:拒绝访问但会返回信息
比如我如果禁止外部所有对本机的网络访问,可设置如下规则:
iptables -P INPUT DROP
如果我禁止本机对外部的所有网络访问,可设置如下规则:
iptables -P OUTPUT DROP
如果要允许外部对本机指定端口的访问,可如下设置规则(-A是规则列表最后添加一条规则):
允许外部使用udp协议访问本机端口8001:
iptables -A INPUT -p udp --dport 8001 -j ACCEPT
允许外部使用tcp协议访问本机端口8000,8001(多个端口需要添加 -m multiport ):
iptables -A INPUT -p tcp -m multiport --dport 8000,8001 -j ACCEPT
如果要允许本机指定端口访问外部网络,可如下设置规则:
允许本机8000端口使用tcp协议访问外部网络:
iptables -A OUTPUT -p tcp --sport 8000 -j ACCEPT
允许本机8000,8001端口使用udp协议访问外部网络:
iptables -A OUTPUT -p udp -m multiport --sport 8000,8001 -j ACCEPT
如果要删除某条规则,使用-D参数,如下:
iptables -D OUTPUT -p tcp --sport 8000 -j ACCEPT
iptables -D OUTPUT -p udp -m multiport --sport 8000,8001 -j ACCEPT
如果要全部放开INPUT和OUTPUT的网络访问,可设置如下:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
android可在系统设置中添加一个“防火墙”的选项,之后通过操作选项开关在代码中调用iptables命令通过设置如上面的规则实现对网络访问的管控。(可能需要系统root)。