router-ip-bg

路由的基本概念

互联网上数据通过IP协议进行转发传输,基于路由器、交换机、防火墙、负载均衡器等设备进行转发,这些设备上都会维护自己的路由表,通过路由表来进行IP寻址

路由表

image-20230606182347729
  • 目的网络地址/掩码:路由指向的目的网段(注意是远端网段)
  • 路由协议:Static是通过手工配置的静态路由,OSPF是一个路由协议自动学习路由信息
  • 优先级:数值越小优先级越高,静态路由的默认优先级为60
  • 度量值:只本条路由到达目的网段的代价值,直连路由和静态路由的默认代价值为0,不同的路由协议有自己的度量值计算方式
  • 下一跳:下次转发到的路由器接口网段,可能要经过多次转发才能到达目的网段
  • 出接口:数据转发出去的路由器接口

路由信息的来源

  • 直连路由:路由器能自动获本设备直连接口的路由并写入路由表,加载到路由表的前提是该接口的物理状态和协议状态,也就是说即使物理接线也可以通过禁用协议来屏蔽该接口路由
  • 静态路由:直连路由不能发现远端网络,可以手动配置,弊端是互联网结构复杂工作量太大且不能灵活变通
  • 动态路由:通过动态路由设备间可以交互信息自动计算和发现网络中的路由

路由优先级

image-20230606184225751

图中,R2可以通过R1或者R3到达1.1.1.0/24网段,但是由于OSPF协议优先级高于RIP,所以R2最终选择通过R3进行转发

路由度量值

之前说过,直连和静态路由的度量值都是0,因为是直连所以不用中间转发,所以认为没有开销;不同动态路由协议对度量值的计算方式不同,比如RIP是通过转发跳数作为度量值,而OSPF则以链路带宽资源作为度量值

image-20230606185036320

综合来说,路由器可以通过多种途径获得路由信息,当路由协议不同时,会通过优先级来选路,同协议下通过度量值来选路,当然这只是一个基础的思路,实际上像OSPF或者BGP等在路由选优时策略更为复杂

静态路由

静态路由就是手动配置的路由,本身概念非常简单,这里举一个配置的案例

配置案例

image-20230606190109027

初始状态

如图所示,当R1和R2都没有开启动态路由时,我们为两个PC设置网卡IP地址和默认网关地址(直连路由器接口的IP地址),两个路由会探测到他们直连设备的路由信息

此时让PC1发送数据给PC2,也就是192.168.1.1/24发送到192.168.2.1/24,首先PC1的本地网卡会对目标IP地址和掩码进行运算,发现不是局域网地址不能通过二层转发达到,所以将报文发送给默认网关也就是R1,此时R1上有R2的路由(192.168.12.2/24),但是没有PC2网段的路由,所以数据包被丢弃

在R1配置静态路由

在R1上配置到192.168.2.1/24的路由

ip route-static 192.168.2.0 24 GE0/0/0 192.168.12.2

当PC1将数据包发送给R1时,R1就知道通过R2可以达到该网段,所以此时数据可以被发送到PC2,但是此时PC1和PC2还是不能正常通信,因为双向通信要双向路径可达,PC2回复PC1的数据无法转发成功

在R2配置静态路由

在R2上做R1差不多的配置,这样PC1就可以ping通PC2了,通过这个案例可以看出,在最简单的网络模型下通过静态路由配置是没问题的,但实际的网络是非常复杂的,还是需要通过动态路由协议来配置路由

配置规则

image-20230606192612448

上图中是三种接口类型

BMA广播型多路访问

图中R1到R2,由于中间接入了一个交换机,所以此时从GE0/0/0接口发出的数据可以被多个目标IP段接收,此时配置到2.2.2.0/24网段的静态路由需要明确指定下一跳地址为10.1.12.2,否则可能无法正常转发

来看一下如果不配置下一跳地址时,R1会认为2.2.2.0/24是直连网段,加上该接口是一个BMA接口,当R1向2.2.2.0/24转发数据包时(例如2.2.2.2)会从该接口广播ARP报文,R2收到这个ARP请求是不会回应的,因为它的地址不是2.2.2.2,所以此时R1无法将数据包转发到目的IP

但是对于这个场景,可以通过激活R2的GE0/0/0接口上的ARP代理,该接口收到对2.2.2.2的ARP请求是,由于R2直连这2.2.2.0/24网段,它会回应这个ARP请求,回复的是自己GE0/0/0接口的MAC地址,这样R1会在其ARP表中创建一个数据项,将2.2.2.2与R2的GE0/0/0接口的MAC地址进行绑定,这样R1会将数据发往R2的GE0/0/0接口,R2接收到数据后拆包发现IP在本地直连网段,于是重新封装数据帧并发给2.2.2.2

