摘要:KVM虚拟机网络配置的两种方式:NAT方式和Bridge方式。Bridge方式的配置原理和步骤。Bridge方式适用于服务器主机的虚拟化。NAT方式适用于桌面主机的虚拟化。
NAT的网络结构图:
Bridge的网络结构见图:
一、Bridge方式
问题
客户机安装完成后,需要为其设置网络接口,以便和主机网络,客户机之间的网络通信。事实上,如果要在安装时使用网络通信,需要提前设置客户机的网络连接。
KVM客户机网络连接有两种方式:
- 用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。NAT方式。
- 虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。Bridge方式。
本文主要解释Bridge方式的配置。
Bridge方式原理
Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。
桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。
如上图,网桥的基本原理就是创建一个桥接接口br0,在物理网卡和虚拟网络接口之间传递数据。
Bridge方式的适用范围
服务器主机虚拟化。
网桥方式配置步骤
1、编辑修改网络设备脚本文件,增加网桥设备br0
vi /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE="br0" ONBOOT="yes" TYPE="Bridge" BOOTPROTO=static IPADDR=10.0.112.39 NETMASK=255.255.255.0 GATEWAY=10.0.112.1 DEFROUTE=yes
上述配置将虚拟网卡配置在了10.0.112.* 网段。如果不需要静态地址,可以把配置地址的相关项屏蔽。如:
DEVICE="br0" ONBOOT="yes" TYPE="Bridge" BOOTPROTO=dhcp
2、编辑修改网络设备脚本文件,修改网卡设备eth0
DEVICE="eth0" NM_CONTROLLED="no" ONBOOT="yes" TYPE=Ethernet BOOTPROTO=none BRIDGE="br0" NAME="System eth0" HWADDR=44:37:E6:4A:62:AD
NM_CONTROLLED这个属性值,根据RedHat公司的文档是必须设置为“no”的(这个值为“yes”表示可以由服务NetworkManager来管理。NetworkManager服务不支持桥接,所以要设置为“no”。),但实际上发现设置为“yes”没有问题。通讯正常。
3、重启网络服务
service network restart
4、校验桥接接口
#brctl show bridge name bridge id STP enabled interfaces br0 8000.4437e64a62ad no eth0
客户机配置
客户机安装时注意,网络要选择用br0桥接方式。
图形化的方式:
文本方式:
编辑修改虚拟机配置文件/etc/libvirt/qemu/v1.xml,增加如下内容
<interface type=‘bridge‘> <mac address=‘52:54:00:da:c3:dc‘/> <source bridge=‘br0‘/> <model type=‘virtio‘/> <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/> </interface>
虚拟机启动后,验证网络接口是否正常:
# brctl show bridge name bridge id STP enabled interfaces br0 8000.4437e64a62ad no eth0 vnet0
NAT方式的影响
网桥方式的配置与虚拟机支持模块安装时预置的虚拟网络桥接接口virbr0没有任何关系,配置网桥方式时,可以把virbr0接口(即NAT方式里面的default虚拟网络)删除。
virsh net-destroy default virsh net-undefine default service libvirtd restart
二、NAT方式
问题
客户机安装完成后,需要为其设置网络接口,以便和主机网络,客户机之间的网络通信。事实上,如果要在安装时使用网络通信,需要提前设置客户机的网络连接。
KVM 客户机网络连接有两种方式:
- 用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。NAT方式。
- 虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。Bridge方式。
本文主要解释NAT方式的配置。
NAT方式原理
NAT方式是KVM安装后的默认方式。它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。
检查当前的网络设置:
#virsh net-list --all Name State Autostart ----------------------------------------- default active yes
default是宿主机安装虚拟机支持模块的时候自动安装的。
检查当前的网络接口:
#ifconfig eth0 Link encap:Ethernet HWaddr 44:37:E6:4A:62:AD inet6 addr: fe80::4637:e6ff:fe4a:62ad/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:987782 errors:0 dropped:0 overruns:0 frame:0 TX packets:84155 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:109919111 (104.8 MiB) TX bytes:12695454 (12.1 MiB) Interrupt:17 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:4 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:240 (240.0 b) TX bytes:240 (240.0 b) virbr0 Link encap:Ethernet HWaddr 52:54:00:B9:B0:96 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:2126 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:100387 (98.0 KiB) virbr0-nic Link encap:Ethernet HWaddr 52:54:00:B9:B0:96 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是由宿主机虚拟机支持模块安装时产生的虚拟网络接口,也是一个switch和bridge,负责把内容分发到各虚拟机。
几个虚拟机管理模块产生的接口关系如下图:
从图上可以看出,虚拟接口和物理接口之间没有连接关系,所以虚拟机只能在通过虚拟的网络访问外部世界,无法从网络上定位和访问虚拟主机。
virbr0是一个桥接器,接收所有到网络192.168.122.*的内容。从下面命令可以验证:
# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.525400b9b096 yes virbr0-nic # route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0
同时,虚拟机支持模块会修改iptables规则,通过命令可以查看:
# iptables -t nat -L -nv Chain PREROUTING (policy ACCEPT 16924 packets, 2759K bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 2009 packets, 125K bytes) pkts bytes target prot opt in out source destination 421 31847 MASQUERADE all -- * * 192.168.122.0/24 !192.168.122.0/24 ----------->这条是关键,它配置了NAT功能。 Chain OUTPUT (policy ACCEPT 2011 packets, 125K bytes) pkts bytes target prot opt in out source destination # iptables -t filter -L -nv Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 1 74 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脚本自动写入 3 984 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脚本自动写入 178K 195M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ---->iptables的系统预设 2 168 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 ---->iptables的系统预设 1148 216K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 ---->iptables的系统预设 1 60 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 ---->iptables的系统预设 16564 2721K REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited ---->iptables的系统预设 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 3726 3485K ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 state RELATED,ESTABLISHED ---->由libvirt脚本自动写入 3491 399K 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 ---->由libvirt脚本自动写入 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable ---->由libvirt脚本自动写入 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited ---->iptables的系统预设 Chain OUTPUT (policy ACCEPT 181K packets, 138M bytes) pkts bytes target prot opt in out source destination
如果没有default的话,或者需要扩展自己的虚拟网络,可以使用命令重新安装NAT。
NAT方式的适用范围
桌面主机虚拟化。
创建步骤
virsh net-define /usr/share/libvirt/networks/default.xml
此命令定义一个虚拟网络,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>
也可以修改xml,创建自己的虚拟网络。
标记为自动启动:
#virsh net-autostart default
Network default marked as autostarted
启动网络:
#virsh net-start default
Network default started
网络启动后可以用命令brctl show查看和验证。
修改/etc/sysctl.conf中参数,允许ip转发:
net.ipv4.ip_forward=1
客户机安装
客户机安装时注意,网络要选择用NAT方式。
图形化的方式:
文本方式:
编辑修改虚拟机配置文件/etc/libvirt/qemu/v1.xml,增加如下内容
<interface type=‘network‘> <mac address=‘52:54:00:4f:1b:07‘/> <source network=‘default‘/> <model type=‘virtio‘/> <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/> </interface>
虚拟机启动后,验证网络接口是否正常:
# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.525400b9b096 yes virbr0-nic vnet0
Bridge方式的影响
Bridge方式配置出来的接口对NAT方式没有影响,因为NAT方式并没有使用物理网卡。但作为客户机,只能选择其中的一种。三、桥接补充
如果我们搭建的环境是必须使用虚拟化的,或者说虚拟化是我们搭建这套环境的主要目的之一,那么我们在进行系统安装的时候将所有的虚拟化组件全部安装上,避免后期出现安装不全或者某些服务依赖关系没有解决好,这样排错的时间远远高于安装时候多装几个包的时间。
在我们安装好虚拟化组件(RHEL6.0之后,系统自带的均是KVM,已经没有XEN虚拟化的支持了),会自动生成一个virbr0这样的桥接设备
[[email protected] ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254007543ce yes virbr0-nic
virbr0默认使用的是NAT方式跟虚拟机网卡进行通讯,在实际生产环境中我们多数情况下面使用桥接Bridge的方式进行物理机跟虚拟机的通讯,删除这个virbr0的方法在上面已经说明,这篇文章主要讲述Bridge的简单实现原理以及实际配置方法。
假设我们的物理机上有一块有线网卡,在系统中显示为eth0,我们搭建将其配置成桥接设备br0
我们经常所说的Bridge设备其实就是网桥设备,也就相当于现在的二层交换机,用于连接同一网段内的所有机器,所以我们的目的就是将网络设备eth0配置成br0,此时br0就成为了所谓的交换机设备,我们物理机的eth0也是连接在上面的。
[[email protected] ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.0025903afe42 no eth0
我们创建两个虚拟机之后,所有的虚拟机网卡均连接br0,此时查看br0上面连接的设备
[[email protected] ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.0025903afe42 no eth0 vnet0 vnet1
为了让大家了解的更加透彻,可以通过下图并结合实际操作进行简单分析
1、查看物理机网卡设备信息图1所示
[[email protected] ~]# ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:a7:b7:56 brd ff:ff:ff:ff:ff:ff inet 192.168.3.176/24 brd 192.168.3.255 scope global eth0 inet6 fe80::5054:ff:fea7:b756/64 scope link valid_lft forever preferred_lft forever
2、配置桥接设备br0
[[email protected] ~]# rpm -q bridge-utils //查看桥接软件是否安装 bridge-utils-1.2-9.el6.x86_64 [[email protected] ~]# brctl show bridge name bridge id STP enabled interfaces
此时无任何桥接设备,我们可以手动添加也可以在 文件中进行添加生效。
(1)、手动添加
[[email protected] ~]# brctl addbr br0 [[email protected] ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no [[email protected] ~]# brctl addif br0 eth0 [[email protected] ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no eth0
删除eth0上面的ip地址,将br0上面添加上固定ip地址
[[email protected] ~]# ip addr del dev eth0 192.168.3.176/24 //删除eth0上的IP地址 [[email protected] ~]# ifconfig br0 192.168.3.176/24 up //配置br0的IP地址并启动设备 [[email protected] ~]# route add default gw 192.168.3.1 //重新加入默认网关
查看配置是否生效
[[email protected] ~]# route //查看默认网关 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.3.0 * 255.255.255.0 U 0 0 0 br0 default 192.168.3.1 0.0.0.0 UG 0 0 0 br0 [[email protected] ~]# ip addr show //查看eth0跟br0的IP信息 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:a7:b7:56 brd ff:ff:ff:ff:ff:ff inet6 fe80::5054:ff:fea7:b756/64 scope link valid_lft forever preferred_lft forever 3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN link/ether 52:54:00:a7:b7:56 brd ff:ff:ff:ff:ff:ff inet 192.168.3.176/24 brd 192.168.3.255 scope global br0 inet6 fe80::5054:ff:fea7:b756/64 scope link valid_lft forever preferred_lft forever [[email protected] ~]# ping 192.168.3.1 -w2 //测试同一网段连接是否成功,判断网卡IP是否绑定正确 PING 192.168.3.1 (192.168.3.1) 56(84) bytes of data. 64 bytes from 192.168.3.1: icmp_seq=1 ttl=255 time=3.45 ms 64 bytes from 192.168.3.1: icmp_seq=2 ttl=255 time=4.20 ms --- 192.168.3.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 3.457/3.832/4.208/0.380 ms [[email protected] ~]# ping 192.168.1.1 -w2 //测试不同网段连接是否成功,判断网关是否添加成功 PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data. 64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=2.38 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=7.64 ms --- 192.168.1.1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 2.381/5.011/7.642/2.631 ms
上面是通过命令进行的手动配置方法,但是大家都清楚,这些命令配置的结果在服务器重启之后就不能生效了,要想使得所有配置永久生效,我们还是需要通过配置文件进行配置,然后重启网卡设备,让系统帮我们配置,然后重启之后也是生效的。
通过上面的手动配置方法,大家可以清楚得看到一个桥接设备的配置流程,这个在你写到配置文件里面,然后让系统帮你配置的时候是看不到的 :) ,那么下面我们将所有的配置还原,通过配置文件进行相关自动化配置吧。
还原原始配置
[[email protected] ~]# route delete default //删除默认网关 [[email protected] ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 br0 [[email protected] ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.525400a7b756 no eth0 [[email protected] ~]# brctl delif br0 eth0 //断开/删除br0上的eth0设备 [[email protected] ~]#ifconfig br0 down //让br0设备停止活动 [[email protected] ~]#brctl delbr br0 //删除br0 [email protected] ~]# brctl show //查看br0是否依然存在 bridge name bridge id STP enabled interfaces [[email protected]ter ~]# ifconfig eth0 192.168.3.176/24 //重新给eth0分配IP地址 [email protected] ~]# route add default gw 192.168.3.1 //重新加入默认网关 1234567891011 [[email protected] ~]# ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:a7:b7:56 brd ff:ff:ff:ff:ff:ff inet 192.168.3.176/24 brd 192.168.3.255 scope global eth0 inet6 fe80::5054:ff:fea7:b756/64 scope link valid_lft forever preferred_lft forever
(2)、通过配置文件配置桥接设备
配置文件请自行备份
[[email protected] ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BRIDGE=br0 [[email protected] ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 TYPE=Bridge ONBOOT=yes BOOTPROTO=static IPADDR=192.168.3.176 NETMASK=255.255.255.0 GATEWAY=192.168.3.1
参数详解:
ifcfg-eth0
Device 指定网卡设备名
TYPE 指定网卡的类型为以太网卡
ONBOOT 指定网卡是否开机启动,切记要设置为yes
BRIDGE 指定桥接设备,此处指定为br0设备
建议:以上变量(非变量值)均为大写。
ifcfg-br0
Device 指定网卡设备名
TYPE 指定网卡的类型为桥接
ONBOOT 指定网卡是否开机启动,切记要设置为yes
BOOTPROTO 指定网卡启动如何获取IP地址,设置静态
IPADDR 设置br0绑定的IP地址
NETMASK 设置子网掩码地址
GATEWAY 设置网关
建议: TYPE变量的变量值按照第一个字母大写,其余字母小写的原则,如Ethernet,Bridge
配置完成之后,重启网络服务
如担心干扰,建议停止NetworkManager 服务,这个服务挺讨厌
[[email protected] ~]# service NetworkManager stop [[email protected] ~]#chkconfig NetworkManager off [[email protected] ~]# service network restart [[email protected] ~]# ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:a7:b7:56 brd ff:ff:ff:ff:ff:ff 4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN link/ether 52:54:00:a7:b7:56 brd ff:ff:ff:ff:ff:ff inet 192.168.3.176/24 brd 192.168.3.255 scope global br0 inet6 fe80::5054:ff:fea7:b756/64 scope link valid_lft forever preferred_lft forever
查看桥接设备信息
[[email protected] ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.525400a7b756 no eth0 [[email protected] ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.3.0 * 255.255.255.0 U 0 0 0 br0 link-local * 255.255.0.0 U 1004 0 0 br0 default 192.168.3.1 0.0.0.0 UG 0 0 0 br0
由此,桥接设备br0已经配置成功,当创建虚拟机的时候选择虚拟网卡接口的时候选择br0即可
开始安装虚拟机,此时查看桥接设备br0上面的网卡连接情况:
[[email protected] ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.0025903afe42 no eth0 vnet0
参考:
http://blog.csdn.net/hzhsan/article/details/44098537(以上内容转自此篇文章)
http://blog.csdn.net/hzhsan/article/details/44653403(以上内容转自此篇文章)
http://smilejay.com/2012/08/kvm-bridge-networking/
http://www.linuxidc.com/Linux/2012-12/76883.htm