理解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
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
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
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
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
2
3
4
# 巨人的肩膀
- 《Kubernetes网络权威指南》
上次更新: 2023/05/26, 13:21:02