5

打通 netns 与 VXLAN 网络

 9 months ago
source link: https://hsiaofongw.notion.site/netns-VXLAN-a082948aff3a4e0395635b70d71ec4bd
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
nasa_space_shuttle_columbia.jpg
Drag image to reposition

打通 netns 与 VXLAN 网络

Created
December 8, 2023 6:26 PM
computer-network
vxlan
netns
linux
Description
介绍了怎样使 netns 和 main netns 的 VXLAN 网络三层互通,借鉴了 calico 采取的方式。
Direct
Updated
December 9, 2023 12:50 PM
3 more properties
Linux 提供了 namespace 机制来实现系统资源的隔离,network namespace 提供了对网络资源的隔离。
如图所示:
https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F8551cdf7-056d-46dc-82ad-7ab1ba2283ed%2Ffb802e6a-7336-4449-add6-7dd99be3bc56%2F%25E6%2588%25AA%25E5%25B1%258F2023-12-09_%25E4%25B8%258A%25E5%258D%25882.33.24.png?table=block&id=939a390d-0b26-4b0b-884e-de755ff5c7ca&spaceId=8551cdf7-056d-46dc-82ad-7ab1ba2283ed&width=1600&userId=&cache=v2
我们希望把 netns1 和现有 VXLAN (10.0.1.0/24) 打通,一般情况下,netns1 的 veth 发出的 ARP 请求会到达位于 main netns 的另一端的 veth,然后如果 main netns 中有对应的 IP 就会回应 ARP 查询请求,否则就没有回应,例如 10.0.1.102 位于另一个 VTEP,如果 netns1 往外发出针对 10.0.1.102 的 ARP 查询请求 (who is 10.0.1.102, tell 10.0.1.103) 那么肯定收不到回复,这也就导致 netns1 ping 不通 10.0.1.102。而且,假如 10.0.1.102 发出一个 ARP 查询请求询问 10.0.1.103 的 MAC 地址,则这个 ARP 查询请求最多只会到达 server1 的 main netns, 到不了 10.0.1.103,因此 10.0.1.102 也无法主动向 10.0.1.103 发送数据。
要解决这个问题,我们学习 calico 的做法:
在 main netns 配置精确匹配的路由转发:Destination 10.0.1.103/32, NextHop netns1 在 main netns 的 veth;这样,server2 的 VTEP 就可以收到来自 netns1 的 ARP 查询请求;
启动 VTEP 的 ARP proxy 功能,假设是 “who is 10.0.1.102, tell 10.0.1.103”,netns1 发出的 ARP 查询请求会到达 server1 的 main netns,由于 ARP 查询请求是广播帧,所以 server1 的 main netns 的 VTEP 也会收到,默认情况下由于它不绑定 10.0.1.102,所以它简单地丢弃这个 ARP 查询请求广播帧,但是在开启了 ARP proxy 的情况下,它会把这个 ARP 查询请求转发给其它所有的 VTEP,假如说它的转发表里面没有对应的记录的话。
在 Linux,VXLAN 虚拟网卡的 ARP proxy 功能可以在它创建时设定,也可以在创建后设定,默认为关闭,需要我们显式地启用它。
我们首先启动两个虚拟机,它们位于同一个网段:
Shell
创建 VXLAN 虚拟网卡:
Shell
具体 VM 的 IP 地址可以通过 multipass list 命令查看。
在任意一台 vm 执行:
Shell
会看到 VXLAN 网络本身已经通了。
加下来我们在 vm1 上建立一个 netns,以复现文章开头提到的那种情况:
Shell
现在无论是 vm1(的 main netns)还是 vm2 都 ping 不通 netns1,同样的 netns1 也 ping 不通外面。netns1 的路由是正确的,它把 10.0.1.0/24 的 IP 流量往外转发:
Shell
首先在 vm1 的 main netns 增加一条静态路由:
Shell
这时 netns1 就可以 ping 通 10.0.1.101 了。我们还需要给 netns1 添加一条默认路由,因为仅仅有 10.0.1.0/24 的路由是不够的,ping 也可能用其它网段的地址作为 ICMP 的源地址:
Shell
这时 vm1 和 vm1 的 netns1 就双向 ping 通了:
Shell
但是 netns1 (10.0.1.103) 和 vm2 (10.0.1.102) 仍然不互通。在 netns1 中执行到 10.0.1.102 的 ping 失败之后,如果我们查看一下它的 ARP 表会得到一些发现:
Shell
这表明 netns1 的 veth1 获取不到 10.0.1.102 对应的链路层地址。这时我们启用 netns1 的对端 veth 和 vm1 的 vxlan1 的 ARP 转发功能:
Shell
这时 netns1 和 vm2 就能相互 ping 通了。只启动 vxlan1 的 ARP 转发是不够的,vm2 的 vxlan1 发回来的 ARP 响应会首先到达 vm1 的 main netns,然后还要通过 ns1-veth1-peer 转发到 netns1 内部。
事实上 netns1 和外边的这个 VXLAN 网络并不是二层互通的,因为 IP 封包在跨越 netns 的过程中,它的 MAC 地址就已经被改变了,这就导致 VXLAN 网络上的另一个节点无法直接精准地给 vm1 的 netns1 的 veth1 网卡发消息,而是必须经过 vm1 的 main netns 的转发。因此这就是为什么需要启用 VXLAN 网卡和 veth 网卡的 ARP 转发,
Shell
以及要确保 IP 转发处于启用状态。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK