KVM虚拟化之四种网络模型
文章目录
- KVM虚拟化之四种网络模型
- 1. 四种网络模型简要说明:
- 1.1 隔离模型
- 1.2 路由模型
- 1.3 NAT模型
- 1.4 桥接模型
- 2. 前期准备
- 2.1 环境说明
- 2.2 安装qemu-kvm及解决依赖关系
- 3. 隔离模型
- 3.1 隔离模型中的虚拟机网络
- 3.2 使用qemu-kvm创建虚拟机并实现隔离模型
- 3.2.1 创建br-in网桥
- 3.2.2 创建脚本qemu-ifup
- 3.2.3 创建第一个虚拟机guest01并启动
- 3.2.4 创建第二个虚拟机guest02并启动
- 3.2.5 通信测试
- 4. 路由模型
- 4.1 路由模型模型中的虚拟机网络
- 4.2 使用qemu-kvm创建虚拟机并实现路由模型
- 4.2.1 创建脚本qemu-rtup和qemu-rtdown
- 4.2.2 创建第一个虚拟机guest01并启动
- 4.2.3 创建第二个虚拟机guest02并启动
- 4.2.4 通信测试
- 5. NAT模型
- 5.1 NAT模型中的虚拟机网络
- 5.2 使用qemu-kvm创建虚拟机并实现NAT模型
- 5.2.1 创建脚本qemu-natup和qemu-natdown
- 5.2.2 创建第一个虚拟机guest01并启动
- 5.2.3 创建第二个虚拟机guest02并启动
- 5.2.4 通信测试
- 6. 桥接模型
- 6.1 桥接模型中的虚拟机网络
- 6.2 使用qemu-kvm创建虚拟机并实现桥接模型
- 6.2.1 创建br-in网桥并将eth0添加至br-in桥
- 6.2.2 创建脚本qemu-ifup
- 6.2.3 创建虚拟机guest01并启动
- 6.2.4 通信测试
1. 四种网络模型简要说明:
1.1 隔离模型
该模型的特点是宿主机上的所有虚拟机之间可以组建网络,但是虚拟机无法与宿主机进行通信,也无法与其他网络的主机或其他宿主机上的虚拟机进行通信;相当于将虚拟机只是连接到一个交换机上,而这个交换机是在宿主机上虚拟出来的,即我们通常所说的网桥设备
1.2 路由模型
该模型的特点是在隔离模型的基础上,在宿主机开启了ip路由转发功能,此时的宿主机相当于路由器,完成虚拟机与宿主机的数据报文转发。因此,虚拟机可以宿主机的物理网卡进行通信,但是无法与宿主机之外的主机进行通信,因为宿主机没有对源地址转换,报文可以送到外部主机,但是外部主机无法回应。
1.3 NAT模型
该模型的特点是当虚拟机需要与外部进行通信时,需要将源IP地址转换为物理网卡的IP地址,这样外部主机接收到报文后可以正确的将响应报文发送给目标IP地址(宿主机的物理网卡IP地址),因此,实现虚拟机与外部的通信;
注意:该模型仅仅是实现了源地址转换,实现虚拟机与外部网络的通信,但那是外部网络无法访问虚拟机,如果要实现,则需要在宿主机做目标地址转换。
1.4 桥接模型
该模型的特点是通过创建一个虚拟网卡,为该虚拟机网卡分配可以访问外部网络的IP地址;此时的物理网卡相当于一台交换机设备;虚拟机可以分配与外部网络通信的IP地址实现与外部网络的通信;此时,虚拟机相当于宿主机所在的局域网内单独的一台主机,它宿主机的地位是同等的,没有依存关系。
2. 前期准备
2.1 环境说明
本次测试在VMware workstation 12版本的虚拟机环境中进行,注意开启cpu虚拟化功能;
网络适配器使用仅主机模型,共享主机网络的internet。
OS:centos-6.5_x86-64
eth0: 10.241.96.176/24
采用kvm部署虚拟机,磁盘映像文件使用 cirros-0.3.5-x86_64-disk.img
2.2 安装qemu-kvm及解决依赖关系
## 装载kvm模块:
[root@C65-201 ~]# modprobe kvm
[root@C65-201 ~]# modprobe kvm-intel
## 安装qemu-kvm、bridge-utils
[root@C65-201 ~]# yum install qemu-kvm bridge-utils
## 确保CPU支持HVM
[root@C65-201 ~]# grep -E --color=auto "(vmx|svm)" /proc/cpuinfo
3. 隔离模型
3.1 隔离模型中的虚拟机网络
同一宿主机中,虚拟机如何与宿主机中的网桥通信?
隔离模型中的虚拟机无法与宿主机的物理网卡通信,但是可以与宿主机中的网桥通信;
图中VM表示虚拟机,每个虚拟机的网卡包含前半段和后半段;前半段vNIC在虚拟机上,后半段VIF在宿主机上。图中虚拟机中vNIC网卡对应的后半段为VIF网卡,VM虚拟机中发往vNIF网卡的数据报文都会发往后半段网卡VIF;
同一宿主机中,虚拟机如何与虚拟机通信?
图中br-in是宿主机上的桥设备,也称之为Virtual Switch或者Bridge;在隔离模型中,相当于一个二层的虚拟交换机,要想实现同一宿主机中的虚拟机互相通信,需要满足几个条件:
1)需要在宿主机中创建一个Bridge,图中为br-in
2)需要互相通信的每个虚拟机的前半段IP地址必须在同一网段内;
3)需要互相通信的每个虚拟机的后半段网卡VIF网卡设备添加至br-in这个桥设备n桥。
注意:如果要实现同网段虚拟机不能通信,即虚拟机之间隔离,则需要创建不同的网桥,并将虚拟机的后半段添加至不同的网桥设备,即可实现隔离。
虚拟机如何与宿主机的物理网卡通信?
隔离模型中的虚拟机无法与宿主机的物理网卡通信。
虚拟机如何与外部网络通信?
隔离模型中的虚拟机无法与外部进行通信。
3.2 使用qemu-kvm创建虚拟机并实现隔离模型
3.2.1 创建br-in网桥
## 创建网桥
[root@C65-201 ~]# brctl addbr br-in
## 查看网桥
[root@C65-201 ~]# brctl show
bridge name bridge id STP enabled interfaces
br-in 8000.000000000000 no
## 激活网桥,使之为启动状态
[root@C65-201 ~]# ip link set br-in up
3.2.2 创建脚本qemu-ifup
创建虚拟机并启动时,通过qemu-kvm命令的启动参数,添加VM的前半段网卡,后半段网卡指定ifname参数自动创建,但是需要手动激活并且添加至桥br-in中;通常这部分操作由qemu-ifup这额脚本完成。
[root@kvm ~]# vim /etc/qemu-ifup
#!/bin/bash
BRIDGE=br-in
if [ -n $1 ]; then
ip link set $1 up
sleep 1
brctl addif $BRIDGE $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi
保存后给该脚本添加执行权限并检查语法
[root@C65-201 ~]# chmod +x /etc/qemu-ifup # 添加执行权限
[root@C65-201 ~]# bash -n /etc/qemu-ifup # 检查语法是否有误
当虚拟机停止时,虚拟机网卡的后半段会自动从宿主机中down掉,所以不需要编写down脚本
3.2.3 创建第一个虚拟机guest01并启动
## 创建guest01并启动
[root@C65-201 ~]# qemu-kvm -name guest01 -m 128 -smp 1 --drive file=/images/kvm/guest01.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:aa -net tap,ifname=vif1.0,script=/etc/qemu-ifup -daemonize
## 配置guest01的ip地址
# ip addr add 10.0.1.1/24 dev eth0
3.2.4 创建第二个虚拟机guest02并启动
## 创建guest02并启动
[root@C65-201 ~]# qemu-kvm -name guest02 -m 128 -smp 1 --drive file=/images/kvm/guest02.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:bb -net tap,ifname=vif2.0,script=/etc/qemu-ifup -daemonize
## 配置guest02的ip地址
# ip addr add 10.0.1.2/24 dev eth0
3.2.5 通信测试
在宿主机上查看桥设备,可以看到两台虚拟机的网卡后半段都已经添加至br-in网桥中了
测试guest01和guest02之间的通信
测试宿主机访问虚拟机
根据以上结果,虚拟机与虚拟机之间可以访问,宿主机无法访问虚拟机,实现了隔离模型
4. 路由模型
4.1 路由模型模型中的虚拟机网络
同一宿主机中,虚拟机如何与宿主机中的网桥通信?
路由模型中的虚拟机与宿主机的网桥的通信机制,参考隔离模型
同一宿主机中,虚拟机如何与虚拟机通信?
路由模型中的虚拟机与虚拟机的通信机制,参考隔离模型
虚拟机如何与宿主机的物理网卡通信?
路由模型中的虚拟机要与宿主机的物理网卡进行通信,要满足以下几个条件:
1) 宿主机必须在内核打开IP转发功能,即net.ipv4.ip_forward = 1;
2) 宿主机中的网桥br-in需要添加一个与虚拟机同网段的IP地址;
3) 虚拟机需要添加一条路由,下一跳地址设置为网桥br-in的ip;
虚拟机如何与外部网络通信?
路由模型中的虚拟机无法与外部进行通信;因为虚拟机发送到外部网络的主机时,源地址内网地址,内网地址无法与外部直接通信,且没有对源地址转换为物理网卡的IP地址,因此,外部网络发送的响应报文中的目标地址为虚拟机的IP地址时,无法到达宿主机的物理网卡,故虚拟机无法收到响应报文。
4.2 使用qemu-kvm创建虚拟机并实现路由模型
4.2.1 创建脚本qemu-rtup和qemu-rtdown
创建虚拟机并启动时,通过qemu-kvm命令的启动参数,添加VM的前半段网卡,后半段网卡指定ifname参数自动创建,但是需要手动激活并且添加至桥br-in中;通常这部分操作由qemu-rtup这额脚本完成;关闭虚拟机时由qemu-rtdown完成移除后半段网卡等;
## 添加VM的前半段网卡脚本
[root@C65-201 ~]# vim /etc/qemu-rtup
#!/bin/bash
bridge="br-in"
ifaddr=192.168.1.254 # 网桥br-in的IP地址
checkbr() {
if brctl show | grep -i "^$1"; then
return 0
else
return 1
fi
}
initbr() {
brctl addbr $bridge
ip link set $bridge up
ip addr add $ifaddr/24 dev $bridge
}
enable_ip_forward() {
sysctl -w net.ipv4.ip_forward=1
}
setup_rt() {
checkbr $bridge
if [ $? -eq 1 ]; then
initbr
enable_ip_forward
fi
}
if [ -n "$1" ]; then
setup_rt
ip link set $1 up
brctl addif $bridge $1
exit 0
else
echo "Error: no interface specified."
exit 1
fi
## 删除VM的后半段网卡脚本
[root@C65-201 ~]# vim /etc/qemu-rtdown
#!/bin/bash
bridge="br-in"
isalone_bridge() {
if ! brctl show | awk "/^$bridge/{print \$4}" | grep "[^[:space:]]" &> /dev/null; then
ip link set $bridge down
brctl delbr $bridge
fi
}
if [ -n "$1" ];then
ip link set $1 down
brctl delif $bridge $1
isalone_bridge
exit 0
else
echo "Error: no interface specified."
exit 1
fi
## 保存后给该脚本添加执行权限并检查语法
[root@C65-201 ~]# chmod +x /etc/{qemu-rtup,qemu-rtdown} # 添加执行权限
[root@C65-201 ~]# bash -n /etc/qemu-rtup # 检查语法是否有误
[root@C65-201 ~]# bash -n /etc/qemu-rtdown # 检查语法是否有误
4.2.2 创建第一个虚拟机guest01并启动
## 创建guest01并启动
[root@C65-201 ~]# qemu-kvm -name guest01 -m 128 -smp 1 --drive file=/images/kvm/guest01.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:aa -net tap,ifname=vif1.0,script=/etc/qemu-rtup,downscript=/etc/qemu-rtdown -daemonize
## 在guest01配置其ip地址
# ip addr add 192.168.1.1/24 dev eth0
## 给guest01添加路由
# ip route add default via 192.168.1.254
4.2.3 创建第二个虚拟机guest02并启动
## 创建guest02并启动
[root@C65-201 ~]# qemu-kvm -name guest02 -m 128 -smp 1 --drive file=/images/kvm/guest02.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:bb -net tap,ifname=vif2.0,script=/etc/qemu-rtup,downscript=/etc/qemu-rtdown -daemonize
## 在guest02配置其ip地址
# ip addr add 192.168.1.2/24 dev eth0
## 给guest02添加路由
# ip route add default via 192.168.1.254
4.2.4 通信测试
无法与外部网络的主机进行通信
根据以上结果,虚拟机与宿主机之间可以互相访问,但无法与外部网络通信,实现了路由模型
5. NAT模型
5.1 NAT模型中的虚拟机网络
NAT模型与路由模型的通信机制基本一致,唯一不同的就是,NAT模型可以使虚拟机直接与外部网络进行通信;即只需要在NAT模型中,在宿主机SNAT地址转换,将虚拟机的源地址IP转换为物理网卡的IP地址,发送报文至外部网络的主机;外部网络的主机收到报文后构建的响应报文的目标IP地址,为宿主机的物理网卡的IP地址,而后宿主机在将报文发送至虚拟机,实现了虚拟机与外部网络的通信。
5.2 使用qemu-kvm创建虚拟机并实现NAT模型
5.2.1 创建脚本qemu-natup和qemu-natdown
创建虚拟机并启动时,通过qemu-kvm命令的启动参数,添加VM的前半段网卡,后半段网卡指定ifname参数自动创建,但是需要手动激活并且添加至桥br-in中;通常这部分操作由qemu-natup这额脚本完成;关闭虚拟机时由qemu-natdown完成移除后半段网卡、删除nat规则等;
## 添加脚本
[root@C65-201 ~]# vim /etc/qemu-natup
#!/bin/bash
bridge="br-in"
net="192.168.1.0/24"
ifaddr=192.168.1.254
checkbr() {
if brctl show | grep -i "^$1"; then
return 0
else
return 1
fi
}
initbr() {
brctl addbr $bridge
ip link set $bridge up
ip addr add $ifaddr dev $bridge
}
enable_ip_forward() {
sysctl -w net.ipv4.ip_forward=1
}
setup_nat() {
checkbr $bridge
if [ $? -eq 1 ]; then
initbr
enable_ip_forward
iptables -t nat -A POSTROUTING -s $net ! -d $net -j MASQUERADE
fi
}
if [ -n "$1" ]; then
setup_nat
ip link set $1 up
brctl addif $bridge $1
exit 0
else
echo "Error: no interface specified."
exit 1
fi
## 删除脚本
[root@C65-201 ~]# vim /etc/qemu-natdown
#!/bin/bash
bridge="br-in"
remove_rule() {
iptables -t nat -F
}
isalone_bridge() {
if ! brctl show | awk "/^$bridge/{print \$4}" | grep "[^[:space:]]" &> /dev/null; then
ip link set $bridge down
brctl delbr $bridge
remove_rule
fi
}
if [ -n "$1" ];then
ip link set $1 down
brctl delif $bridge $1
isalone_bridge
exit 0
else
echo "Error: no interface specified."
exit 1
fi
## 保存后给该脚本添加执行权限并检查语法
[root@C65-201 ~]# chmod +x /etc/{qemu-natup,qemu-natdown} # 添加执行权限
[root@C65-201 ~]# bash -n /etc/qemu-natup # 检查语法是否有误
[root@C65-201 ~]# bash -n /etc/qemu-natdown # 检查语法是否有误
5.2.2 创建第一个虚拟机guest01并启动
## 创建guest01并启动
[root@C65-201 ~]# qemu-kvm -name guest01 -m 128 -smp 1 --drive file=/images/kvm/guest01.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:aa -net tap,ifname=vif1.0,script=/etc/qemu-natup,downscript=/etc/qemu-natdown -daemonize
## 在guest01配置其ip地址
# ip addr add 192.168.1.1/24 dev eth0
## 给guest01添加路由
# ip route add default via 192.168.1.254
5.2.3 创建第二个虚拟机guest02并启动
## 创建guest02并启动
[root@C65-201 ~]# qemu-kvm -name guest02 -m 128 -smp 1 --drive file=/images/kvm/guest02.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:bb -net tap,ifname=vif2.0,script=/etc/qemu-natup,downscript=/etc/qemu-natdown -daemonize
## 在guest02配置其ip地址
# ip addr add 192.168.1.2/24 dev eth0
## 给guest02添加路由
# ip route add default via 192.168.1.254
5.2.4 通信测试
根据以上结果,虚拟机与宿主机之间可以互相访问,也可以与外部网络通信,实现了NAT模型
6. 桥接模型
6.1 桥接模型中的虚拟机网络
桥接模型不同于隔离模型、路由模型和NAT模型;在模型下,宿主机会虚拟出一块网卡作为该宿主机的通信网卡,而宿主机的物理网卡则成为桥接设备(也可称为交换机),此时,虚拟机相当于宿主机所在的局域网内单独的一台主机,它宿主机的地位是同等的,没有依存关系。
6.2 使用qemu-kvm创建虚拟机并实现桥接模型
6.2.1 创建br-in网桥并将eth0添加至br-in桥
## 为宿主机创建虚拟网卡,并将物理网卡eth0作为桥设备
[root@C65-201 ~]# cd /etc/sysconfig/network-scripts/
[root@C65-201 network-scripts]# cp ifcfg-eth0 ifcfg-br-in
##修改br-in
[root@C65-201 network-scripts]# vim ifcfg-br-in
DEVICE=br-in
TYPE=Bridge
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=10.241.96.176
NETMASK=255.255.255.0
GATEWAY=10.241.96.1
DNS1=10.241.96.1
## 修改eth0
[root@C65-201 network-scripts]# vim ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:64:9C:CD
TYPE=Ethernet
UUID=62a2f66a-754e-4c46-810c-fd23abff3d5a
ONBOOT=yes
BRIDGE=br-in
NM_CONTROLLED=yes
BOOTPROTO=static
## 重启网络服务
[root@C65-201 network-scripts]# service network restart
查看ip
查看桥设备
此时,物理网卡eth0已经添加至br-in中
6.2.2 创建脚本qemu-ifup
该脚本与隔离模型的qemu-ifup脚本一致,参照3.2.2即可
6.2.3 创建虚拟机guest01并启动
## 创建guest01并启动
[root@C65-201 ~]# qemu-kvm -name guest01 -m 128 -smp 1 --drive file=/images/kvm/guest01.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:11:22:aa -net tap,ifname=vif1.0,script=/etc/qemu-ifup -daemonize
## 在guest01配置其ip地址
# ip addr add 10.241.96.90/24 dev eth0
## 在guest01添加路由
# ip route add default via 10.241.96.1
6.2.4 通信测试
以上是KVM最简单的四种网络模型,在生产环境中使用的最多的是桥接模型,但是桥接模型的安全性是最低的,因为虚拟机直接暴露给了外部网络;而现在的容器技术中,NAT网络模型使用的较多,比如docker