Android&Linux策略路由

        在Android4.4之前只使用了一张路由表,但从Android5.0之后开始,在同一时间下,Android允许多网络类型连接,每个网络有自己的一套dns、网关、路由表等。比如:eth0和wlan0分别有自己的一套。应用层在建立socket连接的时候,可以自由选择使用哪一套网络,同时,这里还涉及到不同网络表示netid,应用层可以通过绑定指定的netid来设置数据包走哪个指定的网络。

        Android5之前,统一时间下,只允许有一种网络类型连接,但是Android5之后,支持多网络运行,在多网络的情况下,系统是如何进行选择的呢?这里就需要引入一个关键名词“策略路由”。

策略路由

        一般的路由以目的地址作为识别与区分的标识,例如:

Destination  Gateway     Genmask      Flags   Metric   Ref  Use   Iface
172.17.0.0   0.0.0.0        255.255.0.0   U         0           0      0       eth0

         表示目的地址为 172.17.0.0/16 的包通过eth0进行转发。

        但是在面对比较复杂的情况时,这种单纯基于目的地址的路由就受到了局限,比如:有设备有两张网卡eth0和eth1,希望所有http的上网数据从eth0进行转发,FTP的数据通eth1进行转发,这种情况就必须用到策略路由才能处理了。

        Android设备中,可以使用命令ip  rule显示现有的路由策略,如下所示:

rk3568_r:/ # ip rule
0:      from all lookup local
10000:  from all fwmark 0xc0000/0xd0000 lookup legacy_system
10500:  from all iif lo oif dummy0 uidrange 0-0 lookup dummy0
10500:  from all iif lo oif eth0 uidrange 0-0 lookup eth0
13000:  from all fwmark 0x10063/0x1ffff iif lo lookup local_network
13000:  from all fwmark 0x10064/0x1ffff iif lo lookup eth0
14000:  from all iif lo oif dummy0 lookup dummy0
14000:  from all iif lo oif eth0 lookup eth0
15000:  from all fwmark 0x0/0x10000 lookup legacy_system
16000:  from all fwmark 0x0/0x10000 lookup legacy_network
17000:  from all fwmark 0x0/0x10000 lookup local_network
19000:  from all fwmark 0x64/0x1ffff iif lo lookup eth0
22000:  from all fwmark 0x0/0xffff iif lo lookup eth0
23000:  from all fwmark 0x0/0xffff uidrange 0-0 lookup main
32000:  from all unreachable
rk3568_r:/ #

         第一列表示策略号码,可支持上万条策略,策略号码数值越小表示该条策略的优先级越高。策略0为优先级最高的策略,在数据包进行路由时,首先匹配该数据包是否满足策略0的规则。策略0的规则为,所有的数据包去 local路由表中去查找自己的路由方向,没有找到则使用下一优先级的路由策略,这里为10000。local(id为255)路由表示是系统默认的三张路由表之一,另外两张为main(id为254)路由表和default(id为253)路由表。

        local路由表包含本机路由和广播信息,如果发送的数据包只需要进行本机路由或者是一个广播信息,那么这个数据包将会在这个local路由表中找到路由信息。配置好网卡的网络设置系统就会自动生成local路由表,可以使用 ip route list table + 表名or表id 来查看路由表的内容。

rk3568_r:/ # ip route list table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 172.29.0.0 dev eth0 proto kernel scope link src 172.29.7.28
local 172.29.7.28 dev eth0 proto kernel scope host src 172.29.7.28
broadcast 172.29.255.255 dev eth0 proto kernel scope link src 172.29.7.28
rk3568_r:/ #

         main路由表就是使用 route  -n 命令所展现的路由表,如果添加路由时没有指定该路由所属的路由表,则这条路由会被添加到main路由表中。配置好网卡的网络设置系统就会自动生成main路由表。

rk3568_r:/ # ip route list table main
172.29.0.0/16 dev eth0 proto kernel scope link src 172.29.7.28
rk3568_r:/ #

         default路由表,该路由表是一个空的路由表,正常情况下保持该路由表为空即可。

rk3568_r:/ # ip route list table default
rk3568_r:/ #
空的

