本文目录导读:

IPIP隧道(通常指 IP in IP 隧道,协议号为 4)是一种非常简单的隧道技术,它将一个完整的 IP 数据包封装在另一个 IP 数据包的数据部分中。
它的工作原理是:你在原始IP数据包外面再加一个IP包头,外层IP包头的目标地址是隧道的终点。
核心概念
- 原始数据包:源主机A想要发送给目标主机B的数据包。
- 外层IP头:这个新包头决定了这个封装后的数据包在公网或骨干网上的路由,源地址是隧道入口(本地公网IP),目标地址是隧道出口(远端公网IP)。
- 内层IP头:原始的数据包,其源和目标地址通常是私有IP或公网IP。
IPIP隧道的典型应用场景
- 连接两个隔离的IPv4网络:在两个位于不同地理位置的私有网络(例如公司总部和分公司,都使用192.168.x.x)之间建立连接。
- IPv6 over IPv4:虽然这不是标准的IPIP(协议号4),但思科等厂商的“IPv6 over IPv4”技术(协议号41)本质上也是一种类似IPIP的封装。
- VPN(虚拟专用网络):作为简单的站点到站点VPN的底层技术。
- 绕过网络限制:将数据包封装后,使其看起来像是发往隧道出口的普通IP流量。
优缺点
| 优点 | 缺点 |
|---|---|
| 极其简单高效:几乎不增加计算开销,没有认证、加密、无状态。 | 无安全性:没有加密,数据包是明文传输。 |
| 易于实现:Linux内核原生支持,配置简单。 | 无认证:无法验证通信双方的身份,易受欺骗攻击。 |
| 低延迟:不需要像GRE那样维护额外的状态信息。 | 可能产生分片:由于增加了外层IP头,数据包总长度超过MTU时,需要分片。 |
| 性能好:纯网络层操作。 | 灵活性差:只能承载IP协议(IPv4 over IPv4)。 |
如何配置IPIP隧道(以Linux为例)
在Linux上配置IPIP隧道非常简单,主要使用ip命令。
场景假设
- 隧道入口(A点):公网IP
0.113.1,内网IP段0.1.0/24。 - 隧道出口(B点):公网IP
51.100.1,内网IP段0.2.0/24。
目标:让 A 点和 B 点的内网主机能通过 IPIP 隧道通信。
步骤:在A点机器上配置
-
创建隧道接口
sudo ip tunnel add tun0 mode ipip remote 198.51.100.1 local 203.0.113.1 ttl 255
tun0:本地隧道接口名称。mode ipip:指定隧道模式为IP in IP。remote 198.51.100.1:隧道对端(B点)的公网IP。local 203.0.113.1:隧道本端(A点)的公网IP。ttl 255:设置外层IP包的TTL值,防止环路。
-
激活(启用)隧道接口
sudo ip link set tun0 up
-
配置隧道内层IP地址
tun0接口需要一个IP地址,这个IP是内层网络的地址,通常选用一个私有IP地址段,0.0.1/30(/30是点对点链路的经典配置)。sudo ip addr add 10.0.0.1/30 dev tun0
-
添加路由 告诉系统,发往B点内网
0.2.0/24的流量,要通过tun0隧道出去。sudo ip route add 10.0.2.0/24 via 10.0.0.2 dev tun0
via 10.0.0.2:这是隧道对端(B点)的隧道接口IP,我们会在B点配置为0.0.2。
步骤:在B点机器上配置
-
创建隧道接口
sudo ip tunnel add tun0 mode ipip remote 203.0.113.1 local 198.51.100.1 ttl 255
-
激活隧道接口
sudo ip link set tun0 up
-
配置隧道内层IP地址
sudo ip addr add 10.0.0.2/30 dev tun0
-
添加路由
sudo ip route add 10.0.1.0/24 via 10.0.0.1 dev tun0
验证
在A点的一台内网主机(例如IP 0.1.100)上,ping B点的内网主机(例如IP 0.2.100)。
ping 10.0.2.100
如果配置正确,应该能成功ping通,此时数据包会:
- 从 A 点主机到 A 点路由器(或配置了隧道的机器)。
- A点机器看到目标
0.2.100,查路由表,匹配0.2.0/24 via 10.0.0.2 dev tun0。 - A点机器将原始数据包封装,外层源IP为
0.113.1,外层目标IP为51.100.1。 - 封装后的包通过公网发送到B点机器。
- B点机器解封装,看到内层目标IP为
0.2.100,然后将其送入内网0.2.0/24。
注意事项
-
防火墙规则:需要在出口和入口机器的防火墙上开放协议号4(IPIP)的流量,而不是特定的TCP或UDP端口,在iptables中:
sudo iptables -A INPUT -p ipencap -j ACCEPT
-
MTU问题:IPIP隧道会额外增加20字节(无选项)或更多字节的IP头,这会导致标准以太网MTU(1500字节)的数据包无法通过,经常需要调整内网接口或路径MTU,常用的做法是降低隧道接口的MTU,
sudo ip link set tun0 mtu 1480
-
内核支持:需要Linux内核编译了
CONFIG_NET_IPIP选项(通常是默认开启的)。
IPIP隧道是一个轻量级、无状态、无加密的网络隧道方案,它非常适合在可信网络环境中,用于连接两个隔离的IPv4网络,由于其简单和高效,它常被用于骨干网路由、MPLS(多协议标签交换)域间通信等场景,但它绝对不能用于安全敏感的场景,因为其无认证、无加密的特性会使数据暴露于风险之中,对于需要安全性的隧道,请考虑使用IPsec、OpenVPN或WireGuard等方案。