Android进阶 您所在的位置:网站首页 添加路由表命令怎么设置 Android进阶

Android进阶

2024-03-13 06:06| 来源: 网络整理| 查看: 265

文章大纲 引言一、策略路由概述二、策略路由相关理论知识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 } SELECTOR ip route save SELECTOR ip route restore ip route showdump ip 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目的地址(这里是选择规则时使用,查找路由表时也使用)tosIP包头的TOS(type of sevice)域Linux高级路由dev物理接口fwmarkiptables标签,可能需要定制,有些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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有