二层交换、三层路由:
交换位于OSI七层模型的第二层数据链路层, 数据帧被封装了以太网头部,其中记录了目标网路的mac地址。
路由位于OSI七层模型的第三层网络层,数据包被封装了IP头部,其中记录了源IP地址和目的IP地址。
二层交换、三层路由:
交换位于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路由表是路由器能够工作的关键,相当于数据包转发的地图。在计算机网络中,路由表( routing table )又被称作路由信息数据库( Routing Information Base ),简称RIP。
具备路由功能的华为数通产品(例如路由器,三层交换机等等)使用display ip routing-table
命令查看路由表
关键项 | 说明 | 举例 |
---|---|---|
目标网络/掩码 | 目标网络加掩码长度,区别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,这个直连接口的网络号就会被自动写入到路由表中,形成一个直连的路由表表项。
静态路由 – 由网络管理员手工配置的路由条目
静态路由举例:R1可以创建两条分别去往192.168.100.0/24和192.168.20.0/24网段的路由。静态路由便捷可控,但是若目标网络较多,就需要配置多个静态路由,面多规模较大的网络就显得力不从心,并且静态路由也无法相应拓扑动态的变化,若192.168.100.0/24这个网络发生故障,R1感知不到仍会将数据包转发给R2,R2则会把数据包丢弃。
默认路由举例:R1若要和192.168.100.0/24、192.168.101.0/24、192.168.102.0/24…的网段通信,一种方法是为每一个目标网络配置一条静态路由,如下面第一张如所示,另一种方法是配置一条默认路由(缺省路由),如下图二所示,默认路由可以匹配任意目的网络,路由表中没有其他表项可以匹配时则会去匹配默认路由,相当于一个最后的手段。
动态路由 – 路由器通过动态路由协议学习到的路由
Ping – 测试网络连通性
Tracert – 追踪去往目标节点的沿途每一跳IP地址
display ip routing-table – 查看路由表
display ip interface brief – 接口摘要信息
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 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
echo 1 > /proc/sys/net/ipv4/ip_forward
路由汇总一般指路由汇聚,路由汇聚的“含义”是把一组路由汇聚为一个单个的路由广播。路由汇聚的最终结果和最明显的好处是缩小网络上的路由表的尺寸,上述的默认路由也属于路由汇总。
路由汇总,又被称为路由聚合(Route Aggregation,或route summary),即是将一组有规律的路由汇聚成一条路由,从而达到减小路由表规模以及优化设备资源利用率的目的。
路由汇总是一个非常重要的网络设计思想,一个可汇总的网络设计方案将使得我们的网络更加优化、路由条目更加精简、网络管理更加简单。在网络设计及部署中应时刻保有路由汇总的意识。
不仅仅静态路由能够部署路由汇总,动态路由协议也都支持路由汇总功能。
汇总路由的精确计算
现有明细路由:172.16.1.0/24至172.16.31.0/24,计算最精确的汇总路由,为172.16.0.0/19
当路由器将目的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-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
完成三台路由器的配置,使得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
区别:
优缺点:
前面讲的路由规则都是基于目标IP地址为匹配依据设置的路由规则, 策略路由则更加灵活。 Linux可以配置很多很多策略,数据包将依次通过各个策略,一旦匹配某个策略则进一步应用策略对应的路由表,如果当前路由表无法匹配到路由则继续执行后续策略匹配。
使用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
策略路由由三部分组成:
综上: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
早期在管理Linux系统的网络时,常使用ifconfig及route之类的命令,而这类工具并无法用于功能强大的基于策略的路由机制,取而代之的工具是iproute,该工具在我们的Linux系统中时默认安装的,可以通过ip -V
命令检查工具是否安装
[root@localhost /]# ip -V
ip utility, iproute2-ss181023
之前介绍到的route命令仅能操作一个特定的路由表,但在基于策略的路由中,会同时存在多个路由表,所以route命令将不再适用,转而使用ip命令管理路由表
ip rule show
或cat /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路由表的内容。
如上图所示,
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 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
使用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 ~]#
使用ip rule show
查看策略数据库的内容,即当前系统使用的路由规则
[root@localhost /]# ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
在添加规则时,必须先确定好条件、优先级别及路由表ID,此后才可以执行添加规则的操作。
条件: 条件是用来决定哪类数据包可以符合这项规则,而可用来匹配的字段为Source IP、Destination IP、Type of Service、fwmark及dev等,这些字段的使用方式如下
[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
以下两个示例分别指出,如果数据包的目的端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
我们希望凡是由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
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,要求使用自己配置的路由策略完成路由
[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
[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
[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