Linux网络虚拟化之vxlan

        vxlan网络的唯一标识vni占用24个比特,所以它能虚拟的网络接近17万个,远高于vlan的4096个。另外因为vxlan是三层网络之上的覆盖网络,通过将二层的链路桢封装成UDP数据报进行传输,因此vxlan具备更好的可扩展性。同时因为将原本位于交换机中的转发表条目转移到了终端主机上,有效的减小了交换机的负担,使整个网络的负载更均衡。vxlan是有转发表的,只是关键字由原来的mac地址变成vni,当然也有自学习功能,实际上可以通过bridge命令手动增加、删除vxlan的转发表。

1.实验环境

        用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网络就构筑在此三层网络之上。
                                                                                                表1

2.组网图

        本例计划搭建网络的基本说明:vni为1000、覆盖ubuntu-01与ubuntu-02两台主机、网络带有DHCP功能、能连接外部网络。组网图如下图1:

Linux网络虚拟化之vxlan_第1张图片

                                                                                             图1

上图中的橙色部分表示在ubuntu-01中用dnsmasq为整个vxlan网络提供DHCP功能。绿色部分表示在ubuntu-01为整个vxlan网络提供三层路由、连接外网的功能。红色部分则表示们于vxlan之下的三层网络,由VirtualBox的仅主机(Host-Only)网络提供。

3.vxlan IP地址规划

网络名称 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

4.创建vxlan网络

  • 登录ubuntu-01,配置dnsmas1,创建文件/etc/test-dnsmasq.conf,添加如下内容:
# 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
  • 在网卡enp0s8上创建vxlan从设备enp0s8vx.1000,有两种方法:
方法一:
# 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
  • 创建网桥test-br-01,并挂接enp0s8vx.1000:
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
  • 启动dnsmasq
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
  • 配置ubuntu-02

因为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的二层网络已经搭建完成。

5.配置三层网络

按图1中的规划,需要在ubunt-01上为整个vlan网络提供三层服务。步骤如下。

  • 用root账户登录ubuntu-01
  • 为test-br-01设置IP地址,使它可以向ubuntu-01的网络栈注入数据
ip addr add 172.16.0.1/24 dev test-br-01
  • 设置iptables的转发及nat规则
# 转发规则
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网络的二层及三层全部搭建完成。

6.测试网络

在ubuntu-01上创建KVM虚拟机test01,并连接到vlan网络test-br-01上。在ubuntu-02上执行同样的操作。登录所创建的虚拟机查看ip分配情况,及测试连接性。

通过ifconfig命令可以看到,两台虚拟机都正确分配到了test-br-01网络上的IP地址。运行ping命令,是可以互通的。另外在两台虚拟机中ping外网地址也是可以通过的。如果正确设备了DNS服务器地址,就可以解析域名了。


你可能感兴趣的:(Linux网络虚拟化)