配置KVM虛擬機的網絡,Bridge和Nat方式

使用libvirt配置KVM虛擬機的網絡,分別使用bridge和nat方式。node

1.bridged(橋接模式)

在bridged模式下,虛擬出來的操做系統就像是局域網中的一臺獨立的主機,它能夠訪問網內任何一臺機器。同時,因爲這個虛擬系統是局域網中的一個獨立的主機系統,那麼就能夠手工配置它的TCP/IP配置信息,以實現經過局域網的網關或路由器訪問互聯網。linux

使用bridged模式的虛擬系統和宿主機器的關係,就像鏈接在同一個Hub上的兩臺電腦。想讓它們相互通信,你就須要爲虛擬系統配置IP地址和子網掩碼,不然就沒法通訊

​(參考dhcp服務器是否開啓,若是開啓,則能夠選擇dhcp方式自動獲取網絡地址)。服務器

這種方式最簡單,直接將虛擬網卡橋接到一個物理網卡上面,和linux下一個網卡綁定兩個不一樣地址相似,其實是將網卡設置爲混雜模式,從而達到偵聽多個IP的能力。網絡

在此種模式下,虛擬機內部的網卡(例如linux下的eth0)直接連到了物理網卡所在的網絡上,能夠想象爲虛擬機和host機處於對等的地位,在網絡關係上是平等的,沒有誰在誰後面的問題。使用這種方式很簡單,前提是你能夠獲得1個以上的地址。dom

用KVM配置Bridge方式:

首先須要肯定你的host主機上用的網絡鏈接方式爲橋接方式,個人機器上的用的是一個叫br0的網橋。建立網橋的方式也很簡單,以個人系統爲例,網卡一個eno16777736,在目tcp

錄/etc/sysconfig/network-scripts/下建立文件ifcfg-br0,而後修改文件ifcfg-eno16777736爲:ide

BOOTPROTO=none
DEVICE=eno16777736
HWADDR=00:0c:29:09:0d:3d
NM_CONTROLLED=no
ONBOOT=yes
BRIDGE=br0 oop

修改文件ifcfg-br0的內容爲:性能

BOOTPROTO=static
DEVICE=br0
TYPE=Bridge
NM_CONTROLLED=no
IPADDR=192.168.7.183
NETMASK=255.255.255.0
GATEWAY=192.168.7.254 ui

在虛擬機的XML配置文件中device下添加interface標籤便可,標籤以下:

<interface type='bridge'>
<mac address='52:54:00:84:e9:e1'/>
<source bridge='br0'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

固然也能夠先定義一下這個網絡,而後在添加到虛擬機的XML文件中,給它起名爲br0.xml,這個文件中能夠寫一些網絡的詳細配置參數,大體的形式以下:

<network>
<name>br0</name>
<uuid>fb48b969-b9f4-e859-d957-50aedd850fb4</uuid>
<forward mode='bridge'>
<bridge name ='br0'/>
</forward>
</network>

而後用libvirt來定義並開啓這個網絡,配置文件中的interface標籤固然仍是不能少,用上面的就好,名字正好一致了:

virsh net-define br0.xml

virsh net-start br0

而後就可已啓動客戶機,檢查網絡鏈接了。

2.NAT(網絡地址轉換模式)

使用NAT模式,就是讓虛擬系統藉助NAT(網絡地址轉換)功能,經過宿主機器所在的網絡來訪問公網。也就是說,使用NAT模式能夠實如今虛擬系統裏訪問互聯網。很顯然,若是你只有一個外網地址,此種方式很合適。

KVM虛擬機Nat方式上網:

virsh net-list

查看當前活躍的網絡,能夠看到一個default網絡,這個就是一個默認的Nat網絡了。

virsh net-dumpxml default

能夠查看該網絡的詳細配置以下:

<network>
<name>default</name>
<uuid>75dbebde-fc15-4350-8a06-f1432f9e6d30</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0' />
<mac address='52:54:00:bc:f2:65'/>
<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>

能夠看到該網絡搭建在一個網橋virbr0上,這個網橋在安裝並啓動libvirt的時候自動生成。而後在客戶機的XML配置文件中添加標籤interface內容以下:

<interface type='network'>
<mac address='52:54:00:c7:18:b5'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

則可讓客戶機用nat方式來上網了,經驗證,客戶機能夠獲取到122網段,2到254之間的一個ip地址。

咱們能夠直接編輯修改default網絡的配置:

