网络虚拟化之虚拟局域网技术VXLAN

一、概述

 其他虚拟网络技术相关请查看: 虚拟网络技术资料汇总 

接上篇网络虚拟化之虚拟交换机技术Linux Bridge再来看看虚拟局域网技术VXLAN。有了虚拟设备如何组建虚拟局域网?

 几个核心点:

1. 在三层网络UDP之上传输二层包以太网帧,可实现跨机房

2. 虚拟子网末端有专门的设备 VTEP来做封包和解包,可以是专用的三层物理设备也可以是虚拟的比如bridge

3. 典型的Overlay网络,相对于Underlay(物理网络)

二、核心原理

有了虚拟化网络设备后,下一步就是要使用这些设备组成网络。传统的VLAN技术,由于协议设计时只预留了12bit来标识子网,导致最多只能支持4096个虚拟子网,所以IETF重新推出了VXLAN的虚拟网标准。
VXLAN是三层虚拟化网络,是典型的Overlay网络,有24bit用以标识虚拟子网,最多支持1677万个。
VXLAN封包格式如下:

相对于原始的以太网帧会增加50字节数据。


三、使用示例

以类似下图的形式组一个VXLAN。两台主机,每台主机建一个独立的网络空间,打通这俩网络空间的内网。

3.1 创建VXLAN的VTEP

(先尝试一次组播寻址的方式)

ip link add vtep0 type vxlan id 1 group 239.1.1.2 dev eth0 dstport 4789 

使用 eth0的多播组 239.1.1.2 通信。

id 1:VNI的值,在1~2的24次方之间
dstport: VTEP通信端口,IANA分配的是4789,Linux默认使用8472
dev eth0:当前节点用于VTEP要使用的IP地址,用来获取VTEP IP地址。注意这个与参数local参数.

查看VXLAN接口信息。

ip -d link show vtep0

23: vtep0: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 0e:f9:0d:9f:66:5f brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 1 group 239.1.1.1 dev eth0 srcport 0 0 dstport 4789 ageing 300 noudpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535    

3.2 启动设备

ip link set dev vtep0 up

3.3 将VTEP设备接入虚拟网关

具体参考上一篇网络虚拟化之虚拟交换机技术Linux Bridge

ip link set dev vtep0 master mbr0

同样方式在另一台机器上创建一个VTEP。

ip link add vtep1 type vxlan id 1 group 239.1.1.2 dev eth0 dstport 4789

测试了一下,在云上虚拟机,组播不通。

tcpdump -i eth0 -n| grep "239\.1\.1"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

17:44:00.361638 IP 172.30.4.5.41784 > 239.1.1.2.4789: VXLAN, flags [I] (0x08), vni 43
17:44:01.363966 IP 172.30.4.5.41784 > 239.1.1.2.4789: VXLAN, flags [I] (0x08), vni 43
17:44:02.365969 IP 172.30.4.5.41784 > 239.1.1.2.4789: VXLAN, flags [I] (0x08), vni 43

ping另一台vxlan的IP地址时,本机可以看到组播包发出了,并且是vxlan封包的形式,但在另一个vtep节点上抓不到通过vtep设备的组播包。所以当前机器环境并不能组播。

3.4 使用IP对接的形式连通VTEP

 IP是172.30.4.5的主机设备1上执行:

ip link add vtep0 type vxlan id 33 dstport 4789 remote 172.30.4.5 dev eth0

IP是172.30.4.3的主机设备2上执行:

ip link add vtep1 type vxlan id 33 dstport 4789 remote 172.30.4.3 dev eth0

可以给两个VTEP分别指定一个IP(打通两个内网时实际上不是必须的),在vtep1机器上ping vtep0的IP,结果如下:

ping 10.1.2.100
PING 10.1.2.100 (10.1.2.100) 56(84) bytes of data.
64 bytes from 10.1.2.100: icmp_seq=1 ttl=64 time=0.557 ms
64 bytes from 10.1.2.100: icmp_seq=2 ttl=64 time=0.219 ms
64 bytes from 10.1.2.100: icmp_seq=3 ttl=64 time=0.379 ms

成功了。抓下包看看过程:

vtep1机器上通过eth0的包信息:

