Linux路由选择与策略路由

Linux路由选择与策略路由

OSI七层参考模型

Linux路由选择与策略路由_第1张图片Linux路由选择与策略路由_第2张图片
二层交换、三层路由
交换位于OSI七层模型的第二层数据链路层, 数据帧被封装了以太网头部,其中记录了目标网路的mac地址。
路由位于OSI七层模型的第三层网络层,数据包被封装了IP头部,其中记录了源IP地址和目的IP地址。

路由引入

Linux路由选择与策略路由_第3张图片
二层交换、三层路由
交换位于OSI七层模型的第二层数据链路层, 数据帧被封装了以太网头部,其中记录了目标网路的mac地址。
​路由位于OSI七层模型的第三层网络层,数据包被封装了IP头部,其中记录了源IP地址和目的IP地址。

问题一:若192.168.10.1/24的PC0要和在相同网段的192.168.10.2/24的PC进行通信,如何实现?
​ 相同网段,通过ARP广播来获取到目的地址主机的MAC地址,从而将数据封装成数据帧后通过物理线路通信。

问题二:假设192.168.10.1/24的PC0要跟172.16.1.1/24的PC1通信,如何实现?
​ PC0发出的数据包的目的地址是跨网段的,需要路由器负责转发数据包,每一个路由器都会维护一个路由表。路由表中记录了许多的条目,每一个条目被称作为route,每一个route包含了对应的目的网络出接口和下一跳(网关)
​ 当我们的路由器(或者说其他的具有路由功能的设备)收到一个IP的数据包时,会根据数据包中的目的IP地址在路由表中进行查找,如果找到了一个最匹配的表项,就会按照表项中出接口和下一跳进行转发。如果找不到匹配的表项,数据包就会被丢弃,路由器就会向数据包的起源发送一个ICMP报错消息,告知数据包不可达。

路由器

​ 路由器的工作内容:路由器支持各种路由协议(RIP、OSPF),根据路由协议填充路由表,依据路由表的条目转发数据包。

  • 路由器知道目的地址

  • 发现到达目标地址的可能的路由

  • 选择最佳路径(路由表)

  • 维护路由信息

  • 转发IP数据

路由表

IP网路由表

​ IP路由表是路由器能够工作的关键,相当于数据包转发的地图。在计算机网络中,路由表( routing table )又被称作路由信息数据库( Routing Information Base ),简称RIP。

Linux路由选择与策略路由_第4张图片

具备路由功能的华为数通产品(例如路由器,三层交换机等等)使用display ip routing-table命令查看路由表

Linux路由选择与策略路由_第5张图片

关键项 说明 举例
目标网络/掩码 目标网络加掩码长度,区别2.2.2.0/24和2.2.2.0/30 192.168.1.0/24
协议 表示该路由是通过什么协议获取到的 direct、static、动态路由协议(OSPF、RIP)
优先级 基于协议判断,当发现有多条不同协议的可达路由时,比较优先级,优先级越小就越优 例如华为路由器:Direct-0;OSPF-10;Static-69;IGRP-80;RIP-110;OSPFASE-150;BGP-170
开销 路由代价,cost值或metric值是同种路由协议用于选择最优路由的参数,一般值越小越优
标志 路由表标识 U:该条路由当前是可用的
G:该路由是到一个网关(路由器)的
H:该路由是到一个主机的
D:该路由已被下载到底层的转发信息表中
M:该路由已被重定向报文修改
R:使用动态路由重新初始化的路由
下一跳 报文的下一跳IP地址 192.168.10.254
出接口 去往目的地的转发接口,也叫外出接口、转发接口 GE0/0/0
路由条目的来源
直连路由

直连路由 – 直连接口所在网段的路由

  • 初始化情况下,路由器所知的网段,只有其直连接口所在网段。路由器自动将接口所在网段的路由写入路由表,这些路由被称为直连路由(Direct route),它们在路由表中的Protocol为Direct。

  • 直连路由出现在路由表中的前提,是该接口的物理状态及协议状态都为UP 。

    直连路由举例:当给路由器的某一个接口配置上IP地址为192.168.1.1/24时(该地址的网络号为192.168.1.0/24),且接口的物理/协议状态都为up,这个直连接口的网络号就会被自动写入到路由表中,形成一个直连的路由表表项。

