IPv4 over IPv4隧道

简介: 请注意,本备忘录是作者的个人努力。本文件反映了互联网当前的非正式做法。IETF 移动 IP 工作组正在努力提供一个合适的提议标准来解决这个问题。

640.gif


RFC1853:IP in IP Tunneling,October 1995


本备忘录的状态


本备忘录为 Internet 社区提供信息。它没有指定 Internet 标准。本备忘录的分发不受限制。


IESG 注意:


请注意,本备忘录是作者的个人努力。本文件反映了互联网当前的非正式做法。IETF 移动 IP 工作组正在努力提供一个合适的提议标准来解决这个问题。


梗概


本文档讨论了使用 IPv4 协议/有效负载封装与 IP 安全和其他协议进行隧道传输的实现技术。


1、 简介


IPv4封装协议/有效负载[RFC-1700] 中的 IP 长期以来一直用于桥接具有不相交功能或策略的 Internet 部分。本文档描述了业余分组无线电网络多年来用于加入大型移动网络的实施技术,以及 IP 安全协议的早期实施。


在 IP 封装中使用 IP 不同于后来的隧道技术(例如,协议号 98 [RFC-1241]、94 [IDM91a]、53 [swIPe] 和 47 [RFC-1701]),因为它不插入自己的IP 报文头之间的特殊固定报文头。取而代之的是,保留了原始未经修饰的 IP 报文头,并简单地包装在另一个标准 IP 报文头中。


此信息主要适用于 IP 版本 4 的封装。其他 IP 版本将在单独的文档中描述。


2、 封装


封装技术相当简单。在原始 IP 报文头之前添加一个外部 IP 报文头。它们之间是路径的任何其他报文头,例如特定于隧道配置的安全报文头。


外部 IP 报文头 Source 和 Destination 标识隧道的“端点”。内部 IP 报头 Source 和 Destination 标识数据报的原始发送者和接收者。


每个报文头使用 IP 协议值 [RFC-1700] 链接到下一个报文头。


640.png


IP 头的格式在 [RFC-791] 中描述。


从内部 IP 报文头复制的服务类型。可选地,可以在合作对等体之间使用另一个 TOS。


这符合透明原则,即如果用户期望给定的服务级别,那么隧道应该提供相同的服务。但是,作为政策问题,可能会专门构建一些隧道以提供不同级别的服务。


Identification:鉴别,为每个外部 IP 报文头生成一个新编号。


封装的数据报文可能已经被分片,并且由于隧道封装可能会发生另一级别的分片。这些隧道分片将由解封装器重新组装,而不是最终目的地。


Reserved:保留,忽略(设置为零)。


这个非官方标志已经被实验使用,虽然它保留在内部 IP 报文头中,但不会影响隧道。


Don't Fragment:不要分片。从内部 IP 报文头复制。这允许发起者控制性能权衡的水平。请参阅“隧道 MTU 发现”。


More Fragments:更多分片。分片时根据需要设置。


不复制标志的原因与使用单独标识的原因相同。


Time To Live:生存时间。在最近的“Assigned Numbers”[RFC-1700] 中指定的默认值。这确保了意外的长隧道不会中断端点之间的数据包流。


内层TTL在封装前递减一次,不受解封装影响。


Protocol:协议


下一个报文头;4 用于内部 IP 报头,当没有使用中间隧道报头时。


Source:源地址。与用于发送数据报的接口关联的 IP 地址。


Destination:目的地址。隧道解封装器的 IP 地址。


Options:选项


不是从内部 IP 报文头复制的。但是,可以添加特定于路径的新选项。


Timestamp、Loose Source Route、Strict Source Route 和 Record Route 被故意隐藏在隧道内。通常,建造隧道是为了克服这些选择的不足之处。


任何支持的内部 IP 报文头的安全选项风格都可能影响隧道安全选项的选择。预计不会有此类选项与为隧道选择的选项或安全报文头的一对一映射。


3、 隧道管理


隧道内部的其中一个路由器在处理数据报时可能会遇到错误,导致它向隧道 IP 源的封装器返回 ICMP [RFC-792] 错误消息。不幸的是,ICMP 只要求 IP 路由器在 IP 报头之外返回 8 个字节(64 位)的数据包。这不足以包含整个封装的报文头。因此,封装路由器通常不可能立即将 ICMP 消息从隧道内部反射回始发主机。


但是,通过仔细维护其隧道的“软状态”,封装器可以在大多数情况下返回准确的 ICMP 消息。路由器应该至少维护以下关于每个隧道的软状态信息:


- 隧道尽头的可达性。

