惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
WordPress大学
WordPress大学
C
Check Point Blog
GbyAI
GbyAI
U
Unit 42
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
Blog — PlanetScale
Blog — PlanetScale
J
Java Code Geeks
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Hugging Face - Blog
Hugging Face - Blog
Vercel News
Vercel News
博客园 - 【当耐特】
美团技术团队
小众软件
小众软件
S
SegmentFault 最新的问题
Jina AI
Jina AI
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Cloudflare Blog
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog

博客园 - 人艰不拆_zmc

AI 里的“本体”到底是什么?一篇写给技术小白的通俗解释 15000mAh 到底是什么概念?一篇看懂电池容量 go2_ros2_sdk 到底是干什么的?从 Go2、官方 SDK、ROS2 一路讲到 SLAM 和 Nav2 买了宇树 Go2 以后怎么二次开发?写给第一次做机器狗项目的人 买了一块 NVIDIA Jetson,怎么在上面安装 ROS2?从 JetPack 到 ROS2 的完整入门指南 NVIDIA Jetson 到底是什么?写给第一次接触机器人和边缘 AI 的人 ROS / ROS2 到底是什么?写给第一次接触机器人开发的人 大模型到底能同时多少人用?一篇看懂并发、排队与容量估算 大模型为什么有快有慢?一篇看懂响应速度背后的关键因素 技术小白也能看懂:大模型里的量化、蒸馏到底是什么意思? Codex 使用技巧:从“会聊天”到“真正能干活” 我终于搞懂了:Codex 对话中插件和 Skill 到底怎么用 我终于搞懂了 Agent Spec:它其实就是 Agent 的“标准设计图” 我终于搞懂了 Tool:原来不只是 Function Calling 里的函数 Skill 里的 Python 脚本,到底是不是 Tool? 我终于搞懂了 Codex 的 Plugin 和 Skill:顺便把 App、MCP 一次理清 我终于搞懂了 Codex 的“应用”:App 到底是什么,怎么添加和维护? 我终于搞懂了 Tool、Function Calling 和 MCP:大模型到底怎么知道该调哪个接口? 我终于搞懂了 MCP:从 HTTP API 到 ERP MCP Server 的完整入门 我终于搞懂了 Codex 的“记忆”是怎么回事 Codex 用久了越来越慢?我的上下文管理小技巧 我终于搞懂了 Codex 里的 Thread、Turn 和 Session 从 Qwen3.8-27B 到 FP8、NVFP4、MoE:一次搞懂几个常见大模型概念 FPS 是什么意思?简单理解 60 FPS、25 FPS 和视频帧率 DeepSeek Harness 明明像 AI Coding 工具,为什么又能用来构建各种 Agent? 使用 Codex 开发项目,怎么才能节约 Token? 模型里的 32K、128K、256K 是什么意思?简单聊聊上下文限制 Codex 一次对话到底会给模型发送什么?以 Spring Boot 项目为例讲清 Context、代码读取与 Token 消耗 AI Agent 中的 Rule 是什么?以 Codex 为例,小白也能看懂 我终于搞懂了 Harness:它不是论文,也不是标准,更不是 Codex 独有
深入理解Linux IPIP隧道:原理、配置与实战
人艰不拆_zmc · 2025-12-18 · via 博客园 - 人艰不拆_zmc

引言

在Linux网络虚拟化领域,隧道技术是实现跨网络通信的关键技术之一。特别是在容器化和Kubernetes环境中,Flannel等网络插件的早期版本广泛使用IPIP隧道来实现Pod间的跨节点通信。本文将深入探讨IPIP隧道的工作原理、配置方法及其在容器网络中的应用。

1.什么是IPIP隧道?

