Android网络框架——iptables

Posted Chris_166

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android网络框架——iptables相关的知识,希望对你有一定的参考价值。

目录

一. iptalbes介绍

1.1 关系

二. iptables Processing Flowchart

三. iptable命令使用

3.1 filter表

3.1.1 添加监控

3.1.2 删除监控

3.1.3 查看监控

3.1.4 更多监控的例子

3.2 NAT表

3.2.1 SNAT

3.2.2 DNAT

3.3. raw表

​编辑

3.4 mangle表

3.5 自定义链

Ref


一. 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 –dport 80

2. 统计IP为127.0.0.1,端口为80,协议为tcp的出口流量

iptables -A OUTPUT -s 127.0.0.1 -p tcp –sport 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的主要内容,如果未能解决你的问题,请参考以下文章

Android网络框架——iptables

第八章 iptables 与firewalld 防火墙 第8天 7月27日

Android网络安全:Netfilter与iptables

第二十五天 IPtable基础框架扩展匹配及防火墙原理iptable入门

iptables

iptables系列之基础原理