Android网络框架——iptables
Posted Chris_166
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android网络框架——iptables相关的知识,希望对你有一定的参考价值。
目录
二. iptables Processing Flowchart
一. iptalbes介绍
iptalbes是android netd最依赖的三大网络管控工具(iptables/tc/ip)之一,iptables与Kernel中的netfilter(防火墙)模块配合工作,主要是为netfilter设置一些过滤(filter)或网络地址转换(NAT)的规则,当Kernel收到网络数据包后,也会依据iptables设置的规则进行相应的操作 。iptables也可以理解为netfileter对应的应用层程序。
iptables有如下3大部分构成:
1. 四表(Table):iptables内部(其实是Kernel的netfilter模块)维护着四个Table,分别是filter(对应的内核模块为iptable_filter)、 nat(对应的内核模块为iptable_nat)、mangle(对应的内核模块为iptable_mangle)和raw(对应的内核模块为iptable_raw);
2. 五链(Chain):每个Table都定义了Chain,一个Table可以支持多个Chain且每个Table都会有默认的Chain, 用户可以自定义Chain,也可以修改Chain中的Rule。iptables中有5个Chain:PREROUTING(路由前),INPUT(输入),FORWARD(转发),OUTPUT(输出),POSTROUTING(路由后)。
3. 规则(Rule): Rule就是iptables工作的规则。首先,系统将检查要处理的数据包是否满足Rule设置的条件,如果满足则执行Rule中设置的目标(Target),否则继续执行Chain中的下一 条Rule。 iptables中的Rule有如下Target:
(1) ACCEPT:接收数据包;
(2) DROP:直接丢弃数据包。没有任何信息反馈给数据源端;
(3) RETURN:返回到调用Chain,略过后续的Rule处理;
(4) QUEUE:数据返回到用户空间去处理 ;
(5) REJECT:相比DROP而言,REJECT会发送反馈信息给数据源端,如主机不可达之类(icmp-host-unreachable)的信息。目前只有 INPUT、OUTPUT、FORWARD以及被这三个链调用的自定义链支持REJECT。
1.1 关系
1. 并不是每条Chain都能应用所有类型的Table,除了OUTPUT链能同时有四种表,其他链都只有两种或三种表。
2. 每条链中的规则根据不同的用途,就各自聚合成了不同的表;
3. 上图横向看,是链串联了表,纵向看,则是表串联了链。一般情况下没必要指定表,但没有指定表则默认使用filter表。没有指定链则指表内所有的规则链。
Table的处理优先级:raw>mangle>nat>filter。
Table | 说明 | Chain |
raw | 优先级最高,将命中规则的包跳过其它表的处理。一但用户使用了raw表,在某个链上raw表处理完后,将跳过NAT表和nf_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。RAW表可以应用在那些不需要做nat的情况下,以提高性能。 | PREROUTING |
OUTPUT | ||
mangle | 主要用来mangle数据包,我们可以改变不同的包及包头的内容,比如TTL,TOS 或 MARK。注意 MARK 并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规则或程序(如 tc)可以使用这种标记对包进行过滤或高级路由。 这个表有五个内建的链: PREROUTING , POSTROUTING , OUTPUT , INPUT和 FORWARD 。 PS:mangle 表不能做任何NAT,它只是改变数据包的 TTL,TOS 或 MARK,而不是其源目地址。 | PREROUTING:在包进入防火墙之后、路由判断之前改变包; |
POSTROUTING:在所有路由判断之后; | ||
OUTPUT:在确定包的目的之前更改数据包; | ||
INPUT:在包被路由到本地之后,但在用户空间的程序看到它之前改变包; | ||
FORWARD:在最初的路由判断之后、最后一次更改包的目的之前 mangle 包。 | ||
nat | 主要用处是网络地址转换。做过 NAT 操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或 Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表一个一个的被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因。 | PREROUTING :在包刚刚到达防火墙时改变它的目的地址,如果需要的话 |
OUTPUT:改变本地产生的包的目的地址 | ||
POSTROUTING:在包就要离开防火墙之前改变其源地址 | ||
filter | 专门过滤包的,内建三个链,可以毫无问题地对包进行 DROP、LOG、ACCEPT 和 REJECT 等操作。 | FORWARD链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包 |
INPUT 恰恰针对那些目的地是本地的包 | ||
OUTPUT 是用来过滤所有本地生成的包的 |
二. iptables Processing Flowchart
图3-1
图3-2
图3-3
上述三张图(图3-1/图3-2/图3-3)均来自网上,逐步具体到代码。由图3-3可知,
(1) 数据接收过程走的是1和2,即PREROUTING→INPUT;
(2) 发送过程走的是4和5,即OUTPUT→POSTROUTING;
(3) 转发过程是1、3和5,即PREROUTING→FORWARD→POSTROUTING。
INPUT还是OUTPUT是以设备层为中心来看的,如果是从设备层进入的然后发往上层,则会路径INPUT链;如果是要从设备层发出去的,则会路径OUTPUT链。
三. iptable命令使用
/ # iptables -help
iptables v1.6.1
Usage: iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
Commands:
Either long or short options are allowed.
--append -A chain Append to chain
--check -C chain Check for the existence of a rule
--delete -D chain Delete matching rule from chain
--delete -D chain rulenum
Delete rule rulenum (1 = first) from chain
--insert -I chain [rulenum]
Insert in chain as rulenum (default 1=first)
--replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
--list -L [chain [rulenum]]
...
-P --policy | 定义默认策略 |
-L --list | 表示列出(list)所有的规则 |
-A --append | 在规则列表的最后增加1条规则 |
-I --insert | 在指定的位置插入1条规则 |
-D --delete | 从规则列表中删除1条规则 |
-R --replace | 替换规则列表中的某条规则 |
-F --flush | 删除表中所有规则 |
-v | 表示详细展示信息 |
-Z --zero | 将表中数据包计数器和流量计数器归零 |
-N --new-chain | 自定义新的规则链 |
-X --delete-chain | 删除自定义链 |
-i --in-interface | 指定数据包从哪个网络接口进入 |
-o --out-interface | 指定数据包从哪个网络接口输出 |
-p ---proto | 指定数据包匹配的协议,如TCP、UDP和ICMP等 |
-s --source | 源地址或子网。指定数据包匹配的源地址 |
--sport | 指定数据包匹配的源端口号 |
--dport | 指定数据包匹配的目的端口号 |
-n | 使用数字格式显示IP和端口 |
-x | 显示计数器的标准数值。不加-x,则会自动转化成M,G;增加一个-x参数后则会使用B |
--line-number | 显示每条规则的在链中的行号 |
-m --match | 指定数据包规则所使用的过滤模块 |
// "使用-x参数" vs "不加-x参数"
3.1 filter表
这里以流量监控来介绍filter表的使用。当然封禁某些ip的访问也是filter表的典型应用。
流量监控涉及到的只有INPUT、OUTPUT、FORWARD链,前面介绍过这些链都是有filter表的,所以监控规则没有指定table的时候都是默认使用的filter表。
3.1.1 添加监控
3.1.1.1 基于端口
iptables -A INPUT -p tcp --dport 8080 // 监控接收数据包:目标端口是8080的输入流量
iptables -A OUTPUT -p tcp --sport 8080 // 监控发送数据包:来源端口是8080的输出流量
3.1.1.2 基于网卡
iptables -A INPUT -i wlan0 // 从wlan0节点接收
iptables -A OUTPUT -o wlan0 // 从wlan0节点发送
3.1.2 删除监控
3.1.2.1 删除统计数据
1. 重置所有配置(统计计数器清零)
iptable -Z INPUT // 重置所有输入
iptable -Z OUTPUT 重置所有输出端口
2. 删除链中的所有规则
iptable -F INPUT
3. 移除指定规则
iptables -D INPUT -p tcp --dport 8080
iptables -D OUTPUT -p tcp --sport 8080
4. 移除链上第n行规则
iptables -L INPUT -n -x -v --line-number // 查找INPUT链所有规则
iptables -D INPUT targeLine // 删除第targeLine行规则,targeLine是行号
3.1.3 查看监控
watch -n 1 iptables -L -nvx --line-number // 每1s查看一次
3.1.4 更多监控的例子
1. 统计IP为127.0.0.1,端口为80,协议为tcp的入网流量
iptables -A
INPUT
-d
127.0.0.1 -p tcp
–d
port 80
2. 统计IP为127.0.0.1,端口为80,协议为tcp的出口流量
iptables -A
OUTPUT
-s
127.0.0.1 -p tcp
–s
port 80
3. 如果当前设备是做为路由转发的,则需要将监控规则添加到FORWARD链中,因为这些流量包根本就不会走INPUT和OUTPUT链。
(1) 统计设备Device上转发的目的IP为192.168.0.10的入网流量
iptables -A FORWARD -d 192.168.0.10
(2) 统计设备Device上转发的ip为192.168.0.10的出口流量
iptables -I FORWARD -s 192.168.0.10
3.2 NAT表
3.2.1 SNAT
SNAT即源地址转换,能够让多个内网用户通过一个外网地址上网。
例如将192.168.0.2转换为公网10.162.0.100去访问外网
// iptables命令如下:
iptables –t nat –A POSTROUTING –s 192.168.0.0/24 –o eth1 –j SNAT
--to-source
10.162.0.100
// 如果外网
IP
地址不稳定则可使用
MASQUERADE
(动态伪装),能够自动的寻找外网地址并改为当前正确的外网IP地址
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
执行改规则的同时还要跟踪记录链接状态,后面收到回包的时候就可以根据这个链接状态来找到内网ip。
3.2.2 DNAT
DNAT即目地地址转换,则能够让外网用户访问局域网内不同的服务器。
// 目标地址192.168.10.6在
POSTROUTING
转换成61.240.149.149,需在网关上运行iptables命令如下:
iptables –t nat –A PREROUTING –i eth1 –d 61.240.149.149 –p tcp –dport 80 –j DNAT --to-destination 192.168.10.6:80
还可以使用REDIRECT单独进行端口转换将
// 80 端口的封包转递到 8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
3.3. raw表
Raw 表中的规则可以绕开其它表的处理。在 nat 表中,为了保证双向的流量都能正常完成地址替换,会跟踪并且记录链接状态。每一条连接都会有对应的记录生成。可以使用 cat /proc/net/ip_conntrack查看。
3.4 mangle表
// 所有从 eth0 接口进来的数据包的 ttl 值加 1
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 1
3.5 自定义链
iptables -L时的那个“target”列吗?为什么target列都是一些“动作”呢?这样的话为什么不把target写成“action”呢?其实就是因为target不一定是“动作”,它还可以是“自定义链”,当指定target为自定义链时,如果匹配上了,那么就会跳转到指定的自定义链中。
你可能会问,前面一直用默认链不也都能实现想要实现的功能吗?为什么还要自定义呢?
原因是当默认链中的规则非常多时,不方便我们管理。
想象一下,如果INPUT链中存放了200条规则,这200条规则有针对httpd服务的,有针对sshd服务的,有针对私网IP的,有针对公网IP的,假如我们突然想要修改针对httpd服务的相关规则,难道我们还要从头看一遍这200条规则,找出哪些规则是针对httpd的吗?这显然不合理。
所以,iptables中,可以自定义链,通过自定义链即可解决上述问题。
Ref
https://mp.weixin.qq.com/s/ZyZ_VpsewX5b2E-fwtGgsg
以上是关于Android网络框架——iptables的主要内容,如果未能解决你的问题,请参考以下文章
第八章 iptables 与firewalld 防火墙 第8天 7月27日
Android网络安全:Netfilter与iptables