IPIP隧道是Linux内核原生支持的一种三层隧道协议,全称为IPv4 in IPv4。其核心原理是在原始IPv4报文的基础上再封装一个IPv4报文头,从而实现报文在不同网络间的透明传输。
Linux内核支持的五种主要L3隧道协议包括:

  • ipip:IPv4 in IPv4,在IPv4报文外封装IPv4报文;
  • GRE:通用路由封装,支持多种网络层协议的封装;
  • sit:IPv6 over IPv4隧道,用于IPv6报文在IPv4网络中的传输;
  • ISATAP:站内自动隧道寻址协议,主要用于IPv6过渡技术;
  • VTI:虚拟隧道接口,主要应用于IPSec VPN场景。

2.IPIP隧道的工作原理

2.1 内核原生实现机制

IPIP隧道完全由Linux内核网络栈实现,通过专门的内核模块(ipip.ko)提供功能支持。IPIP隧道的工作机制可以概括为以下几个步骤:

  1. 原始报文准备:应用程序生成需要传输的原始IP数据包;
  2. 路由决策:内核路由子系统根据目标地址判断数据包需要通过IPIP隧道发送;
  3. 隧道封装处理:IPIP内核模块执行封装操作:
    • 在原始IP包外层添加新的IP头(外层IP头);
    • 设置外层IP头的协议字段为4(表示IPIP协议);
    • 源地址设置为隧道本地端点地址;
    • 目的地址设置为隧道远程端点地址;
  4. 物理网络传输:封装后的数据包通过底层物理网络传输到对端节点;
  5. 协议识别与解封装:对端内核识别IPIP协议包,进行解封装处理;
  6. 最终交付:原始报文被正确交付到目标应用程序。

整个过程就像是将一封信(原始数据包)装入另一个信封(外层IP头)进行邮寄。

2.2 封装格式详解

原始IP包(内层):

IPIP封装后(外层):

[外层IP头(协议=4)][原始IP头][TCP/UDP头][数据载荷]

3.IPIP隧道与TUN设备对比 

3.1 相同点:封装理念相似

两者都基于"封装"的基本理念,但在实现层面有本质区别:

  • TUN设备将内核的IP包传递给用户空间程序进行封装处理;
  • IPIP隧道在内核空间直接完成IP-in-IP的封装。

3.2 本质区别

(1)TUN设备的工作机制:

  • 是用户空间与内核空间网络栈的桥梁;
  • 数据包通过/dev/net/tun字符设备传递;
  • 用户空间程序负责具体的封装逻辑(如OpenVPN的SSL封装);
  • 涉及内核态与用户态的数据拷贝,性能开销较大。

(2)IPIP隧道的工作机制:

  • 完全在内核网络栈中处理,不涉及用户空间;
  • 数据封装/解封装由内核IPIP模块直接完成;
  • 无系统调用和上下文切换开销,性能更高;
  • 封装格式固定为IP-in-IP,无法自定义。

3.3 技术对比总结

特性IPIP隧道(内核)TUN设备
工作层面 内核网络层(L3) 内核网络层(L3)
数据处理 内核IPIP模块封装/解封装 用户空间程序处理
性能表现 高(无上下文切换) 相对较低
灵活性 低(固定IPIP格式) 高(可自定义封装)
使用场景 简单点对点隧道 复杂VPN、自定义协议

4.IPIP隧道的正确配置方法

4.1 环境准备与内核支持 

# 检查IPIP内核模块是否已加载
lsmod | grep ipip

# 如未加载,手动加载IPIP模块
sudo modprobe ipip

# 验证模块信息
sudo modinfo ipip

4.2 创建和配置IPIP隧道

标准配置命令格式:

# 创建隧道设备
sudo ip tunnel add <隧道名称> mode ipip remote <对端IP> local <本端IP> ttl 64

# 启用隧道设备
sudo ip link set <隧道名称> up

# 为隧道设备分配内网IP地址
sudo ip addr add <内网IP/掩码> dev <隧道名称>

完整配置示例:

节点A配置(服务器IP: 192.168.10.2):

sudo ip tunnel add tun1 mode ipip remote 192.168.20.2 local 192.168.10.2
sudo ip link set tun1 up
sudo ip addr add 10.10.100.1/24 dev tun1

