文章大纲

  • 引言
  • 一、策略路由概述
  • 二、策略路由相关理论知识
    • 1、内核配置的缺省路由表
      • 1.1、`0`#表
      • 1.2、`253`#default表
      • 1.3、 `254`#main表
      • 1.4、`255`#local表
    • 2、内核配置的缺省的路由策略规则
      • 2.1、0号策略规则
      • 2.2、32766号策略规则
      • 2.3、32767号策略规则
  • 三、ip rule & ip route指令
    • 1、ip rule 显示当前路由策略
    • 2、 ip route list[or show] table + 表名or表id 来查看路由表的内容
    • 3、路由策略解析
    • 4、ip rule add + 策略 + 对应路由表ID添加策略
    • 5、ip route add default gw 给网关服务添加一个默认路由
    • 6、ip rule 管理路由规则
    • 7、ip route flush cache刷新路由
    • 8、一个小实例

引言

在Android4.4之前只使用了一张路由表,但从Android5.0之后开始,在同一时间下,Android允许多网络类型连接,每个网络有自己的一套DNS、网关、路由表等。于是在5.0之后可以支持多网络运行,那么在多网络的情况下,系统是如何进行选择的呢?于是乎“策略路由”应运而生。

比如eth0和wlan0分别有自己的一套,应用层在建立socket连接的时候,可以自由选择使用哪一套网络,同时这里还涉及到不同网络表示netid,应用层可以通过绑定指定的netid来设置数据包走哪个指定的网络。

一、策略路由概述

基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小,应用或IP源地址等属性来选择转发路径。一般的路由以目的地址作为识别与区分的标识,例如:

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进行转发,这种情况就必须用到策略路由才能处理了。

二、策略路由相关理论知识

在系统启动时,内核会创建默认的四个路由表以及为路由策略数据库配置三条缺省的规则,当策略号码匹配时就通过对应的路径去通信。

1、内核配置的缺省路由表

系统中可以自定义从 1-252个路由表,其中系统维护了4个路由表,前面的数字为表Id,在策略路由中,路由表可以用一个名字表示,同时也可以使用一个ID表示,路由表和其ID的映射关系表储存在 /etc/iproute2/rt_tables 文件中(但是我自己没有找到这个文件),最多可支持255张路由表。

1.1、0#表

table Id为0的系统保留表。

1.2、253#default表

default table 没特别指定的默认路由都放在该表,default路由表,该路由表是一个空的路由表,正常情况下保持该路由表为空即可。

rk3399_all:/ # ip route list table default
rk3399_all:/ #

1.3、 254#main表

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

1.4、255#local表

local table 保存本地接口地址,广播地址、NAT地址 由系统维护,用户不得更改 。local路由表包含本机路由和广播信息,如果发送的数据包只需要进行本机路由或者是一个广播信息,那么这个数据包将会在这个local路由表中找到路由信息,**配置好网卡的网络设置系统就会自动生成local路由表,可以使用

2、内核配置的缺省的路由策略规则

2.1、0号策略规则

匹配任何条件,查询路由表local,该表local是一个特殊的路由表,包含对于本地和广播地址的优先级控制路由。0号策略规则非常特殊,不能被删除或者覆盖。所有的数据包去 local路由表中去查找自己的路由方向,没有找到则使用下一优先级的路由策略

2.2、32766号策略规则

匹配任何条件,查询路由表main表,该表是一个通常的表,包含所有的无策略路由,系统管理员可以删除或者使用另外的规则覆盖这条规则。

2.3、32767号策略规则

匹配任何条件,查询路由表default,该表是一个空表,它是后续处理保留,对于前面的策略没有匹配到的数据包,系统使用这个策略进行处理,这个规则也可以删除。

不要混淆路由表和策略,规则指向路由表,而多个规则可以引用一个路由表,而且某些路由表可以策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。

三、ip rule & ip route指令

进行路由时,根据路由规则来进行匹配,按优先级pref从低到高匹配,直到找到合适的规则。

在Linux 下直接rule 即可。

1、ip rule 显示当前路由策略

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

rk3399_all:/ # ip rule
0:     from all lookup local
10000:  from all to 172.29.7.148 lookup eth0
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
rk3399_all:/ #

其中第一列表示策略号码(同时也是策略对应的索引值),可支持上万条策略,策略号码数值越小表示该条策略的优先级越高。策略0为优先级最高的策略,在数据包进行路由时,首先匹配该数据包是否满足策略0的规则,即所有的数据包去 local路由表中去查找自己的路由方向,没有找到则使用下一优先级的路由策略,这里为10000号策略,即所有的数据包发往172.29.7.148的都从eth0网卡出去。

rk3399_all:/ # 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
rk3399_all:/ #

2、 ip route list[or show] table + 表名or表id 来查看路由表的内容