路由表ID

        在策略路由中,路由表可以用一个名字表示,同时也可以使用一个ID表示,路由表和其ID的映射关系表储存在 /etc/iproute2/rt_tables 文件中(但是我自己没有找到这个文件),最多可支持255张路由表。

策略解析

        在回到上面的策略路由。第一条策略路由已经解析,第二条策略,如下所示:

10000:  from all fwmark 0xc0000/0xd0000 lookup legacy_system

         索引为10000的策略表示,所有的数据包(from all),其iptables的mark(32bit)和 0xd0000 按位与之后,所得结果为0xc0000的数据包(fwmark 0xc0000/0xd0000),使用legacy_system路由表进行路由查找(lookup legacy_system)。

10500:  from all iif lo oif eth0 uidrange 0-0 lookup eth0

         10500策略表示,所有的数据包,如果是从lo回环接口输入(iif lo),从eth0接口 输出(oif eth0),其uid为0(idrange 0-0)即系统用户,使用eth0路由表进行路由查找。lo接口的作用是,假如一个本地进程向另一个本地进程发送数据,那么将会使用lo接口,此时如果在eth0接口上抓包是无法抓到的,但是在lo接口上能够抓到。

22000:  from all fwmark 0x0/0xffff iif lo lookup eth0

         2000策略表示,所有的数据包,其iptables的mark和 0xffff 按位与之后,所得结果为0x0,且是从lo回环接口输入的数据包,使用eth0路由表。在不主动设置数据包的mark时,数据包的mark就是0,所以在不设置mark的时候,数据包通常会满足这条路由策略。

添加策略

        如果我们想要添加策略则可以使用 ip rule add + 策略 + 对应路由表 的方式添加策略。比如:我们想让数据包的源ip地址为 192.168.1.10 的数据,走通过路由表10来进行路由,则使用命令:

ip rule add from 192.168.1.10 table 10

         执行以上命令之后,通过ip rule可以查看这条现有策略增加了一行,如下所示:

9998:   from 192.168.1.10 lookup 10

         想让数据包目的地址为 168.96.0.0/24 的数据,使用路由表20,如下:

ip rule add to 168.96.0.0/24 table 20 
9997:   from all to 168.96.0.0/24 lookup 20

         想让eth0进入的数据使用路由表1进行路由

ip rule add dev eth0 table 1
9996:   from all iif eth0 lookup 1

         想让mark(32bit)的值为1的数据包使用路由表1。

ip rule add fwmark 1 table 1
9999:   from all fwmark 0x1 lookup 1

         数据包的mark值是可以进行设置的。

设置mark值

        比如想要将http协议(端口80)的数据包的mark值设置为1,那可以使用如下命令:

iptables -t mangle -A FORWARD -i eth3 -p tcp --dport 80 -j MARK --set-mark 1

         这里就能将http数据的mark值都设置为1。同时,因为此前设置了mark为1的数据包使用路由表1,所以这里就http的数据都将会使用路由表1进行路由。

添加/删除 路由

        添加一个默认路由。

ip route add default via 192.168.2.1 dev ens33 src 192.168.2.12 table main

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

default         192.168.2.1        0.0.0.0             UG    0         0        0     ens33

default         192.168.2.1        0.0.0.0             UG    100     0        0     ens33

ip route del default via 192.168.2.1 dev ens33 src 192.168.2.12 table main(删除添加的这个路由)

         添加一条普通路由。

ip route add 192.168.2.0/24 via 192.168.2.1

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

default            192.168.2.1     0.0.0.0            UG     100     0        0     ens33

192.168.2.0     192.168.2.1     255.255.255.0   UG    0      0        0     ens33

......

        如果我们使用ip route del default删掉默认路由之后,会导致我们访问除了192.168.2.0/24网段的ip之外的ip都会失败。

        删除路由的时候,会根据提供的路由信息去删除最匹配的那一条路由。

        路由表中的Gateway是0.0.0.0或者*表示目标是本主机所属的网络,不需要路由;Genmask和Destination为0.0.0.0表示这条路由是默认路由。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值