郑文峰的博客 郑文峰的博客
首页
分类
标签
归档
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
GitHub (opens new window)

zhengwenfeng

穷则变,变则通,通则久
首页
分类
标签
归档
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
GitHub (opens new window)
  • 编程
  • linux
zhengwenfeng
2023-05-26
目录

理解Linux IPIP隧道

# 简介

IPIP隧道是一种点对点的隧道协议,用于在IPv4网络上传输IPv4或IPv6数据包。

IPIP隧道的工作原理是将源主机的IP数据包封装在一个新的IP数据包中,新的IP数据包的目的地址是隧道的另一端。在隧道的另一端,接收方将解封装原始IP数据包,并将其传递到目标主机。IPIP隧道可以在不同的网络之间建立连接,例如在IPv4网络和IPv6网络之间建立连接。

# 使用IPIP隧道实现跨主机网络

首先在Node1创建tun设备并设置为ipip模式,local设置为本地IP地址10.65.132.187,remote设置为对端IP10.65.132.187,这两个是隧道外层IP,然后再设置隧道内层IP,10.10.100.10到10.10.200.10。

ip tunnel add tun1 mode ipip remote 10.65.132.188 local 10.65.132.187
ip link set tun1 up
ip a add 10.10.100.10 peer 10.10.200.10 dev tun1
1
2
3

可以看到添加了一条路由,发送到目的地址10.10.200.10的包都会转发到tun1设备中

# ip r
...
10.10.200.10 dev tun1 proto kernel scope link src 10.10.100.10
...
1
2
3
4

tun设备会将进入的IP包封装到一个IP包中,源地址是之前设置的外层local IP,而目的地址是外层remote IP,然后再通过路由达到从ens18网卡出去到Node2中。

在Node2上创建tun设备,配置和Node1一样

ip tunnel add tun2 mode ipip remote 10.65.132.187 local 10.65.132.188
ip link set tun2 up
ip a add 10.10.200.10 peer 10.10.100.10 dev tun2

1
2
3
4

然后在Node1上ping Node2的tun设备

ping 10.10.200.10 -c 1
1

通过tcpdump在Node2抓包如下:

20:16:40.011992 IP 10.65.132.187 > 10.65.132.188: IP 10.10.100.10 > 10.10.200.10: ICMP echo request, id 17609, seq 1, length 64 (ipip-proto-4)
20:16:40.012099 IP 10.65.132.188 > 10.65.132.187: IP 10.10.200.10 > 10.10.100.10: ICMP echo reply, id 17609, seq 1, length 64 (ipip-proto-4)
1
2

数据包达到Node2后,是一个两层IP数据包,从Node2的ens18网卡出来后,解封数据包,发现内层的目的IP是10.10.200.10也就是tun2的地址,然后将数据包发到tun2设备。

tun2设备收到数据包后再根据上面相同步骤进行封装数据包回包给tun1,最终整个ping过程完成。

IPIP隧道是通过IP地址来标识网络设备的,所以不需要使用MAC地址,直接通过IP地址即可。通过查看tun设备信息,可以看到其是不存在mac地址的。

# ip -d link show tun1
59: tun1@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ipip 10.65.132.187 peer 10.65.132.188 promiscuity 0 minmtu 68 maxmtu 65515 
    ipip ipip remote 10.65.132.188 local 10.65.132.187 ttl inherit pmtudisc addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 
1
2
3
4

# 巨人的肩膀

  • 《Kubernetes网络权威指南》

‍

#linux#计算机网络#Linux网络虚拟化
上次更新: 2025/02/09, 23:47:02
最近更新
01
使用etcd分布式锁导致的协程泄露与死锁问题
05-13
02
基于pre-commit的Python代码规范落地实践
05-12
03
初识 MCP Server
05-01
更多文章>
Theme by Vdoing | Copyright © 2022-2025 zhengwenfeng | MIT License | 赣ICP备2025055428号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式