Android网络框架(二)——策略路由与常用命令

目录

一. 策略路由

1.1 默认路由表

1.2 默认规则

1.3 路由

二. 命令

2.1 ip route

2.2 ip rule


一. 策略路由

传统路由:在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

说明

  1. rule的数字表示优先级,数字越小表示优先级越高
  1. 在linux系统中是按照rule的优先级顺序依次匹配

0

  1. 查询路由表local (table id = 255);
  1. 使用这条路由规则的条件:匹配任何条件的数据包;
  1. rule 0非常特殊,不能被删除或者覆盖

32766

  1. 查询路由表main(table id = 254);
  1. 使用这条路由规则的条件:匹配任何条件的数据包;
  1. 系统管理员可以删除或者使用另外的策略覆盖这条策略

32767

  1. 查询路由表default(table id = 253);
  1. 使用这条路由规则的条件:匹配任何条件的数据包;
  1. 对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理,这个规则可以删除

如下图所示,这里的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

二. 命令

  1. ip route配置路由表,ip rule配置路由规则;
  1. ip route配置的路由表服务于ip rule配置的规则;
  1. 路由最终有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

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值