NBMA非广播多路转发

图中R1到R3,通过帧中继的方式可以实现NBMA,这种接口同样可以接入多台设备,但并不支持广播,此时也是需要指定下一跳地址

P2P点对点

图中R1到R2,此时由于是一对一,所以可以不指定下一跳地址

默认路由

image-20230608115416946

图中是一个企业的网络结构,OR 路由器作为企业所有终端和公网连接的出入口,公网中的网段规模巨大,显然 OR 上不可能把所有的网段路由都记录到路由表中,此时可以使用默认路由

1
2
3
4
5
6
BASH
# OR设备路由配置
ip route-static 0.0.0.0 0 200.1.1.1
ip route-static 10.11.0.0 16 10.1.1.1
ip route-static 10.12.0.0 16 10.1.1.5
ip route-static 10.13.0.0 16 10.1.1.9

0.0.0.0/0 为默认路由,任意目的地址的数据包都可以通过默认路由进行转发,但是默认路由的优先级是最低的(通过最长前缀匹配原则实现),也就是说对于 OR 来说,目的 IP 为站点 1 网段的数据包会被转发到 GW1(10.1.1.1)上,再由 GW1 转发到站点 1,同样的 GW1、2、3 上都可以通过配置默认路由来让员工对公网的请求转发给 OR,以此实现内外网通信

浮动静态路由

image-20230608145944853

如图所示,R2 访问 10.9.9.0/24 通过 R1 和 R3 都可以,而且静态路由配置权重也是一致的,所以正常情况下数据会随机进行选路,也可以指定路由优先级,来达到主从效果

1
2
3
4
BASH
# 默认优先级为60
ip route-static 10.9.9.0 24 10.1.12.1
ip route-static 10.9.9.0 24 10.1.23.3 preference 80

配合 BFD

image-20230608155142428

在以上的案例中,R2 通过静态路由配置与 10.9.9.0/24 网段通信,当 R2 的 GE0/0/0 接口或者与 SW 之间的链路出现故障时,R2 上到 R1 的路由会自动失效,但是如果是 R1 上接口或者 R1 和 SW 之间链路出现故障,这个时候 R2 是感知不到的,流量仍然会被转发到 SW 然后被丢弃

上面问题的成因是静态路由无法感知到网络拓扑的变化,可以加入 BFD(双向转发检测)机制来解决,通过配置 BFD 规则来探测 R2 和 R1 的通信是否正常来决定对应的路由规则是否生效解决问题,这里不详细探究配置方式

配合 NQA

NQA(network quality analysis 网络质量分析)工具,这个东西可以对网络响应时间、抖动、丢包率等信息进行统计,实时采集网络各项运行指标,当然也包括基础的 IP 可达性检测,支持常见的协议 TCP、UDP、SNMP、HTTP、DNS、FTP 等,所以也可以用 NQA 来协助静态路由检测网络拓扑变化

AB 互 ping 问题

A 能 ping 通 B,B 不能 ping 通 A

情景一:防火墙

image-20230608162006194

PC1 能 ping 通 PC2,PC1 发往 PC2 的数据包不会被拦截,当 PC2 回复 PC1 时,防火墙会对比自己缓存的会话表中的五元组,能匹配上所以认为是一个回程流量通行

PC2 ping PC1 时,由于区域不可信,所以数据包会被防火墙拦截

情景二:路由配置

image-20230608162328494

由于路由规则不同,R1 ping pc 时会通过 R4 线路,即源 IP 为 10.1.14.1,该线路能正常通信,PC 如果 ping R1 的 10.1.12.1 时 R2 线路的路由没有进行配置,故而不通,那么 PC ping R1 的 10.1.14.1 应该是能相互通的

静态路由不同配置

image-20230608163159795

R1 上 GE0/0/0 接口为 BMA(例如以太网接口),以下几种静态路由配置方式会导致不同的结果

1
2
3
4
5
6
7
8
9
10
11
# 配置1
ip route-static 3.3.3.0 24 10.1.12.2 # 这是推荐的配置,R2上同样需要有3.3.3.0 24的路由

# 配置2
ip route-static 3.3.3.0 24 GE0/0/0 # 此时R1会从GE0/0/0接口发送ARP请求,如果R2的GE0/0/0接口上激活了ARP-Proxy那么可以正常转发,否则失败

