概述
实现648 Android 6.0端与410 Linux端通过Switch通信
1. 虚拟网卡配置
648中延用638中方法在有线网络接口eth0上创建虚拟网卡eth0.1并设置ip 10.66.1.3用以与410地址10.66.1.2通信。
echo "busybox ifconfig eth0:1 10.66.1.3 up"
# set VLAN 1 on eth0 and set its REORDER_HDR param
busybox vconfig add eth0 1
busybox vconfig set_flag eth0.1 1 1
# set its network info
busybox ifconfig eth0.1 10.66.1.3 netmask 255.255.255.0 up
busybox ifconfig
配置结果可通过命令“ifconfig”查看:
并且配置完成后,系统路由表中会自动多出一条路由:
表示10.66.1.0网段的ip都走eth0.1网卡,没毛病。
2. Android M 多网络共存
经过步骤一的配置之后在638 Android 4.4系统上即可与410建立通信;但在648 Android 6.0上是不通的。此问题查询了很长时间终于有了解决方案,且听我细细道来。
Android4.4只使用了一张路由表,使用busybox route就可以完成路由表的设置,从Android5.0之后,考虑要对多网络的支持,采用了多路由表。Android 5.0(LOLLIPOP)以上,在同一时间下,Android系统可以允许多网络类型连接,而且并不是简单的网络共存,而是每个网络有一套自己的dns,网关,路由表。比如eth0,wlan0分别有自己独立的一套。应用层在建立socket连接的时候,可以自由选择使用那套网络;在这样子的前提下,你就可以选择究竟采用那种网络来完成你的请求。这里还涉及到另一个新的概念不同网络的标识netid,应用层可通过绑定指定的netid来设置该应用走指定的网络,但此处暂不赘述有兴趣可自己了解。在Android 5.0(LOLLIPOP)之前,在同一时间下,Android系统只能允许一种网络类型连接。之后在多网络的情况下,系统是如何选择的呢?这就需要引入一个关键名词“策略路由”。
策略路由在linux中已经存在很久,但是Android5.0开始才真正将其作用发挥出来。策略路由区别于一般的路由就在于,一般的路由是以目的地址作为识别与区分的标识,例如下面这个路由表,它表示所有目的地址为192.168.7.0/24的数据包都直接从eth0发出
root@almond:/ # ip rule list
0: from all lookup local
10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system
10500: from all oif eth0 uidrange 0-0 lookup eth0
13000: from all fwmark 0x10063/0x1ffff lookup local_network
13000: from all fwmark 0x10064/0x1ffff lookup eth0
14000: from all 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 lookup eth0
22000: from all fwmark 0x0/0xffff lookup eth0
23000: from all fwmark 0x0/0xffff uidrange 0-0 lookup main
32000: from all unreachable
root@almond:/ #
当面对比较复杂的情况时,这种基于目的地址的路由,就很受局限。例如:有两个网卡eth0, eth1,希望所有http上网数据从eth0出去,FTP数据从eth1出去。这种情况就必须要策略路由才能处理。
策略路由的基本命令:
-
ip rule list:显示策略数据库
-
ip rule add :增加策略规则
-
ip route add:增加路由表
648上策略路由信息:
# add route policy
busybox ip route add table 3 via 10.66.1.3 dev eth0.1
busybox ip rule add to 10.66.1.2/24 table 3
各部分解释
-
xx: 第一列数字是优先级,小的数字优先级高
-
中间部分内容:如 from all, 这是规则
-
fwmark 0x10064: 其中0x64(十进制为100)就是该网络的netid
-
lookup [xxx] : 表示搜索xxx路由表,1-252之间的数字或名称
整行的意思就是,如果一个数据包符合规则(源地址、目的地址、协议、端口、数据包大小、内容等),则使用指定路由表。
系统最多支持255个路由表:
-
规则0,它是优先级别最高的规则,规则规定,所有的包,都必须首先使用local表(254)进行路由。本规则不能被更改和删除。
-
规则23000,规定所有的包,使用表main进行路由。本规则可以被更改和删除。
-
规则32000,规定所有的包,使用表default进行路由。本规则可以被更改和删除。
在默认情况下进行路由时,首先会根据规则0在本地路由表里寻找路由,如果目的地址是本网络,或是广播地址的话,在这里就可以找到合适的路由;从这个路由规则中可以看到, 路由表 local优先,然后是netid 对应 0x10064 的走 eth0 路由表,对应 0x10066 走 eth0 路由表。而通常情况下访问网络时没有设置 netid,默认就使用 22000: from all fwmark 0x0/0xffff lookup eth0 这个,即 eth0 路由表。
有了策略路由,就可以保证当多网卡存在是,每个网卡有自己的路由表,为多网卡共存提供路由基础。上层应用,可以选择要经过的路由。
此处没有走eth0.1到10.66.1.2的路由策略,需添加:
# add route policy
busybox ip route add table 3 via 10.66.1.3 dev eth0.1
busybox ip rule add to 10.66.1.2/24 table 3
3. Linux 路由与策略路由
Linux是在内核2.1开始采用策略性路由机制的。策略性路由机制与传统的路由算法相比主要是引入了上面的多路由表以及规则的概念。
要配置一个策略路由有2步:
1、在自定义路由表中添加要走的路由 ip route add xxx table table_num
2、增加策略,使得符合该策略的流量走第一步所定义的路由表 ip rule add 策略 【table tablenum 或 动作】。
传统的linux路由是由一张路由表去保存网络链路上的路由信息的。新的linux策略路由的理念是使用多张路由表去保存路由信息。何为策略路由呢,就是为不用的数据包制定不同的路由策略,即在IP路选时走不同的路由。
在策略路由机制中,可以支持多张路由表,最多可支持255张表。其中4张是内置路由表,如下:
-
表255:本地路由表(localtable)。广播地址和NAT地址都在这个表里。该表由系统自动维护,网络管理员不能直接修改。
-
表254:主路由表(maintable)。如果没有指明路由所属的表,所有的路由都会添加到这个表里。
-
表253:(defaulttable)。一般所有的默认路由都保存在这个表里
-
表0:默认保留
策略路由的作用
1 基于源地址选路( Source-Sensitive Routing)
2 根据服务级别选路( Quality of Service)
3 节省费用的应用
4 负载平衡(Load Sharing)
最后
以上就是个性芹菜为你收集整理的Android 6.0 策略路由的全部内容,希望文章能够帮你解决Android 6.0 策略路由所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复