书籍来源:《Kubernetes网络权威指南:基础、原理与实践》
一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客
Linux原生支持下列5种L3隧道:
- ipip:即IPv4 in IPv4,在IPv4报文的基础上封装一个IPv4报文;
- GRE:即通用路由封装(Generic Routing Encapsulation),定义了在任意一种网络层协议上封装其他任意一种网络层协议的机制,适用于IPv4和IPv6;
- sit:和ipip类似,不同的是sit用IPv4报文封装IPv6报文,即IPv6 over IPv4;
- ISATAP:即站内自动隧道寻址协议(Intra-Site Automatic Tunnel Addressing Protocol),与sit类似,也用于IPv6的隧道封装;
- VTI:即虚拟隧道接口(Virtual Tunnel Interface),是思科提出的一种IPSec隧道技术。
1.6.1 测试ipip隧道
要使用ipip隧道,首先需要内核模块ipip.ko的支持。正常加载应该显示:
创建隧道的方法是先创建一个tun设备,然后将该tun设备绑定为一个ipip隧道。ipip隧道网络拓扑如图1-18所示。
图1-18 ipip隧道网络拓扑
创建两个network namespace:
创建两对veth pair,令其一端挂在某个namespace下:
分别给两对veth-pair端点配上IP并启用:
打开ip_forward的开关(默认是关的):
这种打开方式只是临时的,若想持久,可以修改配置文件/etc/sysctl.conf:
配置路由:
查看路由表:
同理,也给ns2配上通往10.10.10.0/24网段的路由。
ns1上可以ping通10.10.20.2。
保证v1和v2能够通信后,再创建tun设备,并设置为ipip隧道。
在ns1上创建tun1和ipip tunnel:
从tun1发到tun2的原始IP报文和经过隧道封装后的IP报文如图1-19所示。
图1-19 IP报文封装示意图
同理,我们也在ns2上创建tun2和ipip tunnel。
完成上述配置,两个tun设备端点就可以互通了,代码如下:
1.6.2 ipip隧道测试结果复盘
我们试着分析上面的实验过程:
(1)ping命令构建一个ICMP请求,源和目的IP地址分别是10.10.100.10和10.10.200.10。
(2)查看路由表,去往目的地10.10.200.10的报文从tun1出去:
(3)数据包出了tun1,直接到达v1,封装上一层新的IP头,源和目的IP地址分别为10.10.10.2和10.10.20.2。
(4)查看路由表,去往10.10.20.0网段的报文需去往网关10.10.10.1(即v1_p)。
(5)Linux查到10.10.10.0和10.10.20.0这两条直连路由,从这台主机转到另一台主机的v2_p上。
(6)数据包到达v2_p上,会直接从ns2的v2出来。发现内层IP目的IP地址是10.10.200.10(tun2地址),于是将报文交给tun2设备(并完成隧道解封装)。至此,tun1的ping请求包成功到达tun2。
(7)由于ICMP报文有去必有回,所以ns2上会构造ICMP响应报文,并根据以上相同步骤封装和解封装数据包,直至到达tun1,整个ping过程完成。
1.6.3 小结
现在的Linux内核原生支持5种隧道协议,它们的底层实现都采用tun设备。其他隧道实现方式与ipip隧道的大同小异。