- 隧道拥塞。

- 隧道MTU。


路由器使用它从隧道内部接收到的 ICMP 消息来更新该隧道的软状态信息。当随后将通过隧道的数据报到达时,路由器检查隧道的软状态。如果数据报会违反隧道的状态(例如设置 Don't Fragment 时 MTU 大于隧道 MTU),路由器将适当的 ICMP 错误消息发送回始发者,同时将数据报转发到隧道。尽管返回错误消息,仍转发数据报可确保了解隧道状态的变化。


使用这种技术,来自封装路由器的 ICMP 错误消息不会总是与隧道中遇到的错误一一对应,但它们会准确地反映网络的状态。


3.1、 隧道 MTU 发现


当发起方设置 Don't Fragment 位并将其复制到外部 IP 报文头中时,将从报告给封装器的 ICMP(类型 3 代码 4)“数据报太大”错误中获知隧道的正确 MTU。为了支持使用此功能的始发主机,所有实现必须在其隧道内支持路径 MTU 发现 [RFC-1191, RFC-1435]。


作为隧道 MTU 发现的一个好处,由于封装报头的大小而发生的任何分段在封装后仅执行一次。这防止了单个数据包的多个分片,从而提高了路径路由器和隧道解封装器的处理效率。


3.2、 拥塞


隧道软状态将收集拥塞指示,例如来自解封装器(隧道对等体)的数据报中的 ICMP(类型 4)源抑制。当将另一个数据报转发到隧道中时,将 Source Quench 消息发送给始发者是合适的。


3.3、 路由失败


因为每次封装数据报时都会重置 TTL,所以当隧道内的路由环路再次到达封装器时,它们尤其危险。如果 IP 源与它的任何接口匹配,则实现不得进一步封装。相反,数据包被正常转发。


ICMP (Type 11) Time Exceeded 消息报告隧道本身内的路由环路。ICMP (Type 3) Destination Unreachable 消息向解封装器报告传递失败。这个软状态必须作为(类型 3 代码 0)网络不可达报告给发起者。


3.4、 其他 ICMP 消息


大多数 ICMP 错误消息与隧道的使用无关。特别是,参数问题很可能是封装器配置错误的结果,不得向发起者报告。


4、 安全注意事项


本备忘录简要讨论了安全问题。隧道的使用可以避免一些较旧的 IP 安全选项(标签),但会更好地支持较新的 IP 安全报文头。


5、 参考


[IDM91a] Ioannidis, J., Duchamp, D., Maguire, G., "IP-based protocols for mobile internetworking", Proceedings of SIGCOMM '91, ACM, September 1991.
[RFC-791] Postel, J., "Internet Protocol", STD 5, RFC 791, USC/Information Sciences Institute, September 1981.
[RFC-792] Postel, J., "Internet Control Message Protocol", STD 5, RFC 792, USC/Information Sciences Institute, September 1981.
[RFC-1191] Mogul, J., and S. Deering, "Path MTU Discovery", RFC 1191, DECWRL, Stanford University, November 1990.
[RFC-1241] Mills, D., and R. Woodburn, "A Scheme for an Internet Encapsulation Protocol: Version 1", UDEL, July 1991.
[RFC-1435] Knowles, S., "IESG Advice from Experience with Path MTU Discovery", RFC 1435, FTP Software, March 1993.
[RFC-1700] Reynolds, J., and J. Postel, "Assigned Numbers", STD 2, RFC 1700, USC/Information Sciences Institute, October 1994.
[RFC-1701] Hanks, S., Li, T., Farinacci, D., and P. Traina, "Generic Routing Encapsulation (GRE)", RFC 1701, October 1994.
[swIPe] Ioannidis, J., and Blaze, M., "The Architecture and Implementation of Network-Layer Security Under Unix", Fourth Usenix Security Symposium Proceedings, October 1993.


致谢


IP 隧道的这些实现细节在很大程度上源自 Phil Karn 和 TCP-Group 业余爱好者在 1990 年使用 KA9Q NOS 进行的独立工作。


特别感谢 John Ioannidis(当时的哥伦比亚大学)的灵感和实验,开始了最近一轮的 IP 移动性和 IP 安全性开发。部分文本来自 [IDM91a] 和 [swIPe]。


Steve Deering (Xerox PARC) 在“Simple Internet Protocol”中也描述了报文头的链接。


整个组织结构和部分文本来自 [RFC-1241],由 David Mills(U Delaware)和 Robert Woodburn(SAIC)编写。


一些关于隧道软状态的文本来自 Robert E. Gilligan、Erik Nordmark 和 Bob Hinden(均来自 Sun Microsystems)的“IP 地址封装 (IP Address Encapsulation,IPAE)”。

相关文章
|
16天前
|
人工智能 运维 API
知识库分层编排:从 RAG 到 Agent-native Knowledge Context Layer
本文剖析知识库根本困境,系统对比Naive RAG、LLM Wiki、Graphify、GraphRAG四大范式,提出“金字塔”结构化知识工程新范式:按稳定性与抽象度分五层(原则→架构→规范→实现→经验),结合角色感知与知识图谱关联,实现层次定位、跨层导航与增量同步,显著提升检索精度与知识保鲜能力。
242 0
|
移动开发 前端开发 JavaScript
【值得收藏】HTML5使用多种方法实现移动页面自适应手机屏幕的方法总结
随机智能手机,平板等智能移动设备的普及。移动端是我们目前接触最多的页面展示终端,不管是对于开发者还是其他普通的使用者都是普遍的存在,而且移动终端的使用比电脑更广泛,更频繁,特别是当微信平台等变成我们日常使用工具之后。所以对于开发者来说,不管任何开发任何界面都需要着重考虑页面对移动设备的兼容以及自适应。才能让用户体验性更好。
2479 0
|
2月前
|
JavaScript Linux Shell
环境变量配置法:通过HTTP_PROXY让OpenClaw走代理的最佳实践
本文分享OpenClaw对接站大爷隧道代理的终极避坑方案——环境变量配置法。绕过YAML配置易出错、协议混淆、兼容性差等痛点,利用Node.js原生HTTP_PROXY/HTTPS_PROXY机制,实现100%稳定、跨平台、零格式错误的一键代理生效,彻底解决连接失败、配置不生效等顽疾。(239字)
701 1
|
2月前
|
JavaScript 网络协议 Linux
踩坑记录:OpenClaw配置代理后无法联网?90%是HTTP/HTTPS协议搞混了
OpenClaw配好站大爷隧道代理却连不上网?主因是HTTP/HTTPS协议配置混淆:HTTPS请求误走HTTP代理逻辑,导致CONNECT失败。推荐用环境变量(HTTP_PROXY/HTTPS_PROXY)配置,绕过OpenClaw代理解析缺陷,稳定可靠——实测最省心方案。(239字)
641 0
|
4月前
|
网络安全 文件存储 数据安全/隐私保护
路由器配置 DDNS 实现稳定的远程访问
本文详解家庭内网穿透的极简方案:只需将光猫拨号改为路由器PPPoE拨号,获取公网IP,再搭配DDNS(如花生壳、Cloudflare)绑定固定域名,最后配置端口转发。无需服务器、不依赖中转,零成本、高稳定,轻松实现NAS远程访问、远程桌面、自建服务外网共享等实用场景。
1779 5
|
测试技术 Python
自动化测试项目学习笔记(三):Unittest加载测试用例的四种方法
本文介绍了使用Python的unittest框架来加载测试用例的四种方法,包括通过测试用例类、模块、路径和逐条加载测试用例。
531 0
自动化测试项目学习笔记(三):Unittest加载测试用例的四种方法
|
前端开发 JavaScript API
前端开发新趋势:探索WebAssembly与WebGL在游戏开发中的应用
【10月更文挑战第1天】前端开发新趋势:探索WebAssembly与WebGL在游戏开发中的应用
714 2
|
存储 Kubernetes 负载均衡
容器服务Kubernetes版(ACK)上快速部署应用
在阿里云ACK上快速部署应用,包括创建Kubernetes集群、使用`kubectl`部署或更新应用镜像、配置Ingress与ALB集成。首先开通ACK和ALB服务,然后创建集群。编写`deployment.yaml`和`ingress.yaml`文件,部署应用和设定路由规则。通过ALB控制台配置负载均衡器,最后验证部署是否可通过ALB访问。如遇问题,参考官方文档或寻求阿里云支持。
|
SQL 存储 数据库
如何在SQLServer中创建数据库
在SQL Server中创建数据库,可通过SSMS的图形界面或T-SQL语句。在SSMS中,连接到服务器,右键“数据库”选择“新建数据库”,配置属性后点击确定。使用T-SQL,连接到服务器,编写CREATE DATABASE语句指定数据库名称、文件路径及大小信息,执行查询完成创建。确保有足够磁盘空间,并注意权限设置。
|
缓存 NoSQL Redis
Python与Redis:提升性能,确保可靠性,掌握最佳实践
Python与Redis:提升性能,确保可靠性,掌握最佳实践
560 1