install

sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils

create vm

#!/bin/sh
vm_name=$1
vm_img="/var/kvm/vm/${vm_name}.qcow2"
qemu-img create -f qcow2 $vm_img 8G
virt-install \
     --name $vm_name \
     --ram 512 \
     --disk path=$vm_img,format=qcow2 \
     --accelerate \
     --network network=default,model=virtio \
     --cdrom /var/kvm/iso/ubuntu-14.04.3-server-amd64.iso \
     --boot cdrom \
     --vnc 

Kvm虚拟机部署方案

涉及的几个概念:

  • Domain: 虚拟机的一个运行实例,简单的理解,就是一个虚拟机虚拟出来的操作系统。它的叫法可是多种多样:instance,guest OS,virsual machine,其实都指的同一个概念。
  • Hypervisor: 指的就是虚拟机本身,比如qemu, kvm, xen…
  • libvirt 由几个不同的部分组成,其中包括应用程序编程接口 (API) 库、一个守护进程 (libvirtd),以及一个默认命令行实用工具 (virsh),libvirtd守护进程负责对虚拟机的管理工作,在用各种工具对虚拟机进行管理的时候,这个守护进程一定要跑起来,而且这个进程可以分为两种,一种是root权限的libvirtd,一种是普通用户权限的libvirtd,前者权限大,可以虚拟计算机的各种设备。
  • 开启root权限的libvirtd守护进程要以root身份去运行:sudo libvirtd –daemon

NET

client 无法上网,需要添加MASQUERADE和开启网卡数据交换参考


第5行中,已经说明做了地址转换而且有数据包通过。

sudo iptables -nL  -t nat -v

Chain POSTROUTING (policy ACCEPT 10 packets, 936 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 RETURN     all  --  *      *       192.168.122.0/24     224.0.0.0/24        
2        0     0 RETURN     all  --  *      *       192.168.122.0/24     255.255.255.255     
3       20  1200 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
4        0     0 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
5        2   168 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24    
6        0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0        

Centos 中的客户端地址转换命令

注意SNAT发生在POSTROUTING,所以必须要filter表中的forward允许

-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT

MASQUERADE

如果vclient不能连接外网,则需要MASQUERADE

sudo iptables -t nat -I POSTROUTING -o enp11s0f0 -j MASQUERADE

如果要做DNAT,就需要有来有回,

 iptables -t nat -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j SNAT --to-source 192.168.1.14
 iptables -t nat -A PREROUTING -p tcp -d 192.168.1.14 --dport 55389 -j DNAT --to-destination 192.168.122.2:3389

需要内核支持NAT

CONFIG_ARCH_HIBERNATION_POSSIBLE=y 
# CONFIG_HIBERNATION is not set 
CONFIG_NF_NAT=y 
CONFIG_NF_NAT_NEEDED=y 
# CONFIG_NF_NAT_AMANDA is not set 
# CONFIG_NF_NAT_FTP is not set 
# CONFIG_NF_NAT_IRC is not set 
# CONFIG_NF_NAT_SIP is not set 
# CONFIG_NF_NAT_TFTP is not set 
CONFIG_NF_NAT_IPV4=y 
# CONFIG_NF_NAT_PPTP is not set 
# CONFIG_NF_NAT_H323 is not set 
CONFIG_BRIDGE_EBT_T_NAT=y 
CONFIG_BRIDGE_EBT_DNAT=y 
CONFIG_BRIDGE_EBT_SNAT=y 
CONFIG_NET_VENDOR_NATSEMI=y 
# CONFIG_NATSEMI is not set 
# CONFIG_NATIONAL_PHY is not set 
# Native drivers 
CONFIG_CHECK_SIGNATURE=y 

CONFIG_NF_DEFRAG_IPV4=y 
CONFIG_NF_CONNTRACK_IPV4=y 
CONFIG_NF_NAT_IPV4=y