rk3399_all:/etc # ip route show table main
192.168.0.0/16 dev eth0  proto kernel  scope link  src 192.168.1.146
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.11
192.168.43.0/24 dev wlan0  proto kernel  scope link  src 192.168.43.1
223.223.1.0/24 dev eth1  proto kernel  scope link  src 223.223.1.100
223.255.110.0/24 dev eth0  proto kernel  scope link  src 223.255.110.11
rk3399_all:/etc #
rk3399_all:/etc # ip route list table main
192.168.0.0/16 dev eth0  proto kernel  scope link  src 192.168.1.146
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.11
192.168.43.0/24 dev wlan0  proto kernel  scope link  src 192.168.43.1
223.223.1.0/24 dev eth1  proto kernel  scope link  src 223.223.1.100
223.255.110.0/24 dev eth0  proto kernel  scope link  src 223.255.110.11
rk3399_all:/etc #

3、路由策略解析

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

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(uidrange 0-0)即系统用户,使用eth0路由表进行路由查找。

lo接口的作用是,假如一个本地进程向另一个本地进程发送数据,那么将会使用lo接口,此时如果在eth0接口上抓包是无法抓到的,但是在lo接口上能够抓到。

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

22000策略表示,所有的数据包,其iptables的mark和 0xffff 按位与之后,所得结果为0x0,且是从lo回环接口输入的数据包,使用eth0路由表。

在不主动设置数据包的mark时,数据包的mark就是0,所以在不设置mark的时候,数据包通常会满足这条路由策略。

4、ip rule add + 策略 + 对应路由表ID添加策略

如果我们想要添加策略则可以使用 ip rule add + 策略 + 对应路由表ID 的方式添加策略。比如我们想让数据包的源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

ip rule后显示的结果,新增一行:

9997:   from all to 168.96.0.0/24 lookup 20

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

ip rule add dev eth0 table 1

ip rule后显示的结果,新增一行:

9996:   from all iif eth0 lookup 1

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

ip rule add fwmark 1 table 1

ip rule后显示的结果,新增一行:

9999:   from all fwmark 0x1 lookup 1

数据包的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进行路由。

5、ip route add default gw 给网关服务添加一个默认路由

# 192.168.1.1 为网关地址
ip route add default gw 192.168.1.1
ip route add table 3 via 10.0.0.1 dev ethX (ethx是10.0.0.1所在的网卡,3 是路由表的编号)

6、ip rule 管理路由规则

Usage: ip route { list | flush } SELECTORip route save SELECTORip route restoreip route showdumpip route get ADDRESS [ from ADDRESS iif STRING ][ oif STRING ] [ tos TOS ][ mark NUMBER ] [ uid NUMBER ]ip route { add | del | change | append | replace } ROUTE
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ][ table TABLE_ID ] [ 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 ]
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 ]
ENCAPHDR := [ MPLSLABEL ]
选项 说明
from 源地址
to 目的地址(这里是选择规则时使用,查找路由表时也使用)
tos IP包头的TOS(type of sevice)域Linux高级路由
dev 物理接口
fwmark iptables标签,可能需要定制,有些Android原生不支持。
prohibit 丢弃该包,并发送 COMM.ADM.PROHIITED的ICMP信息
unreachable 丢弃该包并发送 NET UNREACHABLE的ICMP信息
nat 透明网关

比如从192.168.1.146 来的数据包通信策略优先在table main 中查找

ip rule add from 192.168.1.146 lookup main

在main 标添加一个策略,到222.223.2.168的数据经过192.168.1.158

ip route add 222.223.2.168 via 192.168.1.158 table main pref high

而ip route add 192.168.1.146 dev eth0 table main 执行后在main表中会看到

192.168.0.0/16 dev eth0  proto kernel  scope link  src 192.168.1.146

7、ip route flush cache刷新路由

如果路由缓存不刷新的话,路由命令可能不能马上生效。

路由判断就是使用ip rule,ip route设置的规则,其中ip route配置的路由表服务于ip rule配置的规则。

8、一个小实例

摘自网上一个例子,公司内网要求192.168.0.100 以内的使用 10.0.0.1 网关上网 (电信),其他IP使用 20.0.0.1 (网通)上网,需要以下几步:

  • 首先要在网关服务器上添加一个默认路由,当然这个指向是绝大多数的IP的出口网关

    ip route add default gw 20.0.0.1
    
  • 之后通过 ip route 添加一个路由表:

    ip route add table 3 via 10.0.0.1 dev ethX
    # (ethx 是 10.0.0.1 所在的网卡, 3 是路由表的编号)
    
  • 之后添加 ip rule 规则:

    ip rule add fwmark 3 table 3
    #(fwmark 3 是标记,table 3 是路由表3 上边。 意思就是凡事标记了 3 的数据使用 table3 路由表)
    
  • 之后使用 iptables 给相应的数据打上标记:

    iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 - 192.168.0.100 -j MARK --set-mark 3
    