静态路由

静态路由 – 由网络管理员手工配置的路由条目

  • ip route-static 网络号 掩码 下一跳IP地址
  • ip route-static 网络号 掩码 出接口
  • ip route-static 网络号 掩码 出接口 下一跳IP地址

静态路由举例:R1可以创建两条分别去往192.168.100.0/24和192.168.20.0/24网段的路由。静态路由便捷可控,但是若目标网络较多,就需要配置多个静态路由,面多规模较大的网络就显得力不从心,并且静态路由也无法相应拓扑动态的变化,若192.168.100.0/24这个网络发生故障,R1感知不到仍会将数据包转发给R2,R2则会把数据包丢弃。

Linux路由选择与策略路由_第6张图片

默认路由举例:R1若要和192.168.100.0/24、192.168.101.0/24、192.168.102.0/24…的网段通信,一种方法是为每一个目标网络配置一条静态路由,如下面第一张如所示,另一种方法是配置一条默认路由(缺省路由),如下图二所示,默认路由可以匹配任意目的网络,路由表中没有其他表项可以匹配时则会去匹配默认路由,相当于一个最后的手段。

Linux路由选择与策略路由_第7张图片

Linux路由选择与策略路由_第8张图片

  • 默认路由(Default route)也被称为缺省路由,即0.0.0.0 0.0.0.0或者0.0.0.0/0路由,也就是网络地址及掩码都为0的路由。
  • 这是一条特殊的路由,可匹配任何目的IP地址。默认路由的下一跳可视为该设备的“最后求助对象”,或者缺省网关。
  • 当网络设备转发一个报文时,如果路由表中存在匹配该报文目的IP地址的路由表项(非默认路由表项),则使用该表项转发这个报文;如果没有任何具体的路由表项匹配,则使用默认路由转发这个报文;如果既无匹配的具体路由,也无默认路由存在,则该报文将被丢弃。
动态路由

动态路由 – 路由器通过动态路由协议学习到的路由

  • 当路由器激活某个动态协议的能力,路由器之间就会去动态完成路由学习的过程
查看及排错

Ping – 测试网络连通性

Tracert – 追踪去往目标节点的沿途每一跳IP地址

display ip routing-table – 查看路由表

display ip interface brief – 接口摘要信息

Linux路由表

Linux中使用下面的route -n命令可以查看Linux内核路由表 。

# route -n
Kernel IP routing table
Destination      Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0(default) 192.168.1.1     0.0.0.0         UG    0      0        0 eth0
192.168.1.0      0.0.0.0(*)      255.255.255.0   U     0      0        0 eth0
211.140.188.188  192.168.1.1     255.255.255.255 UGH   0      0        0 eth0
输出项 说明
Destination 目标网段或者主机,默认路由中Destination为0.0.0.0,也用default表示
Gateway 网关地址,在路由器中也叫做下一跳,0.0.0.0表示目标是本主机所属的网络,不需要路由,也用"*"表示,直连路由的Gateway为0.0.0.0
Genmask 网络掩码,默认路由的Genmask为0.0.0.0
Flags 标记。
U — 路由是活动的
G — 路由指向网关
R — 恢复动态路由产生的表项
D — 由路由的后台程序动态地安装
M — 由路由的后台程序修改
! — 拒绝路由
Metric 路由距离,到达指定网络所需的中转数(linux 内核中没有使用)
Ref 路由项引用次数(linux 内核中没有使用)
Use 此路由项被路由软件查找的次数
Iface 该路由表项对应的输出接口
路由类型
主机路由

主机路由是路由选择表中指向单个IP地址或主机名的路由记录, 主机路由的Flags字段为H。 例如,在下面的示例中,本地主机通过IP地址192.168.1.1的路由器到达IP地址为10.0.0.10的主机。

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.10       192.168.1.1     255.255.255.255 UH   0      0        0 eth0
网络路由

