摘要: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這樣的橋接設備
[root@clovemzone ~]# 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也是連接在上面的。
[root@clovemzone ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.0025903afe42 no eth0
我們創建兩個虛擬機之后,所有的虛擬機網卡均連接br0,此時查看br0上面連接的設備
[root@clovemzone ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.0025903afe42 no eth0 vnet0 vnet1
為了讓大家了解的更加透徹,可以通過下圖並結合實際操作進行簡單分析
1、查看物理機網卡設備信息圖1所示
[root@master ~]# 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
[root@master ~]# rpm -q bridge-utils //查看橋接軟件是否安裝 bridge-utils-1.2-9.el6.x86_64 [root@master ~]# brctl show bridge name bridge id STP enabled interfaces
此時無任何橋接設備,我們可以手動添加也可以在 文件中進行添加生效。
(1)、手動添加
[root@master ~]# brctl addbr br0 [root@master ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no [root@master ~]# brctl addif br0 eth0 [root@master ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no eth0
刪除eth0上面的ip地址,將br0上面添加上固定ip地址
[root@master ~]# ip addr del dev eth0 192.168.3.176/24 //刪除eth0上的IP地址 [root@master ~]# ifconfig br0 192.168.3.176/24 up //配置br0的IP地址並啟動設備 [root@master ~]# route add default gw 192.168.3.1 //重新加入默認網關
查看配置是否生效
[root@master ~]# 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 [root@master ~]# 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 [root@master ~]# 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 [root@master ~]# 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
上面是通過命令進行的手動配置方法,但是大家都清楚,這些命令配置的結果在服務器重啟之后就不能生效了,要想使得所有配置永久生效,我們還是需要通過配置文件進行配置,然后重啟網卡設備,讓系統幫我們配置,然后重啟之后也是生效的。
通過上面的手動配置方法,大家可以清楚得看到一個橋接設備的配置流程,這個在你寫到配置文件里面,然后讓系統幫你配置的時候是看不到的 :) ,那么下面我們將所有的配置還原,通過配置文件進行相關自動化配置吧。
還原原始配置
[root@master ~]# route delete default //刪除默認網關 [root@master ~]# 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 [root@master ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.525400a7b756 no eth0 [root@master ~]# brctl delif br0 eth0 //斷開/刪除br0上的eth0設備 [root@master ~]#ifconfig br0 down //讓br0設備停止活動 [root@master ~]#brctl delbr br0 //刪除br0 root@master ~]# brctl show //查看br0是否依然存在 bridge name bridge id STP enabled interfaces [root@master ~]# ifconfig eth0 192.168.3.176/24 //重新給eth0分配IP地址 root@master ~]# route add default gw 192.168.3.1 //重新加入默認網關 1234567891011 [root@master ~]# 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)、通過配置文件配置橋接設備
配置文件請自行備份
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes BRIDGE=br0 [root@master ~]# 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 服務,這個服務挺討厭
[root@master ~]# service NetworkManager stop [root@master ~]#chkconfig NetworkManager off [root@master ~]# service network restart [root@master ~]# 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
查看橋接設備信息
[root@master ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.525400a7b756 no eth0 [root@master ~]# 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上面的網卡連接情況:
[root@master ~]# 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