数据转发原理
//抓包看ARP的报文结构:
注意Opcode: 1=request (ARP) 2=reply(ARP)
3=request(RARP) 4=reply(RARP)
![](https://i-blog.csdnimg.cn/blog_migrate/55f4dfa77335a44e54fda9581911dfa7.jpeg)
*****************************************************************************
普通ARP
##普通ARP的request报文:
广播(获取目的IP地址的MAC);
目的收到request报文,先检查二层,检查二层数据帧:单播帧/组播帧/广播帧,不同数据帧目的MAC地址是不一样的,单播是个单播MAC地址,广播是一个广播MAC地址;组播是一个组播MAC;
由于request请求报文是通过广播发送的,广播帧通过二层的目的MAC地址是判断不出来是给谁的,因为广播是给大家的;需要拆了二层看三层,通过上层协议去判断这个报文是不是给我的。上层的协议是ARP协议,ARP会看目标IP ADDRESS,看目标IP地址是不是自己接口的IP地址;如果不是,丢弃掉有两种可能:
*
1->3
ARP请求被广播到2、3上,
拆了2层看3层,
通过ARP进程判断目标的IP地址是不是自己接口的IP,如果不是,2丢弃;不会生成ARP MAP;
3会生成ARP表项,到达1的IP地址绑定一个MAC地址;严格的ARP,也不会生成对应关系,是为了避免攻击。
ping的时候不同,第一个包是为了发送ARP的。
![](https://i-blog.csdnimg.cn/blog_migrate/0f09c4a38eb4b592251743b8772e8953.jpeg)
【拓展】:wireshark是一个抓包工具,原理:首先wireshark会改变你的端口的一个工作模式,会把网卡改成混杂模式,不改成 混杂模式抓不到包的;一个 端口收到数据帧要先通过目的MAC地址是不是接收的目的MAC地址,判断这个是不是给自己的。抓包是 通过
SPAN(镜像)的方式把网络中的数据帧映射过来;改端口的模式:改成混杂模式这个接口就不会去判断这个数据帧目标的MAC地址是不是自己接口的MAC了,只要收到数据帧全部看。(类比快递,不看收件人,全部都要)
【拓展】:现在的一些开发人员也不会去拆这个头部,比如上网行为管理设备,实际上是可以看包的内容的,
DPI(深度报文检测),是通过指针偏移,计算好包头到数据的部分一共多少个字节,然后指针偏移,看包的数据部分做一个匹配。
![](https://i-blog.csdnimg.cn/blog_migrate/03ea2a4731d39e209774412a756cbb1d.jpeg)
##接收者回送reply报文:单播
***********************************************************************************
免费ARP
自己给自己发送一个ARP请求,获取一个目标地址的MAC
1.检测IP冲突 2.更新MAC地址
![](https://i-blog.csdnimg.cn/blog_migrate/56fae186665d785a05351a68310de2f9.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/b1c4bdca936b1ae756c6863a3d565a37.jpeg)
##检测IP冲突
目标MAC地址的填充是0或者F没有啥区别和厂商有关系;
发送方的IP地址是自己的IP,目标方的IP地址也是自己的IP;
自己给自己发送ARP报文,如果收到了应答,就是有冲突;
##更新MAC地址
防止一个ARP欺骗,同时也是一个ARP欺骗的来源;
ARP欺骗工具:P2P终结者、聚生网管
ARP欺骗:
冒充其他人发送ARP报文(冒充网关)
HACK可以 冒充网关发送一个免费ARP,刷新MAC地址绑定;
PC想上网,数据全部交给路由器,通过路由器去做转发。
PC想上网,首先要请求网关的MAC地址,获取MAC地址以后会在本地生成ARP的映射表;后续会根据映射表去封装二层目的MAC;
HACK可以去冒充网关的 设备去发送免费ARP,IP是网关的IP,MAC用自己的MAC地址,发送免费ARP;
PC收到免费ARP会刷新自己的MAC地址绑定表;刷新以后,后续的数据会全部发给HACK了,因为会用HACK的MAC地址做一个二层封装;
HACK针对这个报文会做限速,或者丢弃;转发给路由器,转发的同时做个限速,同时也会抓取到网络上的所有报文,会造成网络的安全问题,可以抓取到密码或者聊天记录;
防止ARP欺骗:
(1)在PC上做一个ARP的静态绑定;静态绑定,免费ARP是无法刷新的;在PC上去绑定一个网关的MAC地址;
(2)或 在路由器上每隔2秒钟或者每隔5秒钟自己发送一次免费ARP,往回刷回来;但这种方法其实也不太好,在网络里面短时间发送大量的ARP也算是一种攻击;会占用带宽;
(3)最好的方法是通过交换机来抑制这个ARP得欺骗,
采用DAI技术;动态ARP检测,通过这种机制避免ARP的欺骗;
交换机里面有一个表项,可以用于DAI的检测,这个表项可以通过两种方法来进行绑定 :
(1)静态绑定
(2)通过DHCP来生成这个表项;有这个表项以后,再收到ARP的请求或应答,它会检查这个ARP报文发送方的IP地址和MAC地址和绑定的IP地址和MAC地址是否是对应的;如果对应,放行;如果不对应,丢弃;这样就有效避免ARP的欺骗。
DAI-二层交换机就可以用;需要开启DHCP snooping
IP-sourceguard;(IP源Guard)
![](https://i-blog.csdnimg.cn/blog_migrate/be77b4823eb8eaafb4dd8ef9772acf1f.jpeg)
##免费ARP用于冗余协议
VRRP:
HSRP:
GLBP:
企业一般部署双路由,主备做一个冗余或者负载;
*PC->主,PC上GW(网关)配置成主设备的IP地址;
如果主宕机,备设备起作用,需要改PC全部的网关,需要把网关全部配置一遍?不太现实的,是否有方法自动切换不需要改设备?
不去改地址,自动切换设备,用到一种热备协议:
VRRP(公有的协议)
HSRP、GLBP(思科私有的协议)
1.这三个协议的原理都是一样的。两台设备都需要配置VRRP,在接口下去配, 配了一个VRRP以后,会自动在两台设备之间选取一个主备;
2.配了VRRP以后会由主设备定期发送Hello报文,1秒钟发一次,超时时间3秒钟,备设备负责监听;
3.3秒以后备设备没有收到hello报文,会认为主设备挂掉了,备升为主;
主设备-M; 备设备-B;
4.配了VRRP以后,可以指定一个虚拟IP地址为网关地址就可以了;
如:192.16.1.0/24网段; 虚拟ip地址为 192.168.1.254;虚拟MAC可以自动计算;自动做一个映射
5.后续,PC想要上网的话,会发起虚拟IP地址的MAC的请求(发起ARP请求),会被主备都收到,实际上只有主设备才会回送ARP应答;后期发送的虚拟MAC都会绑定到1口;宕机,备升为主,现在流量不通,交换机不知道;
路由器会发送一次免费ARP,给交换机看的
。交换机收到免费ARP会将MAC地址绑定到2口,同时将1口拆除,这样虚拟MAC就绑定到2口了;
![](https://i-blog.csdnimg.cn/blog_migrate/44207f8fa16f867a647e8cb559e2e304.jpeg)
6.后续,数据帧会从2口转发出去到达B这台设备
********************************************************************************* 代理ARP
在广播网里面,一条静态路由写下一跳或者出接口是否都能通?
1上配静态,1上指定出接口E0/0,或者指定下一跳12.1.1.2;
思科里面是全通的,华为里面是不通的(用接口不通,用下一跳是通的);
指定出接口和指定下一跳有什么不同?
指定下一跳,说明到达的目标路由不是本地直连可达的;需要将IP包交给下一跳的设备,由下一跳设备帮忙去转发才能到达目标地址;ARP请求请求的是下一跳的MAC地址;
指定出接口, 会认为到达目标网段是本地直连可达的;说明只要将IP包发出去就会到达目标地址;这样的话,发送ARP请求的话,就会请求目标地址的MAC地址(请求R3的Lo 0口);2会检测,看目标MAC,目标MAC是一个广播MAC,拆2层交给ARP处理,检查目标IP地址,发现ARP报文里面的IP地址并不是自己接口的IP,说明这个ARP请求并不是给我的,2不会回应ARP应答,会将报文丢弃掉。没有MAC的话,1不能封装2层,不能发送数据。
指定出接口,思科里面默认是开启代理ARP的,会通;华为默认是关闭代理ARP的,不通;
代理ARP:如果说2在接口下开启了代理ARP,收到了一个ARP请求,但ARP请求里面的IP地址并不是自己接口下的IP,它会检查自己的路由器表,看看有没有达到目标地址可达的路由;如果有路由的话,2就会把自己接口下的MAC地址作为目标的MAC地址回给发送者;这样,1也能收到ARP应答;1有了MAC, 就可以封装二层,发送数据帧。
在广播网里面一定 要指定下一跳,尽量不要用出接口,实际上最好的方法是连出接口和下一跳同时配置
![](https://i-blog.csdnimg.cn/blog_migrate/467207afbe145cb5586c808cde0d91c7.jpeg)
##【实验验证】
50:21
3745/7200 的思科ISO
Proxy ARP is enabled.
如果下一跳是出接口,这个报文到达R2以后,会发现目的IP地址 不是本接口的IP,但是代理ARP没有开启,会被丢弃掉。
两台PC,一台PC在12网段,一台PC在13网段,在不同的网段可以通吗?
在PC1和PC2上分别配置 一条默认路由,默认路由不能指向下一跳而应该指向一个出接口;互指网关也是不行的,只能用自己接口的IP
PC是 属于7层设备,可以装操作系统;可以通过rotute print看到PC的路由表;通常在PC上配置网关,网关的主要作用是在路由表里面在本地去生成 一条默认路由;下一跳就是指向网关的地址;到达外部网段的这些IP包都需要交给网关处理。
配置网关的目的就是自动生成一条默认路由
其实可以通,可以将网关的地址配成自己接口的IP,在路由表里面也会生成一跳默认路由,12在访问13的时候回匹配这条默认,它会认为目标网段和自己是直连的,也会发送ARP请求,IP是目标IP,可以封装二层也是可以通的。
三层 转发:要有路由表,匹配路由表才能转发IP包
R1访问R3,R1和 R3不在同一网段,R1要先查路由表看看有没有达到目标地址的路由;如果没有路由,是无法发送IP包的;
默认路由是可以匹配所有IP地址的,访问目标地址的时候,如果没有明细路由,都是可以匹配默认路由的;比如访问百度,新浪,服务器网段都不在同一网段,可以配置默认路由进行覆盖。
![](https://i-blog.csdnimg.cn/blog_migrate/539338591ae5c441a88da2a1947993ed.jpeg)
华为的元检测功能:收到ARP以后,不仅看ARP中的IP地址是不是自己接口下的IP地址,还要看发送方的IP地址是否和自己接口在同一网段?如果不是,不会发送ARP应答-Reply
******************************************************************************
ICMP
两种 报文:1.request 2.reply
通过类型和代码来区分不同的报文类型的;
常用的:00-应答reply 80-请求request 3-目标地址 不可达;
##ICMP重定向
*PC->ISP
PC会将报文交给A,A上是有指向ISP的默认路由的,A上默认路由 下一跳指向192.168.0.2,指向B;A收到以后会根据目的IP查路由表做转发,转发同时会重写2层;
![](https://i-blog.csdnimg.cn/blog_migrate/4e8fbc083b6eb6db53f5491170039043.jpeg)
这种 方法肯定是不行的,会有一个次优路径,会造成网络延时。怎么去解决?最好的方式是由PC直接将IP包发给B设备而不会先绕过A
通过ICMP重定向去解决,回给发送源一个ICMP报文,告诉发送源下一次发给谁。在ICMP重定向报文里面会增加一个Gateway的字段,网关地址,而这个字段会指向B设备的IP地址-192.168.0.2
需要判断什么场景下会出现ICMP的重定向?
ICMP重定向的触发条件:如果IP包的发送源和到达目的路由的下一跳在同一网段,就需要触发ICMP重定向。在ICMP重定向报文中会增加一个gateway字段,该字段中会包含目标路由下一跳的地址。
##【实验验证】
01:31
//抓包分析:
![](https://i-blog.csdnimg.cn/blog_migrate/20687884e57b7eb17e963478dff96dfd.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/657b99b8010c75e4622c5b55df9a01a6.jpeg)
后续的话,PC访问2.2.2.2的话,会直接将IP包发送给下一跳12.1.1.2,这就是重定向,可以避免一个次优路径
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">