网络路由是代表主机可以到达的网络。网络路由的Flags字段为N。例如,在下面的示例中,本地主机将发送到网络192.19.12.0的数据包转发到IP地址为192.168.1.1的路由器。

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.19.12.0     192.168.1.1     255.255.255.0   UN    0      0        0 eth0
默认路由

当主机不能在路由表中查找到目标主机的IP地址或网络路由时,数据包就被发送到默认路由(默认网关)上。默认路由的Flags字段为G。例如,在下面的示例中,默认路由是IP地址为192.168.1.1的路由器。

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.1     0.0.0.0   		UG    0      0        0 eth0
route命令使用
  • 添加到主机的路由
route add -host 192.168.1.2 dev eth0
route add -host 10.20.30.148 gw 10.20.30.40     #添加到10.20.30.148的网关
  • 添加到网络的路由
route add -net 10.20.30.40 netmask 255.255.255.248 eth0   #添加10.20.30.40的网络
route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41 #添加10.20.30.48的网络
route add -net 192.168.1.0/24 eth1
  • 添加默认路由
route add default gw 192.168.1.1
  • 删除路由
route del -host 192.168.1.2 dev eth0:0
route del -host 10.20.30.148 gw 10.20.30.40
route del -net 10.20.30.40 netmask 255.255.255.248 eth0
route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41
route del -net 192.168.1.0/24 eth1
route del default gw 192.168.1.1
  • 屏蔽一条路由
route add -net 224.0.0.0 netmask 240.0.0.0 reject
Linux系统打开路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward

路由汇总

路由汇总一般指路由汇聚,路由汇聚的“含义”是把一组路由汇聚为一个单个的路由广播。路由汇聚的最终结果和最明显的好处是缩小网络上的路由表的尺寸,上述的默认路由也属于路由汇总。

  • 路由汇总,又被称为路由聚合(Route Aggregation,或route summary),即是将一组有规律的路由汇聚成一条路由,从而达到减小路由表规模以及优化设备资源利用率的目的。

  • 路由汇总是一个非常重要的网络设计思想,一个可汇总的网络设计方案将使得我们的网络更加优化、路由条目更加精简、网络管理更加简单。在网络设计及部署中应时刻保有路由汇总的意识。

  • 不仅仅静态路由能够部署路由汇总,动态路由协议也都支持路由汇总功能。

Linux路由选择与策略路由_第9张图片

汇总路由的精确计算

现有明细路由:172.16.1.0/24至172.16.31.0/24,计算最精确的汇总路由,为172.16.0.0/19

Linux路由选择与策略路由_第10张图片

路由查找的最长匹配规则

当路由器将目的IP地址在路由表中执行查找时,采用的原则是“最长匹配原则”,也就是查找目的IP地址与路由前缀匹配度最长的表项,使用该表项作为最终数据转发的依据。

  • 计算方法

Linux路由选择与策略路由_第11张图片
Linux路由选择与策略路由_第12张图片

实例分析

例子一

Linux路由选择与策略路由_第13张图片

R1的192.168.12.1想要ping通R3的192.168.23.2

# 1. R1添加一条静态路由,指定目的ip为192.168.23.0/24的下一跳为192.168.12.2
[R1] ip route-static 192.168.23.0 24 192.168.12.2
	 route add -net 192.168.23.0/24 eth1 gw 192.168.12.2
# 2. 数据包到达R2,R2发现目的ip为192.168.23.2匹配到路由表中的直连路由,数据包通过GE0/0/1口到达R3,此时能否ping通R3?
不能!!!
注意:
通信是双向的,因此要留意往返流量(的路由)。
路由的行为是逐跳的,因此需保证沿途的每一台路由器都有路由。
# 3. R3返送回程数据,此时数据包的目的地址为192.168.12.1,R3并不知道192.168.12.0/24网段的路由,所以要在R3中添加以下路由。
[R3] ip route-static 192.168.12.0 24 192.168.23.1
     route add -net 192.168.12.0/24 eth1 gw 192.168.23.1
