我试图了解linux内核中的vxlan驱动程序代码 . 内核版本是:3.16.0-29-generic
看看 vxlan.c
似乎每个VNI都创建了一个vxlan dev,并且它与netdevice所属的netns相关联,并且每个dev都创建一个udp套接字 .
我对此感到有点困惑,因为除了全局网络之外,您无法将vxlan设备真正连接到物理设备( ethx
),因为物理设备必须属于与vxlan设备相同的网络 .
例如:如果我在全局netns中创建vxlan链接,它将按预期工作:
ip link add vxlan0 type vxlan id 10 dev eth0
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.10.100.51/24 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:22:4d:99:32:6b brd ff:ff:ff:ff:ff:ff
inet 192.168.0.25/24 brd 192.168.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::222:4dff:fe99:326b/64 scope link
valid_lft forever preferred_lft forever
15: vxlan0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN group default
link/ether fe:9c:49:26:ba:63 brd ff:ff:ff:ff:ff:ff
如果我尝试在网络命名空间中执行相同的操作,它将无法工作:
ip netns exec test0 ip link add vxlan1 type vxlan id 20 dev eth0
ip netns exec test0 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
这里的问题是它不喜欢“dev eth0”,因为代码检查eth0是否与添加的链接在同一个netns中 .
如果我创建没有eth0的相同设备,它可以正常工作:
ip netns exec test0 ip link add vxlan1 type vxlan id 20
ip netns exec test0 ip a
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
3: vxlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
link/ether 46:7a:5b:87:7d:2f brd ff:ff:ff:ff:ff:ff
如果你不能将运营商连接到vxlan设备,你怎么能真正tx / rx数据包进出主机外?
这是否真的意味着您只能将vxlan驱动程序与全局netns一起使用,或者您“必须”将它与桥接器一起使用?
vxlan数据包具有与之关联的VNI . 您应该能够使用它直接将数据包发送到非全局网络中的开发人员,类似于macvlans真正可能的情况 .
我错过了什么吗?
3 回答
事实证明,您可以将物理设备添加到非全局网络中 . 因此这个问题没有实际意义 . 我宁愿在全局网络中看到一个vxlan设备基于VNI将数据包发送到适当的网络,类似于在macvlans的情况下如何实现 .
在内核4.3中,有patches添加了一种使用VXLAN的新方法,使用单个VXLAN netdev和路由规则来添加隧道信息 .
根据补丁,您将能够创建查看隧道信息的路由规则,例如:
并使用以下规则添加封装头:
我想你可以看看http://events.linuxfoundation.org/sites/events/files/slides/2013-linuxcon.pdf
您可以打开不在全局网络中的vxlan设备的l2miss和l3miss,并手动设置ARP和FDB条目 .
以下示例显示了如何实现此目的 .
上面的脚本在两台主机上的两个docker容器之间设置了一个覆盖网络 . Vxlan设备连接到
overlay
netns中的桥br0
,br0
用一对veth设备连接到容器netns .现在检查新设置的覆盖网络 .
清理每台主机
解释为什么vxlan设备在非全局网络中不使用接收器的原因:
请注意,我们首先在全局netns中创建vxlan设备并将其移动到
overlay
netns中 . 这确实是需要的,因为在创建vxlan设备时,内核中的vxlan驱动程序将保留对src netns的引用 . 请参阅drivers / net / vxlan.c中的以下代码和vxlan驱动程序在src netns中创建udp套接字