数据转发原理
// 抓包看 ARP 的报文结构:
注意 Opcode: 1=request (ARP) 2=reply(ARP)
3=request(RARP) 4=reply(RARP)
*****************************************************************************
普通 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 的.
[拓展] :wireshark 是一个抓包工具, 原理: 首先 wireshark 会改变你的端口的一个工作模式, 会把网卡改成混杂模式, 不改成 混杂模式抓不到包的; 一个 端口收到数据帧要先通过目的 Mac 地址是不是接收的目的 Mac 地址, 判断这个是不是给自己的. 抓包是 通过 SPAN(镜像) 的方式把网络中的数据帧映射过来; 改端口的模式: 改成混杂模式这个接口就不会去判断这个数据帧目标的 Mac 地址是不是自己接口的 Mac 了, 只要收到数据帧全部看.(类比快递, 不看收件人, 全部都要)
[拓展] : 现在的一些开发人员也不会去拆这个头部, 比如上网行为管理设备, 实际上是可以看包的内容的, DPI(深度报文检测), 是通过指针偏移, 计算好包头到数据的部分一共多少个字节, 然后指针偏移, 看包的数据部分做一个匹配.
- ## 接收者回送 reply 报文: 单播
- ***********************************************************************************
免费 ARP
自己给自己发送一个 ARP 请求, 获取一个目标地址的 Mac
1. 检测 IP 冲突 2. 更新 Mac 地址
## 检测 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)
- ## 免费 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 口了;
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, 就可以封装二层, 发送数据帧.
在广播网里面一定 要指定下一跳, 尽量不要用出接口, 实际上最好的方法是连出接口和下一跳同时配置
- ##[实验验证]
- 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 地址的, 访问目标地址的时候, 如果没有明细路由, 都是可以匹配默认路由的; 比如访问百度, 新浪, 服务器网段都不在同一网段, 可以配置默认路由进行覆盖.
华为的元检测功能: 收到 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 层;
这种 方法肯定是不行的, 会有一个次优路径, 会造成网络延时. 怎么去解决? 最好的方式是由 PC 直接将 IP 包发给 B 设备而不会先绕过 A
通过 ICMP 重定向去解决, 回给发送源一个 ICMP 报文, 告诉发送源下一次发给谁. 在 ICMP 重定向报文里面会增加一个 Gateway 的字段, 网关地址, 而这个字段会指向 B 设备的 IP 地址 - 192.168.0.2
需要判断什么场景下会出现 ICMP 的重定向?
ICMP 重定向的触发条件: 如果 IP 包的发送源和到达目的路由的下一跳在同一网段, 就需要触发 ICMP 重定向. 在 ICMP 重定向报文中会增加一个 gateway 字段, 该字段中会包含目标路由下一跳的地址.
- ##[实验验证]
- 01:31
// 抓包分析:
后续的话, PC 访问 2.2.2.2 的话, 会直接将 IP 包发送给下一跳 12.1.1.2, 这就是重定向, 可以避免一个次优路径
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
来自为知笔记 (Wiz) http://www.wiz.cn/i/c752282e
来源: http://www.bubuko.com/infodetail-3109630.html