linux 虚拟网络模型介绍

  • 第一种隔离模型

 

         每一个虚拟机实例的网卡都有两个接口,一端接在虚拟机内部,一端接在宿主机内部,如上图所示eth0就是接在虚拟机内部的,而vnet0就是接在宿主机内部的,只要再创建一个虚拟网桥(virtual Bridge)就可以虚拟机实例之间通信 
   
 
      启用隔离模型
# 由于安装管理kvm虚拟机的包组的时候,已经将bridge-utils-1.5-9.el7.x86_64包作为依赖安装了,因此可以直接使用brctl命令
 
# 获取帮助
brctl --help
 
# 创建虚拟桥
brctl addbr host_only_br0
 
# 激活虚拟桥
ifconfig host_only_br0 up
 
# 创建虚拟磁盘文件
mkdir /root/vm/
cp /root/cirros-0.3.3-x86_64-disk.img /root/vm/disk1.qcow2
cp /root/cirros-0.3.3-x86_64-disk.img /root/vm/disk2.qcow2
cp /root/cirros-0.3.3-x86_64-disk.img /root/vm/disk3.qcow2
 
# 修改创建的那两个脚本文件,将桥设备从 br0 改为 host_only_br0
###################################### 启动脚本的内容 ########################
 
#! /bin/bash
 
# 把这里修改为host_only_br0
bridge=host_only_br0
# 如果$1的值不为空
if [ -n "$1" ];then
# 启动网卡接口地址
ip link set $1 up
sleep 1
 
# 将网卡接口连接至物理桥上,此时为桥接模式
brctl addif $bridge $1
 
# 确保以上命令执行成功后退出
[ $? -eq 0 ] && exit 0 || exit 1
 
else
echo "Error: RONG interface" && exit 1
 
fi
 
###################################### 启动脚本的内容 ########################
 
chmod +x /etc/qemu-ifup
 
# 2:/etc/qemu-ifdown脚本, 且给脚本一个执行权限
 
###################################### 停止脚本的内容 ########################
#! /bin/bash
 
# 这里也需要修改为host_only_br0
bridge=host_only_br0
# 如果$1的值不为空
if [ -n "$1" ];then
# 停止网卡接口地址
ip link set $1 down
sleep 1
 
# 将网卡接口从物理桥上删除
brctl delif $bridge $1
 
# 确保以上命令执行成功后退出
[ $? -eq 0 ] && exit 0 || exit 1
 
else
echo "Error: RONG interface" && exit 1
 
fi
###################################### 停止脚本的内容 ########################
 
chmod +x /etc/etc/qemu-ifdown
 
 
 
# 创建第一个虚拟机实例,这里在创建实例的时候,ifname:为宿主机这端网卡的名称。script:指定创建虚拟机的时候,虚拟网卡连接的是哪个桥设备。downscript:执行在停止虚拟机的时候,如何删除虚拟网卡与桥设备的连接
qemu-kvm -name kvm_linux1 -m 200 -smp 2 -drive file=/root/vm/disk1.qcow2,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:01:01:01 -net tap,ifname=virtual_eth1,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :1 -daemonize
 
# 创建第二个虚拟机实例
qemu-kvm -name kvm_linux2 -m 200 -smp 2 -drive file=/root/vm/disk2.qcow2,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:01:01:02 -net tap,ifname=virtual_eth2,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -vnc :2 -daemonize
 
# 连接到虚拟机的控制台(在windows上调用xmanager,在Mac上调用XQuartz)
 
# 使用vnc连接第一个虚拟节点
vncviewer :1
sudo ifconfig eth0 192.168.23.10/24 up
 
# 使用vnc连接第二个虚拟节点
vncviewer :2
sudo ifconfig eth0 192.168.23.11/24 up
 
 
  • 第二种路由host-only模型

 

      开启host-only模型很简单,在隔离模式上,给host_only_br0一个IP地址即可

ifconfig host_only_br0 192.168.23.1/24 up
 
 
 
 
 
  • 第三种NAT模型

  • 在原有的基础之上,启用NAT模型
# 给虚拟主机实例添加一个网关
route add default gw 192.168.23.1
 
# 在宿主机打开网卡间转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
 
# 再ping宿主机的IP发现可以ping通了,因为网卡间转发功能打开
 