# 配置3
ip route-static 3.3.3.0 24 GE0/0/0 10.1.23.3 # 这个时候R1会认为10.1.23.2是GE0/0/0接口直连的,同样发送ARP请求,童谣需要R2激活ARP-Proxy

# 配置4
ip route-static 3.3.3.0 24 10.1.23.3 # 无法递归找到10.1.23.3 IP,添加配置ip route-static 10.1.23.0 24 10.1.12.2,此时可以通过R2递归找到10.1.23.3完成转发

动态路由

静态路由需要手动配置,在大规模的网络系统中,通常使用动态路由,基于协议算法可以分为距离矢量路由和链路状态路由

距离矢量路由协议

运行距离矢量路由协议的路由设备会周期的将自己的路由表通告和自己直连的路由器,收到通告的设备会更新自己的路由表,然后再向和自己直连的路由器发出通告,最终网络中的每台路由器都能获知到达各个网段的路由,这个过程被称为路由的泛洪(flooding)

image-20230629181933791

在上面的网络中,R2和1.0.0.0/8网段是不通的,但是通过激活距离矢量路由协议,R1会告诉R2该网段为自己的直连网段,R2收到并配置到自己的路由表后即可和网段进行连通;

运行距离矢量路由协议的路由器不了解网络的拓扑结构,只知道自己与目标网段之间的距离和从哪个方向可以到达

链路状态路由协议

运行链路状态路由协议的路由设备会生成自己直连接口的链路状态信息(网络的拓扑结构和IP网段),网络中所有的链路状态信息会被存储到一个LSDB(链路状态数据库),所有的路由器都基于LSDB计算出一棵以自己为根的、无环的最短路径树,并将这棵树得到的路由加载到路由表中

最长前缀匹配

image-20230630161907982

在上图所示的网络结构中,当R4收到一个去往172.16.2.1的数据包时,对三个路由的网络掩码进行逻辑与运算,结果是路由1不匹配,路由2匹配长度为24,路由三匹配长度为16,最终采用路由2进行转发

image-20230630162618511

在上图所示的网络结构中,EBR1和2两个路由器为企业边界路由设备,企业对其有操作权限,X为上连运营商设备没有操作权限,现在通过如图所示路由配置即可实现,公网流量默认通过EBR-1进行转发,当1宕机时,流量切换到2实现冗余转发路径

路由汇总

image-20230630172211811

通过路由汇总的方式可以减少路由条目,同时需要合理的控制精度,避免过度覆盖,如下所示

image-20230630172724041

R1上的汇总路由过度覆盖,导致R3的的网段无法正常转发,正确的配置:

ip route-static 172.16.0.0 19 10.1.12.1

ip route-static 172.16.32.0 19 10.1.12.3

隐患

image-20230630173620694

在以上的网络结构中,如果攻击者向R1发送大量192.168.3.0/24网段中任意IP(例如192.168.3.1)的垃圾报文,R1会将报文发送给R2,R2再转发给R1形成环路,直到报文TTL值递减到0,这个过程中会重复占用R1与R2之间的带宽资源影响到正常的数据包传递,解决方案,R1添加配置:

ip route-static 192.168.0.0 22 Null0

这是一条黑洞路由配置,由于其最长前缀匹配低于三个直连网段高于指向R2的默认路由,所有去往192.168.3.0/24的数据包的出接口为Null0,即被丢弃

黑洞路由

上面解决环路问题的方式就是使用了黑洞路由,一条路由规则一般都有对应的出接口,出接口的类型可以是物理接口(百兆、千兆以太网)、逻辑接口(vlan)或是隧道等,有一种特殊接口Null为无效接口只有一个编号0,该出接口表示报文直接丢弃,出接口为Null0的路由被称为黑洞路由,黑洞路由常见作用:

  • 进行网络屏蔽
  • 在路由汇总中防止出现转发环路
  • 在NAT网络中防止出现转发环路
  • 在BGP网络中发布特定网段路由

路由表与FIB表

image-20230630175508792

路由器上维护着每种路由协议自己的路由表,路由器根据优先级和度量值等信息来进行路由选优,被选出来的路由存储到全局路由表(我们一直说的路由表就是这个),路由器会将路由表中活跃的路由下载到FIB(Forwarding Information Base),这个过程是缓存的概念,全局路由表存储在内存中,而FIB存在集成电路中,访问速度高于内存,同样的空间小于内存,所以平时路由器选择转发路径是面向FIB做的,但我们简单的认为是通过查询路由表来实现的