Why 使用TLS记录协议封装IP层VPN IS A Bad Idea

一个很自然的想法,使用TLS封装一个IP数据报实现一个第三层的VPN。
这种想法一定是经过了深思熟虑的,但是不幸的是,这是个错误的想法。有一篇文章《Why TCP Over TCP Is A Bad Idea》,详细解释了Why。事实上重传叠加问题是无法解决的,要知道,TCP的RTO计算是极其复杂的,影响它的因素也很多,这就是说,只要你用一个TCP封装另一个TCP,外层TCP丢包,且RTO小于内层TCP的RTO,连接就会崩溃。而以上这个条件是很容易满足的。
       用TLS来封装IP数据报是对TLS的误用!SSL/TLS的初衷是提供传输层之上的安全层,本身运行了可靠的TCP上,其记录层协议封装的是应用层数据,因此,SSL/TLS是对基于TCP应用的安全增强,并不是一个通用的传输协议。之所以TLS运行于TCP之上,就是这个原因,因为应用是基于TCP的。如果你想实现一个IP层的VPN,用TLS来封装IP数据报,就相当于你将IP数据报当成了一个基于TCP的应用数据,这不正是《Why TCP Over TCP Is A Bad Idea》中描述的那种连接崩溃的场景吗?事实是,IP数据报显然不是基于TCP的应用数据。
       后来出现了DTLS,显然去掉了很多约束,轻量了很多,如果非要封装使用TLS封装IP数据报,首先要想到的怎么也应该是DTLS而不是TLS。DTLS衍生自TLS,并且保留了UDP无序的语义,但是它还是从TLS继承了很多复杂的东西,本质上,DTLS也是封装应用数据的,这些应用基于UDP。循着这个思路,如果我们可以将IP数据报看作是一个基于UDP的应用数据,那么就可以用DTLS封装它了,能吗?当然能!UDP本身就是IP的第四层镜像,只是多了一个多路复用机制。使用DTLS封装IP数据报实现一个IP层VPN将会是一个不错的选择,但是还有更好的方法。
       OpenVPN提供了一种更好的方式,仅仅使用TLS实现控制通道,而封装加密IP数据报的数据通道则是首选普通UDP通道。这有点IPSec的影子,不是吗?IPSec使用独立的IKE协商好SA,然后使用独立的ESP/AH协议封装加密IP数据报。其实,这才是实现IP层VPN的正确方式,本来安全参数的协商和认证/加密就是两个独立的过程,独立的过程。TLS/DTLS将这些封装进了一个会话过程中,该会话通过一个称为SSL握手的过程建立,在握手的过程中协商安全参数,握手完毕后将使用协商好的安全参数保护后续的应用数据。这种方式的不灵活性在于你无法增加自己的协商机制,除非修改TLS协议。另外作为一个TLS Record,IP数据报被封装在Application data中,外部能看到的只是一个TLS Record,中间系统很难对其进行识别和控制,也就是说,作为加密后的IP数据报的传输协议,TLS很适合,但是很难从外部去控制它,你看到的永远是一个TLS Record头,而看不到VPN协议的头。
       对于IP数据报的保护,最终的思想还是IPSec的那套思想,即定义安全端点,定义安全联盟,协商安全参数,保护IP数据报,四个过程是完全独立的。虽然你可以将IP数据报看作是“应用数据”,但是它毕竟不是应用数据,TLS源自应用数据的安全需求,它针对单一应用,单独的业务逻辑可以起到很好的安全加固作用,比如实现HTTPS,比如OpenVPN的控制通道,这些都是业务单一且固定的应用,但是加密IP数据报却不适合,抛开TCP over TLS的连接崩溃问题不谈而引入DTLS,控制和传输叠加在一个会话中将会使扩展很难,比如防火墙无法区分VPN数据和其它TLS应用数据,比如无法实现组播加密,比如无法重协商单独的安全参数,同一个SSL会话无法被不同的安全端点共享...
       因此, 使用TLS记录协议封装IP层VPN IS A Bad Idea,DTLS好一点,但也不绝对。真正的好的方案是,最大限度使用TLS来做控制通道协商交换安全参数,然后定义独立的封装协议来封装安全参数保护的IP数据报。例子太多了,IPSec,OpenVPN,不过OpenVPN的代码太恶心了,理解它的思想后自己写一个吧,或许会更好些。

Why 使用TLS记录协议封装IP层VPN IS A Bad Idea,布布扣,bubuko.com

时间: 2024-10-20 21:44:01

Why 使用TLS记录协议封装IP层VPN IS A Bad Idea的相关文章

老斜两宗事-七层代理模式还是IP层VPN

1.七层代理模式还是IP层VPN 很多人会问,我到底是使用代理模式呢,还是使用VPN模式,如果我想数据在中间不安全的链路上实现加密保护的话.这个问题有一个背景,那就是,你想保护你的数据,可以使用VPN,但是有时候,第七层的代理模式或许更好,比如SSL卸载器,比如内置SSL处理的代理,分为正向代理和反向代理.正向代理:代理的是访问者.一般位于访问者一端,访问者能意识到代理的存在,直接访问代理,由代理向服务器发起访问.反向代理:反向代理代理的是被访问者.位于被访问者一端,访问者意识不到代理的存在,访