节点B配置(服务器IP: 192.168.20.2):

sudo ip tunnel add tun2 mode ipip remote 192.168.10.2 local 192.168.20.2
sudo ip link set tun2 up
sudo ip addr add 10.10.100.2/24 dev tun2

连通性验证:

# 测试隧道连通性
ping 10.10.100.2

# 查看隧道接口状态
ip link show tun1
ip addr show tun1

5.Kubernetes网络插件中的实际应用

在Kubernetes网络生态中,Flannel等网络插件的早期版本采用IPIP隧道实现Pod网络互通,其核心架构:

(1)网络规划机制:

  • 每个Kubernetes节点分配独立的Pod CIDR子网;
  • 节点间通过BGP或静态路由同步网络信息;
  • IPIP隧道用于建立节点间的虚拟网络连接。

(2)Flannel IPIP模式工作流程:

  1. 节点注册:节点启动时向etcd注册并获取Pod子网分配;
  2. 隧道建立:根据集群节点信息自动创建IPIP隧道;
  3. 路由同步:通过路由表确保数据包正确转发;
  4. 跨节点通信:Pod间流量通过IPIP隧道透明传输。

(3)实际通信流程实例

当Pod A(节点1,IP: 10.244.1.2)与Pod B(节点2,IP: 10.244.2.3)通信时:

  1. 源节点处理
    • Pod A发送目标为10.244.2.3的数据包;
    • 节点1路由表指示通过IPIP隧道发送;
    • IPIP模块封装数据包,外层指向节点2服务器IP。
  2. 网络传输
    • 封装包经物理网络传输到节点2;
    • 中间网络设备仅能看到外层IP头。
  3. 目标节点处理
    • 节点2内核解封装,恢复原始Pod通信包;
    • 数据包最终交付给Pod B。

6.IPIP隧道的优缺点分析

6.1 优势特性

  • 内核原生支持:无需额外软件,系统稳定性高;
  • 配置简单直观:命令行配置清晰,运维成本低;
  • 性能表现优异:完全内核处理,无上下文切换开销;
  • 协议透明性好:支持传输各种IP协议数据;
  • 资源消耗低:内存和CPU占用相对较小。

6.2 局限性分析

  • 安全性不足:缺乏加密机制,数据传输为明文;
  • NAT支持差:在复杂NAT环境中配置困难;
  • 功能扩展性有限:相比VXLAN等协议功能单一;
  • IPv6支持有限:主要针对IPv4环境设计;
  • MTU问题:封装增大包尺寸,可能引发路径MTU问题。

7.总结

IPIP隧道作为Linux内核原生的简单隧道协议,其核心价值在于教会我们如何在现有基础网络(Underlay Network)之上构建逻辑独立的虚拟网络(Overlay Network)。这一理念正是现代云计算和容器网络的核心架构思想。

(1)在Kubernetes网络中的实践意义:

  • 一个Kubernetes集群可能包含成千上万个Pod,分布在不同的物理节点上;
  • 每个Pod都需要独立的IP地址,且所有Pod要能在扁平网络中直接通信;
  • 底层物理网络往往存在复杂性和隔离性限制;
  • IPIP隧道等覆盖网络技术完美解决了这些问题。

(2)技术演进视角:

虽然现代云原生网络逐渐转向VXLAN、WireGuard等更先进的技术,但理解IPIP隧道的工作原理仍然是掌握网络虚拟化技术的重要基础。通过学习IPIP隧道,我们能够:

  1. 理解覆盖网络的基本概念和工作原理;
  2. 掌握Linux内核网络栈的隧道实现机制;
  3. 为学习更复杂的网络虚拟化技术奠定基础;
  4. 深入理解容器网络插件的底层实现原理。

IPIP隧道虽然在功能性和安全性方面存在局限,但其简单高效的特性在特定场景下仍具有实用价值,是学习Linux网络技术不可或缺的重要一环。