Android网络框架——策略路由与常用命令
Posted Chris_166
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android网络框架——策略路由与常用命令相关的知识,希望对你有一定的参考价值。
目录
一. 策略路由
传统路由:在android4.4之前是使用的传统路由,即只使用了一张路由表。
策略路由:从Android5.0之后开始可以支持多网络,即在同一时间下,Android允许多网络类型连接,每个网络有自己的一套DNS、网关、路由表等。这使得功能更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小,应用或IP源地址等属性来选择转发路径。一般的路由以目的地址作为识别与区分的标识。
1.1 默认路由表
系统最多可支持255张路由表:系统默认是有维护4张路由表的,可以自定义1~252张路由表。
id | 表 | 说明 |
0 | 系统保留表 | |
253 | default table | 没特别指定的默认路由都放在该表。 该路由表是一个空的路由表,正常情况下保持该路由表为空即可 |
254 | main table | 没指明路由表的所有路由放在该表。 如果添加路由时没有指定该路由所属的路由表,则这条路由会被添加到main路由表中。配置好网卡的网络设置系统就会自动生成main路由表。 |
255 | local table | 保存本地接口地址,广播地址、NAT地址。由系统维护,用户不得更改 |
在策略路由中,路由表可以用一个名字表示,同时也可以使用一个ID表示,路由表和ID的映射关系表储存在(845平台)/data/misc/net/rt_tables文件中。
使用ip route命令操作路由表。
例如查看路由表的命令:
Shell ip route show table 表名 ip route show table 表id |
1.2 默认规则
rule | 说明 |
|
0 |
| |
32766 |
| |
32767 |
|
如下图所示,这里的rule 32766就被覆盖了。
Eg:以系统默认的rule 0,32766,32767为例。
在linux系统中是按照rule的优先级顺序依次匹配。假设系统中只有优先级为0,32766及32767这三条规则。那么系统首先会根据规则0在local table里寻找路由,如果目的地址是本网络,或是广播地址的话,在这里就可以找到匹配的路由;如果没有找到路由,就会匹配下一个不空的规则,即 rule 32766,那么将会在main table里寻找路由;如果没有找到匹配的路由,就会继续匹配rule 32767,即寻找默认路由表;如果失败,路由将失败。
1.3 路由
典型的路由条目包括了src IP,dest IP,Gateway IP,scope,dev和type六个要素。
1. Gateway IP:在配置路由的时候指定的via后面的地址。说明这条路由的下一跳是这个IP地址。如果这个via 0.0.0.0,或者是用*表示,则代表一定的通配,那么就意味着这个路由的目的地和自己在一个二层的网络,到达那个目的地并不需要网关转发,只需要配置MAC地址从端口上发出去即可,当然这个发送过程中是要先去查ARP表获取目标的MAC地址。
2. dest IP:目的IP。如果目的IP为0.0.0.0(可以用default代替),则表示这个目的地址匹配所有。 这样在其他的更精确的路由条目都不命中的情况下,就一定会命中这个默认路由条目。因为这个条目的目的IP设置是通配。
3. dev:指定网卡。假设一个路由条目指定了gateway,那么决策还需要知道这个gateway到底是从哪个网口发出去可达的,这就是dev的作用。如果gateway不指定(即该路由在同一个二层),仍然需要指定dev。
4. scope:Dev是相对于gateway的一个更小的约束,scope是一个更小程度的约束,指明了该路由在什么场景下才有效,也是用于约束目的地址的。例如不指定网关的二层路由,通常对应的scope类型是scope link。scope link的意义就是说明在同一个二层。这个意义与网关不指定的效果是呼应的。
Scope值 | 说明 | |
global | 在任何的场景下都有效 | 例如从一个端口收到的包,可以查询global的路由条目,如果目的地址在另外一个网卡,那么该路由条目可以匹配转发的要求,进行路由转发。Link的scope路由条目是不会转发任何匹配的数据包到其他的硬件网口的 |
link | 在该链路上才有效,也就是说接收和发送都是走的同一个网卡节点的时候,这条路由才会生效(也就是说在同一个二层) | |
host | 表示这是一条本地路由,典型的是回环端口,loopback设备使用这种路由条目,该路由条目比link类型的还要严格,约定了都是本机内部的转发,不可能转发到外部 | |
site | ipv6专用的路由scope |
二. 命令
- ip route配置路由表,ip rule配置路由规则;
- ip route配置的路由表服务于ip rule配置的规则;
- 路由最终有ip route的配置和ip rule的配置确定
2.1 ip route
Prolog 255|sdm845:/ # ip route help Usage: ip route list | flush SELECTOR ip route save SELECTOR ip route restore ip route showdump ip route get [ ROUTE_GET_FLAGS ] ADDRESS [ from ADDRESS iif STRING ] [ oif STRING ] [ tos TOS ] [ mark NUMBER ] [ vrf NAME ] [ uid NUMBER ] ip route add | del | change | append | replace ROUTE SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ] [ table TABLE_ID ] [ vrf NAME ] [ proto RTPROTO ] [ type TYPE ] [ scope SCOPE ] ROUTE := NODE_SPEC [ INFO_SPEC ] NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ] [ table TABLE_ID ] [ proto RTPROTO ] [ scope SCOPE ] [ metric METRIC ] [ ttl-propagate enabled | disabled ] INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]... NH := [ encap ENCAPTYPE ENCAPHDR ] [ via [ FAMILY ] ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS FAMILY := [ inet | inet6 | ipx | dnet | mpls | bridge | link ] OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ] [ as [ to ] ADDRESS ] [ rtt TIME ] [ rttvar TIME ] [ reordering NUMBER ] [ window NUMBER ] [ cwnd NUMBER ] [ initcwnd NUMBER ] [ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ] [ rto_min TIME ] [ hoplimit NUMBER ] [ initrwnd NUMBER ] [ features FEATURES ] [ quickack BOOL ] [ congctl NAME ] [ pref PREF ] [ expires TIME ] TYPE := unicast | local | broadcast | multicast | throw | unreachable | prohibit | blackhole | nat TABLE_ID := [ local | main | default | all | NUMBER ] SCOPE := [ host | link | global | NUMBER ] NHFLAGS := [ onlink | pervasive ] RTPROTO := [ kernel | boot | static | NUMBER ] PREF := [ low | medium | high ] TIME := NUMBER[s|ms] BOOL := [1|0] FEATURES := ecn ENCAPTYPE := [ mpls | ip | ip6 | seg6 | seg6local ] ENCAPHDR := [ MPLSLABEL | SEG6HDR ] SEG6HDR := [ mode SEGMODE ] segs ADDR1,ADDRi,ADDRn [hmac HMACKEYID] [cleanup] SEGMODE := [ encap | inline ] ROUTE_GET_FLAGS := [ fibmatch ] |
ip route命令用来操作静态路由,常用的route命令如下:
1. ip route查看
ip route list table table_number
ip route list table table_name
(可以用ip rule查看有哪些表,最后一列即为表名)
ip route show table all
-> 有些路由是配置在other路由的,例如双网卡的默认路由直接用ip rule去查table是看不到的,因为ip rule一般只能看到自己添加的规则。
2. 添加路由
(1) ip route add 78.22.45.0/24 via 10.45.22.1 src 10.45.22.12
发到 78.22.45.0/24 网段的网络包,下一跳(路由器入口)IP 是10.45.22.1,同时将包的源IP地址设为10.45.22.12
(2) ip route add 222.223.2.168 via 192.168.1.158 table main pref high
发到222.223.2.168网段的网络包,下一跳(路由器入口)IP是192.168.1.158,添加到main表
(3) ip route add default gw 192.168.1.1
添加默认网关地址为192.168.1.1
(4) ip route add table 3 via 10.0.0.1 dev eth0
eth0的ip为10.0.0.1
2.2 ip rule
1. ip rule
10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system
> 10000策略:表示所有的数据包(from all),其iptables的mark(32bit)和 0xd0000 按位&之后,所得结果为0xc0000的数据包,使用legacy_system路由表进行路由查找(lookup legacy_system)。
在不主动设置数据包的mark时,数据包的mark就是0。mark可以使用iptable命令来设置,在后面介绍iptable的时候再详细介绍。
10500: from all iif lo oif dummy0 uidrange 0-0 lookup dummy0
> 10500策略:表示所有的数据包(from all),如果是从lo回环接口(iif lo)输入,从dummy0接口(oif dummy0) 输出,其uid为0(uidrange 0-0)即系统用户,使用dummy0路由表进行路由查找
Plain Text lo接口:假如一个本地进程向另一个本地进程发送数据,那么将会使用lo接口,此时如果在eth0接口上抓包是无法抓到的,但是在lo接口上能够抓到 |
2. ip rule add
(1) ip rule add from 192.168.1.146 lookup main
> 从192.168.1.146 来的数据包通信策略优先在table main 中查找
(2) ip rule add to 168.96.0.0/24 table 20
> 数据包目的地址为 168.96.0.0/24 的数据,使用路由表20
(3) ip rule add dev eth0 table 1
> 让eth0进入的数据使用路由表1
以上是关于Android网络框架——策略路由与常用命令的主要内容,如果未能解决你的问题,请参考以下文章
Android进阶——网络通信之ip rule,ip route等策略路由小结