vxlan网络的唯一标识vni占用24个比特,所以它能虚拟的网络接近17万个,远高于vlan的4096个。另外因为vxlan是三层网络之上的覆盖网络,通过将二层的链路桢封装成UDP数据报进行传输,因此vxlan具备更好的可扩展性。同时因为将原本位于交换机中的转发表条目转移到了终端主机上,有效的减小了交换机的负担,使整个网络的负载更均衡。vxlan是有转发表的,只是关键字由原来的mac地址变成vni,当然也有自学习功能,实际上可以通过bridge命令手动增加、删除vxlan的转发表。
用VirtualBox创建两台虚拟机ubuntu-01与ubuntu-02,使用ubuntu-16.04.3-server-amd64.iso镜像,选装镜像自带的Virtual Machine功能以便于创建KVM虚拟机。另外手动安装桌面环境及virt-manager软件。
ubuntu-01与ubuntu-02网卡设置如下表1:
网卡名称 | 网络类型 | 作用 |
enp0s3 | nat网络 | 连接外部网络,主要用于安装软件包 |
enp0s8 | 仅主机(Host-Only)网络 | 连接ubuntu-01与ubuntu-01的三层网络。vxlan网络就构筑在此三层网络之上。 |
本例计划搭建网络的基本说明:vni为1000、覆盖ubuntu-01与ubuntu-02两台主机、网络带有DHCP功能、能连接外部网络。组网图如下图1:
图1
上图中的橙色部分表示在ubuntu-01中用dnsmasq为整个vxlan网络提供DHCP功能。绿色部分表示在ubuntu-01为整个vxlan网络提供三层路由、连接外网的功能。红色部分则表示们于vxlan之下的三层网络,由VirtualBox的仅主机(Host-Only)网络提供。
网络名称 | vni | 网关 | DHCP地址 | IP地址范围 |
test-br-01 | 1000 | 172.16.0.1 | 172.16.0.2 | 172.16.0.3/24~172.16.0.50/24 |
# DNS监听端口
interface=test-veth-02
# 绑定
bind-interfaces
# 网段
dhcp-range=172.16.0.2,172.16.0.50,255.255.255.0,12h
# 管理IP地址数据文件
dhcp-leasefile=/var/lib/misc/test-dnsmasq.leases
# 网关
dhcp-option=option:router,172.16.0.1
# 192.168.187.3是ubuntu-02上enp0s8的IP地址,192.168.187.4是ubuntu-01上enp0s8的IP地址
ip link add enp0s8vx.1000 type vxlan id 1000 remote 192.168.187.3 local 192.168.210.4 dev enp0s8 dstport 8888
解释:因我本次创建的vxlan网络只覆盖ubuntu-01与ubuntu-02两台主机,那么在两台主机之间创建一个点对点的隧道就可以保证vxlan所依赖的三层互通。但是,如果所覆盖的网络大于2台,那么就需要创建一个组播组,来模拟二层广播域,用来广播arp、dhcp请求,在这种情况下,请看方法二。
方法二:
# 为enp0s8增加组播地址
route add -net 225.0.0.1 netmask 255.255.255.255 dev enp0s8
ip link add enp0s8vx.1000 type vxlan id 1000 group 225.0.0.1 dev enp0s8 dstport 8888
brctl addbr test-br-01
brctl addif test-br-01 enp0s8vx.1000
ip link set test-br-01 up
brctl link set enp0s8vx.1000 up
ip link add test-veth-01 type veth peer name test-veth-02
brctl addif test-br-01 test-veth-01
ip link set test-veth-01 up
ip netns add test-ns-01
ip link set test-veth-02 netns test-ns-01
ip netns exec test-ns-01 ip addr add 172.16.0.2/24 dev test-veth-02
ip netns exec test-ns-01 ip link set test-veth-02 up
ip netns exec test-ns-01 /usr/sbin/dnsmasq --conf-file=/etc/test-dnsmasq.conf
因为dhcp及三层网络是在ubuntu-01中配置的,所以ubuntu-02的配置要简单一些,root登录ubuntu-02执行如下指令:
# 为enp0s8增加组播地址
route add -net 225.0.0.1 netmask 255.255.255.255 dev enp0s8
ip link add enp0s8vx.1000 type vxlan id 1000 group 225.0.0.1 dev enp0s8 dstport 8888
brctl addbr test-br-01
brctl addif test-br-01 enp0s8vx.1000
ip link set test-br-01 up
brctl link set enp0s8vx.1000 up
至此vxlan的二层网络已经搭建完成。
按图1中的规划,需要在ubunt-01上为整个vlan网络提供三层服务。步骤如下。
ip addr add 172.16.0.1/24 dev test-br-01
# 转发规则
iptables -A FORWARD -d 172.16.0.0/24 -o test-br-01 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 172.16.0.0/24 -i test-br-01 -j ACCEPT
iptables -A FORWARD -i test-br-01 -o test-br-01 -j ACCEPT
iptables -A FORWARD -o test-br-01 -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -i test-br-01 -j REJECT --reject-with icmp-port-unreachable
# nat规则
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -d 224.0.0.0/24 -j RETURN
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -d 255.255.255.255/32 -j RETURN
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -d 172.16.0.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -d 172.16.0.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 ! -d 172.16.0.0/24 -j MASQUERADE
# 提交
iptables-save
至此,vlan网络的二层及三层全部搭建完成。
在ubuntu-01上创建KVM虚拟机test01,并连接到vlan网络test-br-01上。在ubuntu-02上执行同样的操作。登录所创建的虚拟机查看ip分配情况,及测试连接性。
通过ifconfig命令可以看到,两台虚拟机都正确分配到了test-br-01网络上的IP地址。运行ping命令,是可以互通的。另外在两台虚拟机中ping外网地址也是可以通过的。如果正确设备了DNS服务器地址,就可以解析域名了。