virsh net-edit default

也能夠直接將default網絡幹掉,而後再從新定義:

virsh net-undefine default

從新建立一個default.xml文件,自定義其中的內容,能夠指定某個mac地址對應某個ip,指定某個ip段。例以下面的內容,name對應的是客戶機的名字。

<network>
<name>default</name>
<uuid>dc69ff61-6445-4376-b940-8714a3922bf7</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0' />
<mac address='52:54:00:81:14:18'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254' />
<host mac='00:25:90:eb:4b:bb' name='guest1' ip='192.168.5.13' />
<host mac='00:25:90:eb:34:2c' name='guest2' ip='192.168.7.206' />
<host mac='00:25:90:eb:e5:de' name='guest3' ip='192.168.7.207' />
<host mac='00:25:90:eb:7e:11' name='guest4' ip='192.168.7.208' />
<host mac='00:25:90:eb:b2:11' name='guest5' ip='192.168.7.209' />
</dhcp>
</ip>
</network>

而後用命令:

virsh net-define default.xml

virsh net-start default

啓用一個客戶機,檢查網絡時候可用。

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方式並無使用物理網卡。但做爲客戶機,只能選擇其中的一種。

Bridge方式即虛擬網橋的網絡鏈接方式,是客戶機和子網裏面的機器可以互相通訊。可使虛擬機成爲網絡中具備獨立IP的主機。

場景說明:KVM虛擬機以前沒有設置爲Bridge模式,而後就直接建立虛擬機了(當時網卡模式選擇的爲default),後來調整KVM網卡模式爲Bridge後,虛擬機無法正常聯網。

[root@node160 ~]# virsh shudown CentOS-7.3-X86_64

[root@node160 ~]# virsh edit CentOS-7.3-X86_64

將xml配置文件中的:
<interface type=‘network‘>
<mac address=‘52:54:00:e4:7c:77‘/>
<source network=‘default‘/>
<model type=‘virtio‘/>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/>
</interface>

修改成:
<interface type=‘bridge‘>
<mac address=‘52:54:00:e4:7c:77‘/>
<source bridge=‘br0‘/>
<model type=‘virtio‘/>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/>
</interface>

因爲kvm虛擬機使用的是bridge模式,能夠把virbr0接口(即NAT方式裏面的default虛擬網絡)刪除

[root@node160 ~]# ip add list

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
link/ether 00:0c:29:14:2b:9a brd ff:ff:ff:ff:ff:ff
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 52:54:00:9f:ad:48 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:9f:ad:48 brd ff:ff:ff:ff:ff:ff
7: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether 00:0c:29:14:2b:9a brd ff:ff:ff:ff:ff:ff
inet 10.10.10.160/24 brd 10.10.10.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe14:2b9a/64 scope link
valid_lft forever preferred_lft forever
8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 1000
link/ether fe:54:00:71:7b:aa brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe71:7baa/64 scope link
valid_lft forever preferred_lft forever
10: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 1000
link/ether fe:54:00:e4:7c:77 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fee4:7c77/64 scope link
valid_lft forever preferred_lft forever

[root@node160 ~]# virsh net-list --all
Name State Autostart Persistent

default active yes yes

[root@node160 ~]# brctl show

bridge namebridge idSTP enabledinterfaces
br08000.000c29142b9anoeth0
vnet0
vnet1
virbr08000.5254009fad48yesvirbr0-nic

[root@node160 ~]# virsh net-destroy default

Network default destroyed

[root@node160 ~]# virsh net-undefine default

Network default has been undefined

配置完成後,再次查看網卡信息

[root@node160 ~]# ip add list

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000link/ether 00:0c:29:14:2b:9a brd ff:ff:ff:ff:ff:ff7: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000link/ether 00:0c:29:14:2b:9a brd ff:ff:ff:ff:ff:ffinet 10.10.10.160/24 brd 10.10.10.255 scope global br0valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe14:2b9a/64 scope link valid_lft forever preferred_lft forever8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 1000link/ether fe:54:00:71:7b:aa brd ff:ff:ff:ff:ff:ffinet6 fe80::fc54:ff:fe71:7baa/64 scope link valid_lft forever preferred_lft forever10: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 1000link/ether fe:54:00:e4:7c:77 brd ff:ff:ff:ff:ff:ffinet6 fe80::fc54:ff:fee4:7c77/64 scope link valid_lft forever preferred_lft forever

相關文章
相關標籤/搜索