Linux路由选择和策略路由

OSI七层参考模型



交换位于第二层数据链路层,数据帧被封装了以太网头部,其中记录了目标网路的mac地址
路由位于第三层网络层,数据包被封装了IP头部,其中记录了源IP地址和目的IP地址

路由引入

问题1:在同一网段的192.168.0.1/24和192.168.0.2/24两台主机需要通信,如何实现?
在相同网段,通过ARP广播来获取到目的主机的mac地址,从而将数据封装成数据帧后通过物理线路通信
问题2:在不同网段的192.168.0.1/24和172.16.1.2/24两台主机需要通信,如何实现?
由于源IP和目标IP是跨网段的,需要路由器负责转发数据包,每个路由器维护一个路由表。路由表中维护了许多路由条目,成为route,每个route包含了对应的目的网络、出接口和下一跳(网关)

路由器

路由器的工作内容:路由器通过各种路由协议(RIP、OSPF)等填充路由表,依据路由表的条目转发数据包

路由条目根据来源分类:

  • 直连路由:直接接口所在网段的路由

初始化情况下,路由器所知的网段,只有其直连接口所在网段。路由器自动将接口所在网段的路由写入路由表,这些路由被称为直连路由,路由表中的protocol为direct

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

静态路由便携可控,但是面对规模较大的网络就显得力不从心,并且静态路由无法相应拓扑动态变化

  • 默认路由:这是一条特殊路由,可匹配任何目的IP地址,默认路由的下一跳可视为该设备的缺省网关

当网络设备转发一个报文时,如果路由表中存在匹配该保温目的IP地址的路由表项,则使用该表项转发这个报文;如果没有任何具体的路由表项匹配则使用默认路由转发;如果没有匹配表项也没有默认路由则该报文被丢弃

  • 动态路由:通过路由协议学习到的路由

根据路由类型分类

  • 主机路由:路由表项中只想单个IP地址或主机名的路有记录,主机路由的Flags字段为H
  • 网络路由:代表主机可以到达的网络,网络路由的Flags为N
  • 默认路由:查找不到目标主机IP地址或网路的路由时,被发送到默认路由(默认网关),默认路由的Flags为G》
# Linux系统打开路由转发功能
echo 1 > / proc/sys/net/ipv4/ip_forward

路由查找的最长匹配原则

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

实例分析


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-static192.168.23.624192.168.12.2
route add-net192.168.23.0/24eth1gw192.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-static192.168.12.624192.168.23.1
route add-net192.168.12.6/24eth1gw192.168.23.1

Liunx的策略路由

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

策略路由样貌

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

策略路由由三部分组成:

  • 优先级,也就是0 32766 32767,数字越小优先级越高
  • 条件,from all或者from 172.12.16.0/24
  • 操作,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包。

路由表管理

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

查看路由表内容
  • 使用ip rule show 或者cat /etc/iproute2/rt_tables命令来查看目前使用了哪些路由表
  • 使用ip route show [table id|name]命令来查看路由表的内容
[rootolocalhost /]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,默认路由表,默认情况下内容为空,一般可将默认路由添加到该表中
添加路由

使用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 ethe
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.g/24via192.168.1.1 dev eth0
删除路由

使用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 ~]
[rootolocalhost ~ip route del default table 10
[rootolocalhost ~]
[rootolocalhost ~]ip route show table 10
192.168.1.0/24 dev virbr0 scope link
[root@localhost ~]
[rootolocalhost ~]ip route del 192.168.1.0/24 table 10
root@localhost ~
[rootolocalhost ~]ip route show table 10
[root@localhost ~]

规则管理

查看规则

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

添加规则

规则的条件可用来匹配的字段为source ip、destination ip、type of service、fwmark及dev等(fwmark需要配合iptables使用)

  • source ip:根据来源ip来决定数据包参考哪个路由表发送出去
[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 ethl 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来决定数据包参考哪个路由表发送出去
[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: 使用数据包输入的接口来作为判断依据
[rootelocalhost /]ip rule add dev eth2 table 1
[rootelocalhost /]ip rule add dev eth3 table 3
  • 优先级别:需要设置优先界别可以在ip rule add命令的最后加上prio XXX参数
[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
[rootolocalhost] ip rule show
0:from all lookup local
10:from192.168.1.6/24100kup1
20:fr0m192.168.2.6/2410okup2
32766:from all lookup main
32767:from all lookup default

注意:创建完路由规则若需立即生效需执行以下命令

ip route flush cache
删除规则

ip命令删除规则的方式十分灵活,可以分别使用优先级别、条件及路由表当中任何一个唯一的值来删除规则

[rootolocalhost ~]ip rule show
0:from all lookup local
10:fr0m192.168.1.6/2410okup1
20:fr0m192.168.2.0/24100kup2
32766:from all lookup main
32767:from all lookup default
[rootolocalhost ~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

本文的内容摘抄于Linux路由选择和策略路由

posted @ 2022-04-30 12:09  無花無酒鋤作田  阅读(2336)  评论(0编辑  收藏  举报