Android进阶——网络通信之ip rule,ip route等策略路由小结相关推荐

  1. android+ip+rule+策略路由,策略路由以及使用 ip route , ip rule , iptables 配置策略路由实例...

    route 命令 使用 Route 命令行工具查看并编辑计算机的 IP 路由表.Route 命令和语法如下所示: route [-f] [-p] [Command [Destination] [mas ...

  2. linux ip rule table,Linux 高级路由 ip rule / ip rout

    路由策略数据库的规则用于控制选择路由的算法. Internet上采用的路由算法一般是基于数据包目的地址的.理论上,也可以由TOS域决定,不过这没有实际应用.要了解经典路由算法的详细情况请参考RFC-1 ...

  3. Linux下ip route、ip rule、iptables的关系(转

    http://www.cnblogs.com/sammyliu/p/4713562.html(本文内容转自此篇博客) Linux下ip route.ip rule.iptables的关系(转) 1.基 ...

  4. iproute2路由配置(ip rule、ip route、traceroute)

    一.Iproute2简介 Iproute2是一个在Linux下的高级网络管理工具软件.实际上,它是通过rtnetlink sockets方式动态配置内核的一些小工具组成的,从Linux2.2内核开始, ...

  5. ip rule,ip route,iptables 三者之间的关系

    以一例子来说明:公司内网要求192.168.0.100 以内的使用 10.0.0.1 网关上网 (电信),其他IP使用 20.0.0.1 (网通)上网. 首先要在网关服务器上添加一个默认路由,当然这个 ...

  6. android ip rule 策略路由,ip rule 策略路由

    1. 工具安装 yum install iproute 查看工具是否安装 ip -V 2. ip rule 和 ip route ip命令中和策略路由相关的OBJECT有 rule 和 route. ...

  7. linux 添加路由_linux网络知识:路由策略(ip rule,ip route)

    一,路由策略(使用ip rule命令操作路由策略数据库) 基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小,应用或IP源地址等属性来选择转发路 ...

  8. ip route / ip rule /iptables 配置策略路由

    Linux 使用 ip route , ip rule , iptables 配置策略路由 要求192.168.0.100以内的使用 10.0.0.1 网关上网,其他IP使用 20.0.0.1 上网. ...

  9. 使用ip rule查询路由策略, 使用ip route修改静态路由表

    一.使用ip rule查看路由策略数据库 ip rule list 在 Linux 系统启动时,内核会为路由策略数据库配置三条缺省的规则: rule 0 匹配任何条件 查询路由表local(ID 25 ...

最新文章

  1. 赛门铁克《勒索软件与企业2016》调查报告:企业将面临更多勒索软件威胁
  2. 无法从“std::_Binder std::_Unforced,SOCKET ,LPSOCKADDR,unsigned int ”转换为“int”
  3. win10任务栏怎么还原到下面_Windows10 系统桌面底部的任务栏在侧边了怎么还原
  4. elasticsearch分析系列
  5. SimpleUpdater.NET
  6. 如何封装Spring bean
  7. 第九届蓝桥杯单片机省赛
  8. 086-Python生成Wifi二维码 一扫联网
  9. 支持向量机(SVM)的原理推导及解释
  10. VSCode如何返回上一步
  11. python图片转svg_Python3.7将普通图片(png)转换为SVG图片格式并且让你的网站Logo(图标)从此”动”起来...
  12. 惠普台式机开不了机怎么办 惠普台式电脑无法开机的解决方法
  13. 三维高清vR展示模型的应用及优势
  14. Ubuntu16.04 U盘安装Ubuntu16.04制作 光盘刻录 安装与简介
  15. 我为什么选择超级IP名片
  16. 专访 | 数据库厂商都怕低价竞争?阿里云说并不可惧
  17. 试题 算法训练 黑色星期五(Java)
  18. wince输入法问题
  19. 缺钱?马斯克再挂牌售加州5处房产 要价1亿美元!
  20. 日本 大清 管理洋人技术人员

热门文章

  1. 有 20 枚硬币,可能包括 4 种类型:1 元、5 角、1 角和 5 分。已知 20 枚硬币的总价值为 10 元,求各种硬币的数量。
  2. 记录Win10+Ubuntu18.04(引导Win10启动)双系统迁移到SSD,Ubuntu迁移成功但丢失Win10启动项
  3. Linux修改磁盘分区后未写入分区表的解决方法(partprobe)
  4. php token过期,前后端分离项目,token过期,重新登录和刷新token的问题
  5. 淘宝开店保证金该怎么样退回?淘宝自然流量
  6. 人民警察计算机职位眼睛,在编人民警察考试,哪些职位不要求视力?
  7. php mysql having_mysql having 使用方法
  8. 解锁 Android 手机的11大有效技巧
  9. 推荐两个非常棒的免抠图PNG素材网站。
  10. 苹果x漫画脸_新一代五十铃mu-X中型SUV首发