为何GRE可以封装组播报文而IPSEC却不行?
|
|
目录
五、说明
一、前言
这个问题可能是在学习IPsec协议时,比较有意思的话题。而一般得到的答案是:IPsec在协议设计时定位便是一个点对点的协议,这个特点可以通过Ipsec SA看出:IPsecSA通过三元组来唯一标识(目的IP,SPI, 协议号),目的IP都是单播地址,因此一个SA只能对应一个V.P.N节点,总而言之:ipsec不支持保护组播报文和广播报文。提出的解决办法一般是:GRE over Ipsec。
理由是:GRE虽然同样是点对点协议,却可以封装组播报文和广播报文,但是不具备机密性和源认证等特点;IPsec协议虽然具有机密性和完整性保护的优势,但是无法封装组播报文和广播报文,因此结合两个协议的优势,GRE over IPSec应运而生,这样既可以封装单播、组播、广播报文,还可以加密数据流。
那么问题来了:既然都是点对点的协议,为何IPsec不能封装广播组播报文,而GRE却可以? 这个问题我寻觅了比较久,但是没有让我满意的答案,更多的是:用结论来回答我的原因,然而结论我知道,原因不知道,答非所问。还是自己整理下吧,以下很多是个人观点,如有错误,欢迎指正
二、明确两个问题
- 问题一:IPsec是否支持组播?
- 问题二:IPsec是否可以保护组播、广播报文?
这两个问题可以认为是不同的问题,因为难度不一样,强调的对象不同。
首先说明问题一:
它更强调IPsec协议是否可以只通过一条隧道和多个对端建立V.P.N,本端不需要关心有几个对端设备,他们对我而言共用一个IpsecSA。 这个问题根本原因是ipsec协议设计的问题,SA不支持一对多的模式,也是网上说的比较多的原因。当前普通ipsec协议完全不支持该功能(支持组播ipsec协议已有RFC标准,没有看过,暂不讨论)
然后讨论问题二:
它不要求ipsec隧道与多个对端建立V.P.N,只是希望能够在隧道中传输组播、广播报文;这个问题原因不能完全归咎于ipsec协议本身,ipsec是否支持此功能与实现方式密切相关。ipsec协议有什么实现方式呢?
一般情况下,IPsec存在两种实现方式:
- 基于ACL
- 基于虚拟隧道接口
2.1 基于ACL
基于ACL(Acess Control List,访问控制列表)的实现,可以对ipsec流量进行更加精确的控制,如:使用报文IP地址、UDP/TCP协议、端口号、应用层协议等进行精确控制,使得ipsec更加智能化。它将引用了 ACL 的 IPsec 安全策略应用到接口上(包括物理接口和虚接口)后,该接口上匹配 ACL 的报文将会受到 IPsec 保护。
2.2 基于虚拟隧道接口
在隧道接口上应用 IPsec 安全框架后,路由到该隧道接口的报文都会受到 IPsec 的保护,同时还可以支持对组播流量、广播流量的保护。此方式建立的 IPsec 的封装模式必须为隧道模式。 该类应用通常也被称为在 VTI(Virtual Tunnel Interface)上应用 IPsec

注意:这种方式是支持保护组播、广播流量的。它的原理与GRE支持组播、广播报文应该是相同的。
从这两种实现方式来看,IPsec协议封装组播、广播报文也不是不可能的,既然是这样那就不能说人家协议本身不能封装组播广播报文。
接下来说明下GRE为啥可以封装组播、广播报文。这同样是基于虚接口的ipsec可以封装组播广播报文的原因。
三、GRE封装原理
以前整理的一篇基础GRE文章:GRE隧道协议
GRE协议理论并不复杂,也没有说支持组播的原因。于是我从Linux系统自带的gre隧道功能出发,搭建GRE隧道配置使用环境,来分析其原因。基本环境搭建可参考此文ubantu与CentOS虚拟机之间搭建GRE隧道
使用Linux操作系统自带的GRE功能配置隧道有以下几点注意事项(通过配置总结下来的):
- 添加GRE隧道实际上就是添加新的虚拟隧道接口
- 添加GRE隧道时必须指定隧道的本端对端隧道地址
- 需要为新添加的虚拟隧道接口配置IP地址
- 如果GRE隧道连接两个不同的子网,需要添加一条静态路由:目的IP为对端子网,下一条为虚拟隧道接口
- GRE本端对端隧道地址相同的只能添加一个虚接口(即两个不同的虚接口,GRE隧道地址相同是不允许滴)
- 不能为同一个虚接口配置不同的GRE隧道
通过上面总结的配置注意事项,可以得出一个结论:每一条GRE隧道都唯一绑定一个虚拟隧道接口,反之亦然。
这能说明什么呢? 说明GRE数量和虚拟隧道接口的数量是一一对应的。这样的话GRE封装组播功能便不是梦。基于此前提,我绘制了一个简单的图(如果是组播报文,则应该查询组播路由表):

组播报文是需要查询组播路由表来确定向哪些接口转发组播报文。通过查询组播路由表,路由器会将组播报文复制多份,然后分别转发到不同接口。也就是说转发到GRE虚接口上的报文已经是组播分发后的报文,由于GRE虚接口上只有一种封装策略(上文中提到的一一对应关系),因此直接按照策略封装报文即可,无需关心报文的类型(单播、组播、广播等)。因此GRE支持封装组播报文的原因在于:GRE处理在组播报文分发之后,而GRE的封装不会影响其他接口处理组播报文,因为该接口持有的是组播报文副本中的一个,互不影响。 从上图的结构中也可以看出报文可以进行重复多次隧道封装。

四、IPsec为什么不行?
上面已经说过,不是IPsec不行,而是使用ACL的方式不行,采用虚拟隧道接口的方式是可以滴。使用虚接口的原理和GRE封装原理相同,但需要保证一点:每一个虚接口有且只有一个封装策略,即不能多条ipsec隧道共用一个虚拟隧道接口。这里有一点蛮有意思的:以下面的处理架构,GRE over Ipsec 或者 Ipsec over GRE都是比较简单实现的,只要通过路由来控制引流即可。

那么基于ACL的为什么不行能?
基于ACL实现的ipsec虽然同样可以配置到物理接口,虚拟隧道接口上,但是由于存在过滤条件,因此只有满足过滤条件的才能进行ipsec封装。除此之外,即使组播报文满足过滤条件,但是该接口上可能配置有多个IPsec的ACL过滤条件,组播报文可能同时满足其中的多个ACL, 那么采用哪种条隧道的SA进行封装便成了问题,由于现阶段标准IPsec的SA不支持一对多,无论采用哪一条隧道的SA进行封装,都会导致组播报文变成单播报文,造成组播报文功能丢失。因此说基于ACL方式实现的ipsec无法进行组播、广播报文的封装。
五、说明
关于ipsec和GRE封装组播报文的解析,纯属个人观点。如果面试回答错误,我可不负责哈。
为何GRE可以封装组播报文而IPSEC却不行?的更多相关文章
- vxlan vs GRE(三层组播和二层组播如何对应起来)
www.huawei.com/ilink/cnenterprise/download/HW_401028 http://feisky.xyz/sdn/basic/vxlan.html 华为的vxlan ...
- 组播(Multicast)传输
组播(Multicast)传输: 在发送者和每一接收者之间实现点对多点网络连接. 如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包.它提高了数据传送效率.减少了骨干网络出现拥 ...
- IP组播
1 IP组播基础 IP组播技术有效地解决了单点发送.多点接收的问题.组播源只发送一份数据,被传递的信息在距组播源尽可能远的网络节点才开始被复制和分发,并且只发送给需要该信息的接收者. 说明: 本章 ...
- IP组播技术
1 概述 1.1 产生背景 传统的IP通信有两种方式:一种是在源主机与目的主机之间点对点的通信,即单播:另一种是在源主机与同一网段中所有其它主机之间点对多点的通信,即广播.如果要将信息发送给多 ...
- HCNP Routing&Switching之组播技术PIM-SM 稀疏模式
前文我们了解了组播路由协议PIM以及PIM-DM密集模式相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16084310.html:今天我们来聊一聊PI ...
- IPv4组播通信原理
2011-05-08 21:21:14 标签:组播 vin_do,vin_do学习笔记,笔记 休闲 职场 摘自网络,感谢原作者 摘要: 本文试图成为学习TCP/IP网络组播技术的入门材料.文中介绍了组 ...
- IPSec组播概要
IPSec作为主流IP安全协议之一,在单播环境下,特别是在VPN场景中应用广泛.但是在组播环境貌似看到的不多,通过RFC4301了解到IPSec首先是支持组播的,即通过手动配置的方式可以实现组播包加密 ...
- HCNP Routing&Switching之组播技术-IGMP-Snooping
前文我们了解了组播协议IGMP相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15700550.html:今天我们来聊一聊二层交换机处理组播报文所面临的 ...
- HCNP Routing&Switching之组播技术-组播路由协议PIM
前文我们了解了组播技术中组播分发树相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16019334.html:今天我们来聊一聊组播路由协议PIM相关话题 ...
随机推荐
- BSTestRunner增加历史执行记录展示和重试功能
之前对于用例的失败重试,和用例的历史测试记录存储展示做了很多的描述呢,但是都是基于各个项目呢,不方便使用,为了更好的使用,我们对这里进行抽离,抽离出来一个单独的模块,集成到BSTestRunner中, ...
- 痞子衡嵌入式:ARM Cortex-M内核那些事(9.1)- 存储保护(MPU - PMSAv6/7)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M存储保护模块(MPU). <ARM Cortex-M内核MCU开发那些事>的内核篇连载最早是 201 ...
- 后台程序编译过程报错PCC-F-02104, Unable to connect to Oracle
偶然重新编译了一下后台程序,发现编译过程报错无法连接数据库.但通过sqlplus登录数据库是正常的.后台程序改动中也做了详细的分析,没有改动相关数据库的参数和配置. 最后通过浏览器查看了很多相关问题的 ...
- Shell-08-文本处理sed
文本处理sed sed:流编辑器,过滤和替换文本 工作原理:sed命令将当前处理的行读入模式空间进行处理,处理完把结果输出,并且清空模式空间. 然后再将下一行读入模式空间进行处理输出,以此类推,直到最 ...
- Debian 11 “bullseye” 安装笔记
作者:gc(at)sysin.org,主页:www.sysin.org Debian 版本:11 代号:bullseye 发布日期:2021.08.14 内核版本:5.10 $ uname -a Li ...
- CVE-2021-21972 vSphere Client RCE复现,附POC & EXP
漏洞简介 vSphere 是 VMware 推出的虚拟化平台套件,包含 ESXi.vCenter Server 等一系列的软件.其中 vCenter Server 为 ESXi 的控制中心,可从单一控 ...
- SQL 练习37
检索至少选修两门课程的学生学号 SELECT Student.SId,Student.Sname,选课数 from Student, (SELECT sid,COUNT(cid) 选课数 from s ...
- Qt foreach关键字用法(无师自通)
Qt 提供一个关键字 foreach (实际是 <QtGlobal> 里定义的一个宏)用于方便地访问容器里所有数据项. foreach 关键字用于遍历容路中所有的项,使用 foreach ...
- WPF学习笔记一 依赖属性及其数据绑定
本文想通过由浅入深的讲解让读者比较深的理解依赖属性. 首先,我们回顾一下依赖属性的发展历史. 最初,人们提出面向对象编程时,并没有属性这个说法,当时叫做成员变量.一个对象由成员变量和成员函数组成,如 ...
- 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...
