3、KVM的虚拟机网络配置
3、KVM的虚拟机网络配置
刘付kin 发表于1年前
3、KVM的虚拟机网络配置
  • 发表于 1年前
  • 阅读 137
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

#问题: 在KVM中创建的虚拟机如何访问外网和被外网访问呢?

#有三种方式:bridge、NAT、host-only(什么都不配,使用回环网卡)

他们都需要:bridge-utils 和 tunctl 的支持。

  • 1、brctl是Linux下用来管理以太网桥,在内核中建立、维护、检查网桥配置的命令

  • 2、tunctl是用来指定tap还是tun模式的。

    在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。

    TAP等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。

一:使用最基础的qemu-kvm绑定的方式,创建桥接模式(bridge)

架构图如下:

输入图片说明

  • 1、要安装bridge-utils tunctl

      yum install bridge-utils tunctl
    
  • 2、添加一个br0网桥(桥接类型)

      brctl addbr br0
      ifconfig br0 up
    
  • ##hypervisor的etho也需要绑定到bridge上。

  • 3、一步执行完成(注意修改成自己的IP)

    brctl addif br0 eth0 && brctl stp br0 on && ifconfig eth0 0.0.0.0 && ifconfig br0 192.168.33.250 netmask 255.255.255.0 && route add default gw 192.168.33.1

  • 4、创建TAP类型虚拟网卡设备,用于绑定虚拟机的网卡绑定

      tunctl -b -t vnet0
      ifconfig vnet0 up
      brctl addif br0 vnet0
      brctl show
    
  • 5、创建虚拟机并关联网卡(指定vnet0就知道要绑定到那个bridge了)

    /usr/libexec/qemu-kvm -m 4096 -smp 1 -boot order=cd -hda /cloud/Centos.img -net nic -net tap,ifname=vnet0,script=no,downscript=no

  • 6、创建虚拟机并关联网卡并添加mac地址

    /usr/libexec/qemu-kvm -m 2048 -smp 1 -boot order=cd -hda /cloud/Centos.img -net nic,macaddr=52:54:00:12:34:57 -net tap,ifname=vnet0,script=no,downscript=no

二:使用libvirt创建bridge和NAT两种方式(很通用,把信息写在xml文件中,可重用)

libvirt是一套免费、开源的支持Linux下主流虚拟化工具的C函数库,其旨在为包括Xen在内的各种虚拟化工具提供一套方便、可靠的编程接口,支持与C,C++,Ruby,Python,JAVA等多种主流开发语言的绑定。当前主流Linux平台上默认的虚拟化管理工具virt-manager(图形化),virt-install(命令行模式)等均基于libvirt开发而成。

Libvirt库是一种实现 Linux 虚拟化功能的 Linux API,它支持各种虚拟机监控程序,包括 Xen 和 KVM,以及 QEMU 和用于其他操作系统的一些虚拟产品

libvirtd进程启动的时候,会创建一个用于NAT的虚拟网桥virtbr0。如果需要使用bridge的话,那么需要借助brctl创建br0,绑定hypervisor的eth0网卡到这个br0上,这样它上面的虚拟机才能够利用hypervisor的eth0访问外网。

NAT和bridge组合的架构图如下:

输入图片说明

  • 1、安装libvirt

      yum install libvirt
    
  • 2、启动libvirt

      service libvirtd start
    
  • 3、启动后会多一个virbr0网桥,该网桥是NAT类型

输入图片说明

  • 4、如果需要虚拟机中还有一个网卡用于桥接,被外部网络使用,那么需要再创建一个网桥br0,用于hypervisor的eth0端口桥接

      virsh iface-bridge eth0 br0
    
      其实它就是利用了brctl的功能,实现创建网桥,并且把eth0绑定在上面而已,也可以使用brctl
    
      brctl addif br0 eth0 && brctl stp br0 on && ifconfig eth0 0.0.0.0 && ifconfig br0 192.168.33.250 netmask 255.255.255.0 && route add default gw 192.168.33.1
    
  • 5、有了这两个网桥之后,我们就可以创建一个xml文件,把虚拟机的信息写在里面,然后使用libvirt的virsh命令创建虚拟机、删除虚拟机、克隆虚拟机等等,可见笔记 ====> 1、kvm虚拟机介绍和使用(命令行版)

    配置文件如下:centos-base.xml(可以放在任何地方)

      <domain type="kvm">
      	<!--虚拟机名称-->
      	<name>centos-twocar</name>
      	<!--最大内存,单位mb-->
      	<memory unit="MiB">4096</memory>
      	<!--可用内存,单位k-->
      	<currentMemory unit="MiB">2048</currentMemory>
      	<!--虚拟cpu个数-->
      	<vcpu>2</vcpu> 
    
      	<os>
      		<type arch="x86_64">hvm</type>
      		<!-- 硬盘启动 -->
      		<boot dev="hd" />
      		<!--光盘启动-->
      		<boot dev="cdrom" />
      	</os>
    
      	<features>
      		<acpi />
      		<apic />
      		<pae />
      	</features>
    
      	<clock offset="localtime" />
      	<on_poweroff>destroy</on_poweroff>
      	<on_reboot>restart</on_reboot>
      	<on_crash>destroy</on_crash>
    
      	<devices>
      		<!--指定基于那个虚拟化平台,也可以指定为xen-->
      		<emulator>/usr/libexec/qemu-kvm</emulator>
    
      		<disk type="file" device="disk">
      			<driver name="qemu" type="qcow2" />
      			<!--目的镜像>路径,设置为本虚拟化I/O-->
      			<source file="/kvmhypervisor/centos-twocar.qcow2" /> 
      			<target dev="vda" bus="virtio" />
      		</disk>
    
      		<disk type="file" device="cdrom">
      			<!--光盘镜像路径 -->
      			<source file="/kvmhypervisor/CentOS-6.7-x86_64-bin-DVD1.iso" />
      			<target dev="hdb" bus="ide" />
      		</disk>
    
      		<!--配置第一个网卡,指定他的网络为:NAT(virbr0是libvirtd进程提供的NAT网桥)-->
      		<interface type="bridge">
      			<mac address='06:64:12:00:00:52'/>	
      			<!--当前主机网桥的名称-->
      			<source bridge="virbr0" />
      			<model type='virtio'/>
      		</interface>
    
      		<!--配置第二个网卡,指定他的网络为:bridge(br0是利用brctl命令创建的)-->
      		<interface type="bridge">
      			<!--mac地址不能一样-->
      			<mac address='06:64:12:00:00:53'/>	
      			<!--当前主机网桥的名称-->
      			<source bridge="br0" />
      			<model type='virtio'/>
      		</interface>
    
      		<input type="mouse" bus="ps2" />
      		<!--vnc端口号自动分配,可以通过virsh vncdisplay来查询-->
      		<graphics type="vnc" port="5901" autoport="no" listen="0.0.0.0" keymap="en-us" passwd='abcd'/>
      	</devices>
      </domain>
    

