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

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

1.bridged(橋接模式)

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

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

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

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

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

用KVM配置Bridge方式:

首先需要確定你的host主機上用的網絡連接方式爲橋接方式,我的機器上的用的是一個叫br0的網橋。創建網橋的方式也很簡單,以我的系統爲例,網卡一個eno16777736,在目

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

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

修改文件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

在虛擬機的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 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
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章