1. 目标
1). 建立一个linux bridge, 使用者brctl 命令。
2). 使用 Linux network namespace 模拟虚拟机,方法:ip link 创建veth网卡,分别挂载到bridge和netns里面 \
3). 在netns里面配置ip地址, 比如 100.0.0.2/24
4). 创建vxlan link,并添加到bridge里面
5). 配置vxlan规则,让netns里面的地址100.0.0.0/24可以互通
2. 网桥和ns基本配置
ip netns add ns1
brctl addbr br1
ip link add tap1 type veth peer name tap2
ip link set tap2 netns ns1
brctl addif br1 tap1
ip netns exec ns1 ip addr add local 100.0.0.2/24 dev tap2
ip link set br1 up
ip link set tap1 up
ip netns exec ns1 ip link set tap2 up
目前有三个主机,每个主机上有一个ns1, 配置了一个tap2, 类型是 veth, peer 是bridge 上的tap1. 三个主机的ns1 ip 地址分别为 100.0.0.2/ 3/ 4
3. ns相互通信
1)使用vxlan组播通信
ip link add vxlan0 type vxlan id 100 dstport 4789 group 239.1.1.1 local 192.168.1.4 dev eth0
ip link set vxlan0 master br1
$ ip link set vxlan0 up
每个主机相应配置后,能相互通信,如下: 一开始,只有一条组播条目,所有发出流量都将发送给该组播IP
00:00:00:00:00:00 dst 239.1.1.1 via eth1 self permanent
后面则通过自学习,记录MAC-VTEP_ip的映射关系。如下:
如果规则没有过期,则后续通信则只需要单播即可。
2) 使用单播发送UDP报文
方法一:手动维护VTEP组
首先不指定组播地址,ip link add vxlan0 type vxlan id 100 dstport 4789 local 192.168.1.4 dev eth0 但是需要手动添加如下表项:
$ bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 192.168.1.2
$ bridge fdb append 00:00:00:00:00:00 dev vxlan0 dst 192.168.1.3
这样的话,如果不知道对方 VTEP 的地址,就会往选择默认的表项,发到 192.168.1.2 和 192.168.1.3,相当于手动维护了一个 vtep 的多播组。
方法二:手动维护fdb表和ARP表
上述第一张方法每次要查找 MAC 地址要发送大量的无用报文,如果 vtep 组节点数量很大,那么每次查询都发送 N 个报文,但其中只有一个报文真正有用,造成带宽浪费。 因此新的出发点就是提前知道每个ns的IP和MAC,以及该MAC对应的VTEP ip地址。 配置如下:
$ bridge fdb append 36:ae:ed:9d:22:aa dev vxlan0 dst 192.168.1.2
$ bridge fdb append 4e:11:78:36:da:e7 dev vxlan0 dst 192.168.1.3
对ARP表项来说,一般是ns自己维护的,这样工作量比较大,linux 提供了一个解决方案,vtep 可以作为 arp 代理,回复 arp 请求。设置如下:
ip link add vxlan0 type vxlan id 100 dstport 4789 dev eth0 nolearning proxy
然后,为 vtep 添加 arp 表项,所有要通信的 IP - MAC 二元组都要加进去。
$ ip neigh add 100.0.0.3 lladdr 36:ae:ed:9d:22:aa dev vxlan0
$ ip neigh add 100.0.0.4 lladdr 4e:11:78:36:da:e7 dev vxlan0
当ns第一次发送 ARP 请求时,这个请求并不会发给所有的 vtep,而是当前由当前 vtep 做出应答,大大减少了网络上的报文。
方法三:DOVE Extension
上面这种方式最大的弊端有:在一个大型的网络中,手工维护或者自动化脚本维护静态表项过于庞大,而且很多ns之间可能并没有通信需求,如果提前全部下发的话会造成表项浪费。 Linux 3.8 开始引入Distributed Overlay Virtual Ethernet到内核,目的是方便为 Linux VXLAN 接入控制平面,提升效率。 vxlan配置如下:
ip link add vxlan0 type vxlan id 100 dstport 4789 dev eth0 nolearning proxy l2miss l3miss
两个参数l2miss l3miss表示: l2miss:如果设备找不到 MAC 地址需要的 vtep 地址,就发送通知事件 l3miss:如果设备找不到需要 IP 对应的 MAC 地址,就发送通知事件
因此进一步可以实现: 每个主机上实现一个agent,收集本机上的VTEP_IP和VM_IP,VM_MAC信息,由集中化控制器统一管理,因此可以当 ARP 或者 fdb 表项不存在,发送事件给订阅的APP,这样应用程序从中心化的控制拿到这些信息来更新表项。 常用配置:
ifconfig vxlan0 down
ip link delete vxlan0
ip link add vxlan0 type vxlan id 100 dstport 4789 dev eth0
ip link set vxlan0 master br1
$ ip link set vxlan0 up
ip monitor all dev vxlan0
理解vxlan和vlan之间的转换 https://blog.csdn.net/sinat_31828101/article/details/50504656 http://www.rendoumi.com/vxlanjian-dan-jie-shao/