KVM 虚拟化环境中的网络模式
最近学习了KVM,对它的网络模式设置不是很清晰,就找了资料来看,大部分都表述的不是很清晰,下面是根据几篇博客整理的,并且通过实验验证。以前系统学习过Vmware的网络模式,KVM的网络模式多少和它有些相似,还比较容易理解。
KVM 客户机网络连接有三种方式:
-host-only:看网上说也叫隔离模式,个人理解就类似于Vmware的仅主机模式,意思就是将所有的虚拟机组成一个局域网,不能和外界通信,不能访问Internet,其他主机也不能访问虚拟主机,安全性高。
-NAT方式:
- 用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。
-Bridge方式:
- 虚拟网桥(Virtual Bridge):这网络模式下客户机与宿主机处于同一网络环境,类似于一台真实的宿主机,直接访问网络资源,设置好后客户机与互联网,客户机与主机之间的通信都很容易。
--------------------------------------------------------------------------------------------
host-only:
仅(虚拟)主机模式比较简单,拓扑图如下:
桥接网络介绍及配置步骤
Bridge方式,即客户机通过网桥连接到宿主机网络环境中,可以使客户机成为网络中具有独立IP的主机。
注: 客户机,即用KVM安装在linux宿主机中的虚拟机。
桥接网络,也叫物理设备共享,被用作把一个物理设备复制到一台虚拟机。
网桥的基本原理就是创建一个桥接接口,并把物理主机的eth0绑定到网桥上,客户机的网络模式需要配置为桥接模式,这可以在安装的时候用
--
network bridge
=
br0
选项指定,也可在虚拟机xml配置文件中定义。
- 宿主机
1.编辑修改网络设备脚本文件,增加网桥设备br0
vi /etc/sysconfig/network-scripts/ifcfg-br0DEVICE=br0TYPE=BridgeONBOOT=yesNM_CONTROLLED=noBOOTPROTO=staticIPADDR=192.168.8.112NETMASK=255.255.255.0GATEWAY=192.168.8.2DNS1=192.168.8.2DNS2=8.8.8.8
2.编辑修改网络设备脚本文件,修改网卡设备eth0
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0HWADDR=00:0C:29:2B:3F:66TYPE=EthernetUUID=dfd0c3de-5954-4c81-abe6-e7958f31549dONBOOT=yesNM_CONTROLLED=noBOOTPROTO=none#IPADDR=192.168.8.112#NETMASK=255.255.255.0#GATEWAY=192.168.8.2#DNS1=192.168.8.2#DNS2=8.8.8.8BRIDGE=br0 // 将 eth0 绑定到网桥接口 br0 上
3.重启网络服务
service network restart
4.校验桥接接口
[root@web1 ~]# brctl showbridge name bridge id STP enabled interfacesbr0 8000.000c292b3f66 no eth0 vnet0 vnet1virbr0 8000.5254000d29b0 yes virbr0-nic
- 客户机
客户机安装时注意,网络要选择用br0桥接方式。
(1)安装客户机时指定:
virt-install \--name CentOS6.8 \--ram 512 \--disk path=/kvm_data/CentOS6.8.img,size=30 \--vcpus 1 \--os-type linux \--os-variant rhel6 \--network bridge=br0 \ // 桥接网络--graphics none \--console pty,target_type=serial \--location 'http://mirrors.aliyun.com/centos/6/os/x86_64/' \ // 这里使用网络镜像--extra-args 'console=ttyS0,115200n8 serial'
(2)若客户机已经安装好,想修改其网络模式为桥接,则在其xml配置文件中有定义,可以修改:
virsh edit coohx
.......... <interface type='bridge'> <mac address='52:54:00:ad:4c:86'/> <source bridge='br0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> <interface type='bridge'> <mac address='52:54:00:d5:0d:34'/> <source bridge='br0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </interface>..........
这里虚拟机coohx的两个网卡都是桥接网络。
- 登录客户机,配置网卡ip
这里我给虚拟机添加了2块网卡,eth0/1,分别对应宿主机的virnet0/virnet1,虚拟机配置如下:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
// 桥接模式,连接到网桥br0.
DEVICE="eth0"BOOTPROTO="static"BROADCAST="192.168.8.255"DNS1="192.168.8.2"GATEWAY="192.168.8.2" // 网关为宿主机所在局域网的网关HWADDR="52:54:00:AD:4C:86"IPADDR="192.168.8.16" // 与宿主机处于同一局域网IPV6INIT="yes"IPV6_AUTOCONF="yes"NETMASK="255.255.255.0"NM_CONTROLLED="yes"ONBOOT="yes"TYPE="Ethernet"#UUID="a3b35d6a-c4b2-49e2-b35b-999c3bf3243e"
=============================================================================================
NAT网络简介及配置步骤
NAT方式是
kvm安装后的默认方式。它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。
列出linux宿主机当前KVM的所有网络模式:
[root@web1 ~]# virsh net-list --all名称 状态 自动开始 Persistent--------------------------------------------------default 活动 yes yes
default网络(virbr0上)是宿主机安装kvm虚拟机自动安装的。
查看网络接口:
[root@web1 ~]# ifconfig -a |grep -A5 vir*virbr0 Link encap:Ethernet HWaddr 52:54:00:0D:29:B0 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0--virbr0-nic Link encap:Ethernet HWaddr 52:54:00:0D:29:B0 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
virbr0是由宿主机KVM相关模块安装的一个虚拟网络接口(TAP设备),也是一个switch和bridge,负责把内容分发到各虚拟机。
拓扑图如下:
virbr0是一个桥接器,给虚拟机群虚拟了一个局域网,这个局域网的网络号默认为 192.168.122.0,可在宿主机上查看:
[root@web1 ~]# brctl showbridge name bridge id STP enabled interfacesbr0 8000.000c292b3f66 no eth0virbr0 8000.5254000d29b0 yes virbr0-nic
[root@web1 ~]# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0 192.168.8.0 0.0.0.0 255.255.255.0 U 0 0 0 br0169.254.0.0 0.0.0.0 255.255.0.0 U 1040 0 0 br00.0.0.0 192.168.8.2 0.0.0.0 UG 0 0 0 br0
virbr0是kvm虚拟机NAT网络模式的重要角色,相当于Wmware中NAT网络模式中的虚拟NAT服务器。
同时kvm 安装时默认 NAT 网络模式,他会修改宿主机的 iptables 规则,来实现 NAT网络模式的功能:
其中filter表项如下:
[root@web1 ~]# iptables -nvLChain INPUT (policy ACCEPT 138K packets, 20M bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 //由libvirt脚本自动写入 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 //由libvirt脚本自动写入 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 //由libvirt脚本自动写入 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 //由libvirt脚本自动写入Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 state RELATED,ESTABLISHED //由libvirt脚本自动写入 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 //由libvirt脚本自动写入 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 //由libvirt脚本自动写入 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachableChain OUTPUT (policy ACCEPT 221K packets, 18M bytes) pkts bytes target prot opt in out source destination
INPUT链接收所有的 tcp/udp包,开放端口53和67,查看系统服务监听状态,这两个端口是dnsmasq服务的端口号:
[root@web1 ~]# netstat -lanp |grep -E '53|67'tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2178/dnsmasqtcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1555/namedtcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 1555/namedtcp 0 0 ::1:53 :::* LISTEN 1555/namedtcp 0 0 ::1:953 :::* LISTEN 1555/namedudp 0 0 192.168.122.1:53 0.0.0.0:* 2178/dnsmasqudp 0 0 127.0.0.1:53 0.0.0.0:* 1555/namedudp 0 0 0.0.0.0:67 0.0.0.0:* 2178/dnsmasqudp 0 0 ::1:53 :::* 1555/named
这里kvm需要用到dnsmasq服务,二者详细关系,后面再总结。
再看NAT表项的规则:
[root@web1 ~]# iptables -nvL -t nat --line-numbersChain PREROUTING (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out source destinationChain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out source destination1 0 0 MASQUERADE tcp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-655352 0 0 MASQUERADE udp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-655353 0 0 MASQUERADE all -- * * 192.168.122.0/24 !192.168.122.0/244 0 0 MASQUERADE all -- * * 192.168.122.0/24 0.0.0.0/0Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)num pkts bytes target prot opt in out source destination
转发所有来自virbr0上的数据包,将他们的ip转化为外网IP,实现访问internet。
-NAT网络配置步骤
- 宿主机上:
从xml文件定一个NAT网络,会被加载到虚拟机配置文件.
配置NAT网络相关的网络配置文件:/usr/share/libvirt/networks/default.xml的内容,这里选择默认
[root@web1 ~]# vim /usr/share/libvirt/networks/default.xml<network> <name>default</name> // 网络名 <bridge name="virbr0" /> <forward/> <ip address="192.168.122.1" netmask="255.255.255.0"> <dhcp> <range start="192.168.122.2" end="192.168.122.254" /> </dhcp> </ip></network>
标记为自动启动:
[root@web1 ~]# virsh net-autostart default网络default标记为自动启动
启动网络
[root@web1 ~]# virsh net-start default
查看网络:default已经启动,配置文件/usr/share/libvirt/networks/default.xml
[root@web1 ~]# virsh net-list名称 状态 自动开始 Persistent--------------------------------------------------default 活动 yes yes
- 客户机上的配置:
[root@web1 ~]# virsh edit coohx
<interface type='bridge'> <mac address='52:54:00:ad:4c:86'/> <source bridge='br0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> <interface type='network'> <mac address='52:54:00:d5:0d:34'/> // 这张网卡对应宿主机的vnet1 <source network='default'/> //加载NAT网络配置 <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </interface>
启动虚拟机,查看网桥与网卡绑定信息:
[root@web1 ~]# brctl showbridge name bridge id STP enabled interfacesbr0 8000.000c292b3f66 no eth0 vnet0virbr0 8000.5254000d29b0 yes virbr0-nic vnet1
vnet1网卡绑定到了 virbr0上面,也就是虚拟机的eth1网卡为NAT网络模式。
- 登录客户机,配置网卡eth1的ip
vi /etc/sysconfig/network-scripts/ifcfg-eth1 // NAT网络模式,连接到网桥 virbr0 ,由它转发(iptables 规则实现)
DEVICE="eth1"BOOTPROTO="static"BROADCAST="192.168.122.255"DNS1="192.168.122.1"GATEWAY="192.168.122.1" // 网关为 virbr0HWADDR="52:54:00:d5:0d:34"IPADDR="192.168.122.112"IPV6INIT="yes"IPV6_AUTOCONF="yes"NETMASK="255.255.255.0"NM_CONTROLLED="no"ONBOOT="yes"TYPE="Ethernet"#UUID="a3b35d6a-c4b2-49e2-b35b-999c3bf3243e"
- 验证:
[root@KVM-2 ~]# traceroute www.baidu.comtraceroute to www.baidu.com (61.135.169.125), 30 hops max, 60 byte packets 1 bogon (192.168.122.1) 4.666 ms 4.330 ms 4.315 ms // 数据包先到 virbr0上,再由iptables 规则转发 2 * * * 3 * * * 4 * * * 5 * * * 6 * * * 7 *[root@KVM-2 ~]# ping www.baidu.com PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.64 bytes from 61.135.169.121: icmp_seq=1 ttl=127 time=22.7 ms64 bytes from 61.135.169.121: icmp_seq=2 ttl=127 time=24.0 ms--- www.a.shifen.com ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1121msrtt min/avg/max/mdev = 22.774/23.414/24.054/0.640 ms
总结:
配置了kvm的网络环境,感觉和 Vmware 的网络模式差不多,Vmware有三种网络模式:桥接、Host-only、NAT,配置比较方便。 这里的virbr0结合iptables规则以后实现的nat功能和Vmware中NAT网络模式中虚拟NAT服务器所实现的功能一样,只不过需要手动配置,比较麻烦。
参考:
http://www.linuxidc.com/Linux/2016-05/131830.htm
http://blog.csdn.net/samlei/article/details/7598700
http://blog.csdn.net/samlei/article/details/7598700
转载请注明原文地址: https://ju.6miu.com/read-1297201.html