例子二

Linux路由选择与策略路由_第14张图片

完成三台路由器的配置,使得1.1.1.1能够访问2.2.2.2。( Loopback接口,也叫回环口,是一个逻辑的、虚拟的接口,可模拟路由器的直连网段,可用于测试)

# 1.1.1.1 -> 2.2.2.2
[R1] ip route-static 2.2.2.0 24 192.168.12.2    route add -net 2.2.2.0/24 eth1 gw 192.168.12.2
[R2] ip route-static 2.2.2.0 24 192.168.23.3	route add -net 2.2.2.0/24 eth1 gw 192.168.23.3

# 2.2.2.2 -> 1.1.1.1
[R3] ip route-static 1.1.1.0 24 192.168.23.2	route add -net 1.1.1.0/24 eth1 gw 192.168.12.2
[R2] ip route-static 1.1.1.0 24 192.168.12.1	route add -net 1.1.1.0/24 eth1 gw 192.168.12.1

扩展知识

静态路由三种写法的区别

以太网中静态路由的写法一般有以下几种:
Linux路由选择与策略路由_第15张图片

  • 下一跳: ip route 2.2.2.0 255.255.255.0 1.1.12.2
    R1去往2.2.2.0/24的路由,下一跳是1.1.12.2 ,因此需要知道1.1.12.2的mac地址,以便后续数据包封装。因此首先是arp广播请求下一跳的mac地址,再收到对端arp单播回复的过程,之后R1不管是ping 2.2.2.1或2.2.2.2等,都只是ICMP数据包正常交互过程了,不再需要arp广播。
  • 出接口: ip route 2.2.2.0 255.255.255.0 e0/0
    R1去往2.2.2.0/24的路由,从e0/0接口出去,意味着R1认为此路由是属于直连网段。也就是说R1与2.2.2.1通讯 ,需要从e0/0口出去先得到2.2.2.1的mac地址,以便后续数据包封装。因此首先是arp广播请求2.2.2.1的mac地址,再收到对端arp单播回复的过程。之后R1 ping 2.2.2.1,就是ICMP数据包正常交互过程了。那么同理,R1与2.2.2.2通讯,同样需要从e0/0口出去先得到2.2.2.2的mac地址,以便后续数据包封装。因此又是一次arp广播请求2.2.2.2的mac地址,再收到对端arp单播回复的过程。之后R1 ping 2.2.2.2,也是ICMP数据包正常交互过程了。以此类推R1与2.2.2.3、2.2.2.4通讯。。。
  • 下一跳+出接口: ip route 2.2.2.0 255.255.255.0 e0/0 1.1.12.2
    正常通讯过程其实和1一样。

区别:

  • 静态路由下一跳:一次(arp请求/回复)+ N次(数据通信)
  • 静态路由出接口:N次(arp请求/回复+数据通信)
  • 静态路由下一跳+出接口:一次(arp请求/回复)+ N次(数据通信)

优缺点:

  • 静态路由下一跳:ARP一次消耗小,但下一跳挂了,就是不通了。
  • 静态路由出接口:ARP多次消耗大,但相对有多个可能的下一跳,有冗余。
  • 静态路由下一跳+出接口:相对来说结合了两种优点。

Linux策略路由

前面讲的路由规则都是基于目标IP地址为匹配依据设置的路由规则, 策略路由则更加灵活。 Linux可以配置很多很多策略,数据包将依次通过各个策略,一旦匹配某个策略则进一步应用策略对应的路由表,如果当前路由表无法匹配到路由则继续执行后续策略匹配。

从网上找了一张很形象的图片:
Linux路由选择与策略路由_第16张图片

策略路由样貌

使用ip rule show查看策略数据库的内容,即当前系统使用的路由规则

[root@localhost /]# ip rule show  
0: from all lookup local
32765: from 135.105.115.149 lookup 231
32766: from all lookup main  
32767: from all lookup default