-6、 上面配置中,重点理解那个网络接口配置<interface>

- 1、mac地址在“同一网段”不能够重复
- 2、明确虚拟机需要几个网卡,每个网卡它是属于什么网络模式:bridge还是NAT
- 3、记住网卡配置的顺序,因为在安装操作系统的时候,第一个<interface>对应着eth0,第二个<interface>对应着eth1,以此类推。

#思考:为什么只需要在配置文件中指定网卡绑定在那个网桥上就行了?

  • 1、因为virsh利用了brctl和tunctl的功能,所以只要告诉它,这个端口绑定在哪个桥上,他就会自动创建vnet0、vnet1等虚拟设备,然后再绑定到网桥上。也就是对vrctl和tunctl结合封装。

  • 2、其实它是通过改变vi /etc/sysconfig/network-scripts/ifcfg-eth0

  • 3、同时创建了一个网桥vi /etc/sysconfig/network-scripts/ifcfg-br0

#virsh命令的网络操作部分

  • 1、查看系统中已经有ip地址的端口

      iface-list
    
  • 2、查看系统中,可用的网段

      net-list
    
  • 3、创建一个网桥br0,同时创建一个虚拟网卡vnet0,并且将eth0绑定到br0的vnet0上。

      iface-bridge eth0 br0 //只要这一句,就把上面的工作做完了,很方便
    
      它其实在/etc/sysconfig/network-scripts下
      对ifcfg-eth0文件进行了修改
      同时创建了ifcfg-br0文件
    
  • 4、删除一个网桥br0 (他会绑定在他上面的端口,剥离出来,同时把ip还给他们,好智能)

      iface-unbridge br0
    
      它其实在/etc/sysconfig/network-scripts下
      删除ifcfg-br0文件
      同时把ip信息给回eth0
    
  • 5、删除一个网段

      net-destroy default
    

#总结:

  • 虚拟机的网络有多种方式:bridge、NAT、host-only(什么都不配,只是用回环网卡)

  • 配置的方法有多种,常用的有:

    • 1、直接使用qemu-kvm和brctl结合的方式

    • 2、使用libvirtd进程提供的virbr0可以创建NAT

    • 使用libvirtd和brctl结合可以创建bridge

  • 其中用的最多的是第二种方式,方便简单快捷,只需要你知道配置文件怎么弄即可,也就是重点在那个<interface>中。

  • 如果只是创建NAT,是的机器能够上网,什么都不用配置,只需要在<interface>中指定网桥为virbr0即可。

  • 如果想要机器能够使用secureCRT来连接,那么就需要使用桥接的方式为虚拟机加一个网卡,使得虚拟机的IP地址和hypervisor在同一个网段,或者利用hypervisor的eth0别名,给这个别名指定一个ip地址,然后利用iptables的映射方式。

    • 在虚拟机上配置一个网卡

      • 创建一个br0的网桥,同时把eth0绑定在上面
      • 在<interface>中指定网桥为br0即可
    • 使用hypervisor的eth0别名ip加上iptables映射实现

      • ifconfig eth0:1 192.168.33.101/24

      • 设置宿主机iptables允许tcp8022端口通过

        iptables -I INPUT -p tcp --dport 8022 -j ACCEPT

      • 设置nat表的PREROUTING链,将访问192.168.50.150 tcp 8022端口的数据转发到10.0.0.11的22号端口

        iptables -t nat -A PREROUTING -d 192.168.52.201 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 10.0.0.11:22

      • 要实现SNAT功能,必须让filter表的FORWARD链允许转发

        iptables -t filter -I FORWARD -p all -s 10.0.0.0/24 -j ACCEPT

        iptables -t filter -I FORWARD -p all -d 10.0.0.0/24 -j ACCEPT

如何开启hypervisor的网络转发功能?

vi /etc/sysctl.conf

修改里面的一个参数
net.ipv4.ip_forward = 1

libvirt的工作目录为:/var/lib/libvirt/

标签: KVM
共有 人打赏支持
粉丝 7
博文 100
码字总数 72832
×
刘付kin
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: