为何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相关话题 ...
随机推荐
- Hive之分析函数
目录 一.sum() over(partition by) 二.avg().min().max() over(partition) 三.row_number() over(partition by) ...
- 关于C语言中的unsigned
在C语言中,对unsigned做出(unsigned int)i>=0 判断,将会得到一个永真值. int i; for(i=10;i-sizeof(int)>=0;i--){ print ...
- SpringBoot系列——动态定时任务
前言 定时器是我们项目中经常会用到的,SpringBoot使用@Scheduled注解可以快速启用一个简单的定时器(详情请看我们之前的博客<SpringBoot系列--定时器>),然而这种 ...
- JUC学习笔记(一)
1.什么是 JUC 1.1.JUC简介 在 Java 中,线程部分是一个重点,本篇文章说的 JUC 也是关于线程的.JUC 就是 java.util .concurrent 工具包的简称.这是一个处理 ...
- 字节跳动已经10万人了?渣本双非Android程序员怎么上车?
字节跳动已经 10 万人了? 是的,在 2020 年字节跳动的员工总数从 6 万蹿到 10 万,平均每个工作日就有 150 人在办理入职,加入字节跳动全球超过 240 个办公点. 更有统计,在总部北京 ...
- Fluid + GooseFS 助力云原生数据编排与加速快速落地
前言 Fluid 作为基于 Kubernetes 开发的面向云原生存算分离场景下的数据调度和编排加速框架,已于近期完成了 v0.6.0 版本的正式发布.腾讯云容器 TKE 团队一直致力于参与 Flui ...
- CSS 奇思妙想 | 使用 resize 实现强大的图片拖拽切换预览功能
本文将介绍一个非常有意思的功能,使用纯 CSS 利用 resize 实现强大的图片切换预览功能.类似于这样: 思路 首先,要实现这样一个效果如果不要求可以拖拽,其实有非常多的办法. 将两张图片叠加在一 ...
- MySQL学习07(规范化数据库设计)
规范化数据库设计 当数据库比较复杂时我们需要设计数据库 糟糕的数据库设计 : 数据冗余,存储空间浪费 数据更新和插入的异常 程序性能差 良好的数据库设计 : 节省数据的存储空间 能够保证数据的完整性 ...
- Shell-10-标准输入输出错误
标准输入输出和错误 标准输入.输出和错误 重定向符号 示例 1 1 标准输出 2 错误输出 2 标准输出和错误输出同时定向到一个文件中 >share.txt 2>&1 3 > ...
- Oracle 11g数据库下载安装教程
今天重装系统之后发现甲骨文的网站变化较大,下载安装废了一点时间,留下个笔记为以后再装留作参考.本教程是win10,64位系统环境下 1.下载 下载的时候需要登陆甲骨文账号,如果没有的话申请一个也挺快. ...