# 但是此时ping其他外网的主机,还是ping不通的,可以使用tcpdump -i eno16777736 -nn icmp抓包分析下。这是因为,外网主机收到ping报文后不知道发给谁,解决办法有两种,第一种是给外网主机添加一条路由条目,让来自192.168.23.0/24的报文,都发往192.168.43.11这个IP所在的网卡,或者在宿主机上写一条SNAT规则,让来自192.168.23.0/24的报文都的原IP地址都是宿主机网卡的IP地址,都是这样宿主机的IP将会被此虚拟机实例捆绑,因此,我们在br0上,再添加一个IP地址
ifconfig br0:0 192.168.43.12/24 up
 
# 再添加SNAT规则
iptables -t nat -A POSTROUTING -s 192.168.23.0/24 -j SNAT --to-source 192.168.43.12
 
# 最后添加DNAT规则,使得外网主机ping内网主机的时候,也可以ping通,这时宿主机就像四层负载均衡调度器一样了
iptables -t nat -A PREROUTING -d 192.168.43.12/24 -j DNAT --to-destination 192.168.23.10
 
# 在虚拟机实例中再ping一下外网主机,此时就可以ping通了
ping 192.168.43.80(Mac电脑的IP)
 
# 在Mac电脑的terminal终端,ping 192.168.43.12也能够ping通,但是响应用户ping的不是192.168.43.12网卡,而是内网主机192.168.23.10网卡
 
 
 
  • 第四种桥接模型

 

 

 

首先必须创建网卡连接桥接口的启动脚本和停止脚本,其中脚本中的 $1:表示为虚拟机的网卡的右边接口,这两个脚本就是讲虚拟机的网卡的右边接口接在网桥上,实现桥接模型
 
 
# 1:/etc/qemu-ifup脚本,且给脚本一个执行权限
###################################### 启动脚本的内容 ########################
 
#! /bin/bash
 
bridge=br0
# 如果$1的值不为空
if [ -n "$1" ];then
# 启动网卡接口地址
ip link set $1 up
sleep 1
 
# 将网卡接口连接至物理桥上,此时为桥接模式
brctl addif $bridge $1
 
# 确保以上命令执行成功后退出
[ $? -eq 0 ] && exit 0 || exit 1
 
else
echo "Error: RONG interface" && exit 1
 
fi
 
###################################### 启动脚本的内容 ########################
 
chmod +x /etc/qemu-ifup
 
# 2:/etc/qemu-ifdown脚本, 且给脚本一个执行权限
 
###################################### 停止脚本的内容 ########################
#! /bin/bash
 
bridge=br0
# 如果$1的值不为空
if [ -n "$1" ];then
# 停止网卡接口地址
ip link set $1 down
sleep 1
 
# 将网卡接口从物理桥上删除
brctl delif $bridge $1
 
# 确保以上命令执行成功后退出
[ $? -eq 0 ] && exit 0 || exit 1
 
else
echo "Error: RONG interface" && exit 1
 
fi
###################################### 停止脚本的内容 ########################
 
chmod +x /etc/etc/qemu-ifdown
 
 
(二)创建一个有网络接口的虚拟机实例
# -net nic指明为网卡接口,model指明virtio虚拟网卡驱动,macaddr为虚拟网卡的Mac地址
# -net 指定网卡的连接方式,物理机的TAP网络接口连接至vlan中,ifname=virtual_eth0 指定宿主机虚拟网卡名称,默认连接的是br0,桥接模型
# -daemonize:指明以daemon的方式运行
qemu-kvm -name kvm_linux -m 200 -smp 2 -drive file=/root/cirros-0.3.3-x86_64-disk.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:01:01:01 -net tap,ifname=virtual_eth1 -vnc 192.168.43.11:1 -daemonize
 
(三)通过vnc连接
vncviewer 192.168.43.11:1
 
(四)输入用户和密码,登入,看看网卡eth0是否有IP,且ping一下www.baidu.com是否ping通
创建一个有网络接口的虚拟机实例
# -net nic指明为网卡接口,model指明virtio虚拟网卡驱动,macaddr为虚拟网卡的Mac地址
# -net 指定网卡的连接方式,物理机的TAP网络接口连接至vlan中,ifname=virtual_eth0 指定宿主机虚拟网卡名称,默认连接的是br0,桥接模型
# -daemonize:指明以daemon的方式运行
qemu-kvm -name kvm_linux -m 200 -smp 2 -drive file=/root/cirros-0.3.3-x86_64-disk.img,media=disk,if=virtio,format=qcow2 -net nic,model=virtio,macaddr=52:54:00:01:01:01 -net tap,ifname=virtual_eth1 -vnc 192.168.43.11:1 -daemonize
 
通过vnc连接
vncviewer 192.168.43.11:1

 

 

 
posted @ 2017-10-09 17:35  ~小学生~  阅读(339)  评论(0编辑  收藏  举报