策略路由由三部分组成:

  • part1:优先级,也就是上图中的0, 32766, 32767,数字越小优先级越高。
  • part2:条件,比如from all, from 135.105.115.149
  • part3:操作,比如lookup main 、 lookup 231

综上:32765: from 135.105.115.149 lookup 231 代表的含义是, 源地址是135.105.115.149的IP包,根据231号路由表进行路由。

路由策略工作原理

rule和table是如何协作的?会根据优先级依次遍历,直到决策出下一跳

例如: 一个IP报文源地址是135.105.115.180, 目的地址是155.18.49.20

  1. 判断路由策略0, 符合条件from all, 去查找local 路由表,local表中根据目的地址,最长匹配规则找不到路由
  2. 进而判断路由策略路由32765, 该策略源地址是135.105.115.149的, 去查找231号表。 不满足。
  3. 进而判断32766, 该路由策略的条件是from all满足。 去查找路由表main, 其中可以找到下一跳, 进而转发IP包。

iproute工具使用

早期在管理Linux系统的网络时,常使用ifconfig及route之类的命令,而这类工具并无法用于功能强大的基于策略的路由机制,取而代之的工具是iproute,该工具在我们的Linux系统中时默认安装的,可以通过ip -V命令检查工具是否安装

[root@localhost /]# ip -V
ip utility, iproute2-ss181023
路由表管理

之前介绍到的route命令仅能操作一个特定的路由表,但在基于策略的路由中,会同时存在多个路由表,所以route命令将不再适用,转而使用ip命令管理路由表

1. 查看路由表内容
  • 使用ip rule showcat /etc/iproute2/rt_tables命令来查看目前使用了哪些路由表
  • 使用 ip route show [table id | name] 命令来查看路由表的内容
[root@localhost /]# ip rule show  
0: from all lookup local  
32766: from all lookup main  
32767: from all lookup default
[root@localhost /]# cat /etc/iproute2/rt_tables
#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep
[root@localhost /]# ip route show table main  
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1 
192.168.2.0/24 dev eth1 proto kernel scope link src 192.168.2.1  
default via 192.168.1.254 dev eth0  

在默认情况下,Linux系统创建了4张路由表,这四个路由表的功能如下 :

  • 系统保留表:table id 0

  • local:table id 255,本地路由表存有本地接口地址,广播地址,以及NAT地址 。由系统自动维护,管理员不能操作此表 。

  • main:table id 254,主路由表,使用传统命令route -n所看到的路由表就是main的内容。Linux系统在默认情况下使用这份路由表的内容来传输数据包。正常情况下,只要配置好网卡的网络设置,便会自动生成main路由表的内容。

    如上图所示,

    • 因为我们的设备上有eth0及eth1两块网卡,且为其设置的IP分别是192.168.1.1/24和192.168.2.1/24,因此路由表内的第1行告诉系统,如果有数据包要送到92.168.1.0/24这个网段,就直接将数据包由eth0接口送出即可,而本机临近这个网段的IP是192.168.1.1,第2行同理;以上这两行是只要将计算机网卡上的IP设置好,并在网络服务重启之后,默认就会生成的路由,无需特别的设置,类似与路由器中的直连路由。
    • 最后一行是默认路由,表示如果数据包不是送往192.168.1.0/24及192.168.2.0/24的网段时,那么数据包将统一转发给192.168.1.254的主机(一般是路由器)去处理,而192.168.1.254就是我们在网络配置中所设置的默认网关
  • default:table id 253, 默认路由表,这个路由表在默认情况下内容为空 ,一般可将默认路由添加在该表中。

2. 添加路由

使用ip route add命令添加路由到所需的路由表中,route命令默认添加路由到main表,ip命令不指定路由表也默认添加到main表中。