TCP/IP协议之IP层

TCP/IP协议的结构参见下图.有应用层,运输层,网络层,链路层. 但是如果更细化的话,其实还有几层没在这上面体现出来. 1 表示层:数据格式化,代码转换,加密. 没有协议 2 会话层:解除或者建立与其他结点的联系.没有协议 3 物理层:以二进制形式在物理链路上传输数据.协议有ISO2100,IEEE802 在上图中加上这三层协议.就构成了OSI七层协议网络模型.从上到下分别是应用层,表示层,会话层,传输层,网络层.数据链路层,物理层. 为什么一个数据传输要分成这么多层呢.统一为一个模块不行么.

TCP/IP 协议:链路层概述

我们以一个常见的查看IP指令为出发点(ifconfig -a): ? 1.链路层是什么 链路层是指硬件层协议.也即网络所使用的硬件,比如:以太网(后文主要讨论对象),令牌环网,FDDI已经RS-232串行线路. 在上面的命令(ifconfig -a)结果中,硬件地址(MAC)为08:00:27:00:9c:59 (48bit),链路层主要的作用就是连接不同的两个硬件. ? 2.链路层的作用 1.为IP模块发送和接收IP数据报 2.为ARP模块发送和接收ARP应答 3.为RARP发送RARP请求和

6、7、8章:IP协议及IP数据报转发和ICMP - 用TCP/IP进行网际互连

第6章 网际协议:无连接数据报交付(IPv4) 6.3 互联网体系结构和基本原理 互联网是围绕着一个分层结构中的三个概念化网络服务来设计的:这个结构相当健壮且有很强的适应性,使互联网取得了很大成功. 6.7 数据报格式及个部分讲解 版本字段(4位): IP协议的版本,通信双方使用的协议版本须一致,目前普遍使用IPv4,IPv6目前处于起步阶段. 首部长度(4位): 它给出用32位字来度量数据报首部长度.除了IP选项及相应的填充字段外,首部其他字段长度是固定的.若不含IP字段长度为20字节,则首部

用Netcat,SSH构建的IP层加密隧道搭建VPN

[关于题外话在最后] 写作本文主要基于两点,首先是因为我前段时间写了几篇关于VPN的新解,收到了很多的邮件反馈,我也思考了很多,另一个方面是因为很多人问我怎么用QQ,P2P搭建一个IP层的VPN,我的回答是"我也不知道".我确实不知道,根本就没有试过,只是有个这样那样的想法...我主要是没有能力去Hack这些非Linux上的东西...所以说,我写这篇文章,用UNIX的方法"将多个小工具结合起来"实现我的那些没有实现的想法,抛砖引玉一下. 声明: 本文没有技术含量,甚

《网络协议》IP 网际协议

概述 IP 是 TCP/IP 协议族中最为核心的协议.所有的 TCP.UDP.ICMP 和 IGMP 数据都是以 IP 数据报格式传输.IP 协议处于网络层,网络层主要是实现点对点的通信.IP 协议是一种不可靠.无连接的协议.不可靠即不能保证 IP 数据报能够成功到达目的端,在传输过程中发生某种错误时,IP 协议会丢弃数据报,然后发送 ICMP 消息给信源端,其他任何要求的可靠性必须由上层来提供.无连接即 IP 协议并不维护任何关于后续数据报的状态信息,每个数据报都是相互独立的.因此,IP 数据

tco/iP协议族——IP工作原理及实例详解(下)

 IP协议详解 上一篇文章文章主要介绍了IP服务的特点,IPv4头部结构IP分片,并用tcpdump抓取数据包,来观察IP数据报传送过程中IP的格式,以及分片的过程.本文主要介绍IP路由,IP转发,重定向和IPv6头部结构. IP路由 IP协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径.为了理解IP路由过程,我们先简要分析IP模块的基本流程. IP模块工作流程 从右往左分析上图,它首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的具体信息. 如果该IP数据报的头

IP协议号 IP首部中有8位协议号,用于指明IP的上层协议.

IP协议号   IP首部中有8位协议号,用于指明IP的上层协议. 0 HOPOPT IPv6 逐跳选项 1 ICMP Internet 控制消息 2 IGMP Internet 组管理 3 GGP 网关对网关 4 IP IP 中的 IP(封装) 5 ST 流 6 TCP 传输控制 7 CBT CBT 8 EGP 外部网关协议 9 IGP 任何专用内部网关 (Cisco 将其用于 IGRP) 10 BBN-RCC-MON BBN RCC 监视 11 NVP-II 网络语音协议 12 PUP PUP

IP 层收发报文简要剖析3--ip输入报文分片重组

在ip_local_deliver中,如果检测到是分片包,则需要将报文进行重组.其所有的分片被重新组合后才能提交到上层协议,每一个被重新组合的数据包文用ipq结构实例来表示 struct ipq { struct inet_frag_queue q; u32 user;//分片来源 __be32 saddr;//原地址 __be32 daddr;//目的地址 __be16 id;//ip报文序列号 u8 protocol;//上层协议号 //这四个字段来自ip首部是为了确定来自哪个ip数据报文