tcpdump -i eth0 -n| grep "10\.1\.2"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
ARP, Request who-has 10.1.2.100 tell 10.1.2.101, length 28
ARP, Reply 10.1.2.100 is-at 56:62:bb:66:ed:d6, length 28
IP 10.1.2.101 > 10.1.2.100: ICMP echo request, id 24249, seq 1, length 64
IP 10.1.2.100 > 10.1.2.101: ICMP echo reply, id 24249, seq 1, length 64
IP 10.1.2.101 > 10.1.2.100: ICMP echo request, id 24249, seq 2, length 64
IP 10.1.2.100 > 10.1.2.101: ICMP echo reply, id 24249, seq 2, length 64
IP 10.1.2.101 > 10.1.2.100: ICMP echo request, id 24249, seq 3, length 64

前两行做ARP寻址,后面是ping的过程。

vtep0机器上通过eth0的包信息:

tcpdump -i eth0 -n| grep "10\.1\.2"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

ARP, Request who-has 10.1.2.100 tell 10.1.2.101, length 28
ARP, Reply 10.1.2.100 is-at 56:62:bb:66:ed:d6, length 28
IP 10.1.2.101 > 10.1.2.100: ICMP echo request, id 24249, seq 1, length 64
IP 10.1.2.100 > 10.1.2.101: ICMP echo reply, id 24249, seq 1, length 64
IP 10.1.2.101 > 10.1.2.100: ICMP echo request, id 24249, seq 2, length 64
IP 10.1.2.100 > 10.1.2.101: ICMP echo reply, id 24249, seq 2, length 64

现在已经打通两个VTEP的寻址。

接下来将两套veth pair中的veth0连接到bridge。

完整创建veth的脚本如下:(主机1)

ip netns add test-yao
ip link add veth0 type veth peer name veth1
ip link set dev veth1 netns test-yao
ip netns exec test-yao ip link set veth1 up
ip netns exec test-yao ip addr add 10.1.1.101/24 dev veth1
ip link set dev veth0 master mbr0
ip link set veth0 up
ip netns exec test-yao ip link set lo up

注意需要在创建的网络空间中启动lo设备。

3.5 看看网桥的地址列表信息

执行bridge fdb:

33:33:00:00:00:01 dev eth0 self permanent
01:00:5e:00:00:01 dev eth0 self permanent
33:13:f3:f8:33:54 dev eth0 self permanent
de:2d:3f:85:2b:6c dev veth0 master mbr0 permanent
de:2d:3f:85:2b:6c dev veth0 vlan 1 master mbr0 permanent
33:33:00:00:00:01 dev veth0 self permanent
01:00:5e:00:00:01 dev veth0 self permanent
33:33:ff:85:2b:6c dev veth0 self permanent
33:33:00:00:00:01 dev mbr0 self permanent
01:00:5e:00:00:01 dev mbr0 self permanent
33:33:ff:56:ae:ed dev mbr0 self permanent
0e:7e:01:56:ae:ed dev vtep0 master mbr0 permanent
0e:7e:01:56:ae:ed dev vtep0 vlan 1 master mbr0 permanent
00:00:00:00:00:00 dev vtep0 dst 172.1.4.15 via eth0 self permanent

可以看到虚拟网卡veth0、vtep0都已经连入交换机mbr0。  

最后一行00:00:00:00:00:00 dev vtep10 dst 172.1.4.15 via eth0 self permanent 预示着vtep0会通过主机eth0联调到172.1.4.15机器。

另一台主机能看到类似的地址列表信息。

在主机2上同样执行这段脚本,只需要把veth1的IP换成另外一个同一网段的即可10.1.1.102。

在主机1上执行:#ip netns exec test-yao ping 10.1.1.102

在主机2上执行:#ip netns exec test-yao ping 10.1.1.101

#ip netns exec test-yao ping 10.1.1.102
PING 10.1.1.102 (10.1.1.102) 56(84) bytes of data.
64 bytes from 10.1.1.102: icmp_seq=1 ttl=64 time=0.489 ms
64 bytes from 10.1.1.102: icmp_seq=2 ttl=64 time=0.227 ms

成功打通!

最后感兴趣的同学如果试验过程中遇到问题,可随时留言沟通。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechingOn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值