[root@localhost /]# ip route show table main  
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1 
192.168.2.0/24 dev eth1 proto kernel scope link src 192.168.2.1  
[root@localhost /]# ip route add default via 192.168.1.254 table 254
[root@localhost /]# ip route add 192.168.3.0/24 via 192.168.1.1 table main  
[root@localhost /]#  
[root@localhost /]# ip route show table main   
default via 192.168.1.254 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1  
192.168.2.0/24 dev eth1 proto kernel scope link src 192.168.2.1
192.168.3.0/24 via 192.168.1.1 dev eth0
3. 删除路由

使用ip route del命令删除路由,若不指定路由表,则会默认删除路由表main的中路由条目。

[root@localhost ~]# ip route show table 10   
192.168.1.0/24 dev virbr0 scope link  
default via 192.168.1.254 dev eth1  
[root@localhost ~]#  
[root@localhost ~]# ip route del default table 10   
[root@localhost ~]#  
[root@localhost ~]# ip route show table 10   
192.168.1.0/24 dev virbr0 scope link  
[root@localhost ~]#  
[root@localhost ~]# ip route del 192.168.1.0/24 table 10   
[root@localhost ~]#  
[root@localhost ~]# ip route show table 10   
[root@localhost ~]# 
规则管理
1. 查看规则

使用ip rule show查看策略数据库的内容,即当前系统使用的路由规则

[root@localhost /]# ip rule show  
0: from all lookup local
32766: from all lookup main  
32767: from all lookup default
2. 添加规则

在添加规则时,必须先确定好条件优先级别路由表ID,此后才可以执行添加规则的操作。

  • 条件: 条件是用来决定哪类数据包可以符合这项规则,而可用来匹配的字段为Source IP、Destination IP、Type of Service、fwmark及dev等,这些字段的使用方式如下

    • Source IP:根据来源端IP来决定数据包参考哪个路由表发送出去。
      以下两个示例分别指出,如果数据包的来源端IP是192.168.1.10,就参考路由表10;如果来源端IP为192.168.2.0/24网段的IP,就参考路由表20
    [root@localhost /]# ip rule add from 192.168.1.10 table 20
    [root@localhost /]# ip rule add from 192.168.2.0/24 table 10
    [root@localhost /]# ip rule show
    
    [root@localhost /]# ip route show table 10
    [root@localhost /]# 
    #此时并看不到路由表10,因为没有添加路由到表10中
    [root@localhost /]# ip route add 192.168.1.0/24 dev eth1 table 10
    [root@localhost ~]# ip route add default via 192.168.1.254 table 10
    [root@localhost ~]# ip route show table 10   
    192.168.1.0/24 dev eth1 scope link  
    default via 192.168.1.254 dev eth1
    
    • Destination IP: 根据目的端IP来决定数据包参考哪个路由表发送出去。

    以下两个示例分别指出,如果数据包的目的端IP是168.95.1.1,就参考路由表10;如果目的端IP是168.95.0.0/24网段的IP,就参考路由表20

     [root@localhost /]# ip rule add to 168.95.1.1 table 10  
     [root@localhost /]# ip rule add to 168.96.0.0/24 table 20 
    
    • dev: 使用数据包输入的接口来作为判断依据。
      Linux路由选择与策略路由_第17张图片

    我们希望凡是由eth2接口送入的数据包都由eth0接口转发出去,由eth3接口送入的数据包都由eth1接口转发出去。以下命令组合将能满足我们的要求

     [root@localhost /]# ip rule add dev eth2 table 1
     [root@localhost /]# ip rule add dev eth3 table 3
    
  • 优先级别

    前面介绍了规则中条件的使用方式,接下来要讨论的是优先级别。优先级别用数字来表示,其范围由0~4亿多个。 添加规则时,如果没有特别设置优先级别,那么,优先级别默认会从32766开始递减,如32765、32764……,如果我们需要特别设置优先级别,可以在ip rule add命令的最后加上prio XXX参数。

    [root@localhost ~]# ip rule show  
    0: from all lookup local  
    32766: from all lookup main  
    32767: from all lookup default  
    [root@localhost ~]#  
    [root@localhost ~]# ip rule add from 192.168.1.0/24 table 1 prio 10  
    [root@localhost ~]# ip rule add from 192.168.2.0/24 table 2 prio 20  
    [root@localhost ~]#  
    [root@localhost ~]# ip rule show  
    0: from all lookup local  
    10: from 192.168.1.0/24 lookup 1  
    20: from 192.168.2.0/24 lookup 2  
    32766: from all lookup main  
    32767: from all lookup default
    
  • 路由表id:在Linux的基于策略的路由中,路由表用ID来表示。

