Linux网络虚拟化之vlan

        利用Linux操作系统提供的网络虚拟化功能,创建一个跨主机覆盖的vlan网络。vlan id占用12比特的数字,可表示的范围是4096,最多可以创建4096个vlan网络。为什么是这么小呢? vlan构筑在大二层网络之上,二层网络是局域网,规模是有限的。在有限的二层网络上创建虚拟网,4096应该是足够大的了。

1.准备实现环境

        用VirtualBox创建两台虚拟机ubuntu-01与ubuntu-02,使用ubuntu-16.04.3-server-amd64.iso镜像,选装镜像自带的Virtual Machine功能以便于创建KVM虚拟机。另外手动安装桌面环境及virt-manager软件。

        ubuntu-01与ubuntu-02网卡设置如下表:

网卡名称 网络类型 作用
enp0s3 nat网络 连接外部网络,主要用于安装软件包
enp0s9 内部网络 为分别位于ubuntu-01与ubuntu-02中的虚拟机互通提供物理连接

2.组网图

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

                                                                                     图1

上图是将要实现网络的连接示意图,创建一个vlan id为100的跨ubuntu-01与ubuntu-02的vlan网络。在ubuntu-01中用dnsmasq为整个vlan网络提供DHCP功能,如图中的橙色部分。同时在ubuntu-01中利用iptables为整个网络提供三层网络服务,使新创建的VLAN网络具备连接外网的能力。图中红色部分为VirtualBox的内部网络,用来模拟现实中的物理交换机。最终目的是实现ubuntu-01中的虚拟机test01与ubuntu-02的虚拟机test02能同时接入VLAN网络并能连接外网。

下表是所创建vlan网络的IP地址规划表

网络名称 VLAN ID 网关 DHCP地址 IP地址范围
test-br-01 100 172.16.0.1 172.16.0.2 172.16.0.3/24~172.16.0.50/24
                                                                                  表1

3.创建二层vlan网络

  •     首先用root账户登录ubuntu-01,根据图1及表1的规划配置dnsmasq。创建文件/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
  • 在网卡enp0s9上创建vlan从设备enp0s9.100,vlan id为100,运行如下命令:
ip link set enp0s9 promisc on
ip link add link enp0s9 enp0s9.100 type vlan id 100
  • 创建网桥test-br-01,并挂接enp0s9.100,命令如下:
    brctl addbr test-br-01
    brctl addif test-br-01 enp0s9.100
    ip link set test-br-01 up
    ip link set enp0s9.100 up

启动dnsmasq服务。为了隔离dnsmasq,使它只为本次创建的网络服务,而不是ubuntu-01连接的所有网络,需要创建网络名称空间test-ns-01实现隔离,并用veth pair设备连接test-ns-01名称空间与系统名称空间。其中veth pair中的test-veth-02放入名称空间,并手动l设置IP地址172.16.0.2,作为DHCP服务的监听地址。另一端test-veth-01挂接到网桥test-br-01上。启动设备后,在名称空间test-ns-01下启动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

用root账户登录ubuntu-02。同样,在enp0s9上创建VLAN从设备enp0s9.100,vlan id为100。创建网桥test-br-01并将enp0s9.100挂接上,然后启动所有创建的设备。在ubuntu-02中无需配置dnsmasq相关的内容。命令如下:

ip link set enp0s9 promisc on
ip link add link enp0s9 enp0s9.100 type vlan id 100
brctl addbr test-br-01
brctl addif test-br-01 enp0s9.100
ip link set test-br-01 up
ip link set enp0s9.100 up

至此,vlan网络的二层相关部分已经搭建完成,可以创建虚拟机并能互通了。但是还不能连接外网。

4.为vlan网络设置三层服务。

  按图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网络的二层及三层全部搭建完成。

5.测试网络

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

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

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