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

指定数据包规则所使用的过滤模块

-j

1. -j后面可以是指定要进行的处理动作(Action)。

常用的ACTION:

(1) DROP:丢弃

(2) REJECT:拒绝

(3) ACCEPT:接受

(4) SNAT:基于原地址的转换

(5) DNAT

(6) TOS

...

2. 也可以是一条自定义的链。

// "使用-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. 重置所有配置(统计计数器清零)

iptables -Z INPUT // 重置所有输入

iptables -Z OUTPUT 重置所有输出端口

2. 删除链中的所有规则

iptables -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系列之基础原理