:创建完路由规则若需立即生效须执行以下命令,用以刷新路由缓冲

[root@localhost ~]# ip route flush cache
3. 删除规则

ip命令提供的删除规则的方式十分灵活,例如,要删除下列第2条规则,可以分别使用“优先级别”、“条件”及“路由表”当中任何一个唯一的值来设置所需删除的规则,如下:

[root@localhost ~]# ip rule show  
0: from all lookup local  
10: from 192.168.1.0/24 lookup 1  
20: from 192.168.2.0/24 lookup 2  
32766: from all lookup main  
32767: from all lookup default
[root@localhost ~]# ip rule del prio 10
[root@localhost ~]# ip rule del from 192.168.1.0/24  
[root@localhost ~]# ip rule del table 1  
[root@localhost ~]# ip rule del from 192.168.1.0/24 table 1 prio 10 
实例分析

我们的设备通过网线直连了10.6.124.0/24网段, 设备ip为10.6.124.206,要求使用自己配置的路由策略完成路由

  • 查看一下当前设备的ip,rule和table
[root@localhost /]# ifconfig
eth0      Link encap:Ethernet  HWaddr 6E:1E:DC:7D:B2:28
          inet addr:10.6.124.203  Bcast:10.6.124.255  Mask:255.255.255.0
          inet6 addr: fe80::6c1e:dcff:fe7d:b228/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:105989 errors:0 dropped:14985 overruns:0 frame:0
          TX packets:43 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:70277805 (67.0 MiB)  TX bytes:3330 (3.2 KiB)
          Interrupt:199

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[root@localhost /]# ip rule show
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
[root@localhost /]# ip route show table main
10.6.124.0/24 dev eth0 scope link  src 10.6.124.203
  • 在当前已有的规则下,若要和网段10.6.124.0/24下的设备网路通信,走的是优先级为32766的rule,查询的是main表;
    对于不在eth0直连网段内的设备,在当前的规则下找不到任何匹配的如有条目,网络不可达。
[root@localhost /]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
ping: sendto: Network is unreachable
[root@localhost /]# ip route get 8.8.8.8
ip: RTNETLINK answers: Network is unreachable
  • 添加规则,条件设置为源IP地址为all,优先级设置8,查询的路由表id为10
[root@localhost /]# ip rule add from all table 10 prio 8
  • 添加路由,

    由于网线在eth0上直连了10.6.124.0/24网段,所以这个网段的可以直接通过eth0网卡通信

    对于不在eth0直连网段内的设备, 则发给网关10.6.124.254,由它进一步路由向外转发

[root@localhost /]# ip route add 10.6.124.0/24 dev eth0 table 10
[root@localhost /]# ip route add default via 10.6.124.254 dev eth0 table 10
[root@localhost /]# ip route show table 10
default via 10.6.124.254 dev eth0 
10.6.124.0/24 dev eth0 scope link
[root@localhost /]# ip rule show
0:      from all lookup local
8:      from all lookup 10
32766:  from all lookup main
32767:  from all lookup default
  • 测试

    测试网络是否能正常通信,ping一下我的服务器10.6.124.15

    测试是否使用了table 10,此时已匹配到目的地址为8.8.8.8的路由条目,说明使用了table 10

[root@localhost /]# ip route flush cache
[root@localhost /]# ip route get 10.6.124.15
10.6.124.15 dev eth0  src 10.6.124.203
[root@localhost /]# ip route get 8.8.8.8
8.8.8.8 via 10.6.124.254 dev eth0  src 10.6.124.203

你可能感兴趣的:(Linux网络协议栈,linux,网络)