1. 前言
最近在模擬生產環境在做測試,本來准備用 vmware 直接來實現的,本着學以致用的道理,選擇直接在linux 環境使用 kvm 來模擬測試,遇到的第一個問題就是,網絡環境的模擬。這里對比vmware三種網絡模式:橋接、nat、僅主機模式 來做一一對比說明。
2. 網絡環境
2.1 橋接模式
橋接模式的定義:在該模式下,宿主機會虛擬出來一張虛擬網卡作為宿主機本身的通信網卡,而宿主機的物理網卡則成為橋設備(交換機),所以虛擬機相當於在宿主機所在局域網內的一個單獨的主機,他的行為和宿主機是同等地位的,沒有依存關系。
宿主機網段:192.168.118.0/24
(1)配置橋接設備
方法1:
# systemctl start NetworkManager ; systemctl start libvirtd # virsh iface-bridge ens33 br0
其實不建議使用這種方式,因為使用這種方式不太穩定,如果出錯,就無法連接到主機了,慎用!
方法2:
# cd /etc/sysconfig/network-scripts/ # cp -a ifcfg-ens33 ifcfg-br0 修改配置兩個配置文件: ifcfg-ens33: TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=none DEFROUTE=yes IPV4_FAILURE_FATAL=no NAME=ens33 DEVICE=ens33 ONBOOT=yes BRIDGE=br0 ifcfg-br0: TYPE=Bridge PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=none DEFROUTE=yes IPV4_FAILURE_FATAL=no NAME=br0 DEVICE=br0 ONBOOT=yes IPADDR=192.168.118.11 NETMASK=255.255.255.0 GATEWAY=192.168.118.1 DNS1=61.134.1.4 DNS2=61.134.1.5 # systemctl restart network # ifconfig br0 br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.118.11 netmask 255.255.255.0 broadcast 192.168.118.255 inet6 fe80::20c:29ff:fe1d:cfd9 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:1d:cf:d9 txqueuelen 1000 (Ethernet) RX packets 31 bytes 2696 (2.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 7 bytes 586 (586.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 00:0c:29:1d:cf:d9 txqueuelen 1000 (Ethernet) RX packets 259364 bytes 150072812 (143.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 21622 bytes 1734123 (1.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # brctl show bridge name bridge id STP enabled interfaces br0 8000.000c291dcfd9 no ens33
手動修改的方式很簡單,但是一定要注意單詞的拼寫正確無誤。到目前為止,已經為物理機創建了虛擬網橋設備。寫來就是為 KVM 配置橋接網絡。
(2)編寫 橋接 XML 文件
# cd /etc/libvirt/qemu/networks/ # cat br0.xml <network> <name>br0</name> <forward mode='bridge' /> <bridge name='br0' /> </network> 將 br0.xml 導入 virsh管理 # virsh net-define br0.xml # virsh net-start br0 # virsh net-autostart br0
(3)創建虛擬機選擇 br0 網絡測試
橋接網絡配置成功。在橋接中,虛擬機的網絡是直接通過橋接設備對外訪問的,因此不需要 iptables 任何路由轉發:
查看 iptables
# iptables -L -nv Chain INPUT (policy ACCEPT 79143 packets, 69M bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 43622 packets, 110M bytes) pkts bytes target prot opt in out source destination
2.2 nat模型
nat模型定義:
該模式網橋要作為路由器對虛擬機地址進行轉發,NAT模式則是將源地址ip改為物理網卡ip發送給目標地址,目標地址ip回傳給物理網卡,再將報文發送至虛擬主機。
宿主機網絡:192.168.118.0/24
(1)配置橋接設備
(在橋接模式中已經配置過,略過)
(2)編寫nat XML 文件
# vim nat.xml <network> <name>nat</name> <forward dev='br0' mode='nat'> <interface dev='br0'/> </forward> <bridge name='vir-nat' /> <ip address='192.168.100.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.100.2' end='192.168.100.253' /> </dhcp> </ip> </network> # virsh net-define nat.xml # virsh net-start nat # virsh net-autostart nat # virsh net-list Name State Autostart Persistent ---------------------------------------------------------- br0 active yes yes nat active yes yes
在這個 XML 文件中,定義了一個 interface 名為:virt-nat 並配置為 192.168.100.1
# ifconfig vir-nat vir-nat: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255 ether 52:54:00:24:b1:ac txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # brctl show vir-nat bridge name bridge id STP enabled interfaces vir-nat 8000.52540024b1ac yes vir-nat-nic
簡單來說,就是為虛擬機配置了一個網關接口,然后這個網關 192.168.100.1 可以和 宿主機的網絡通信,這里就需要開通 ip_forward
# sysctl -a | egrep ip_forward net.ipv4.ip_forward = 1
再次查看下 iptables 規則:
# iptables -L -nv -t nat
Chain PREROUTING (policy ACCEPT 1056 packets, 184K bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 67 packets, 11740 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- * br0 192.168.100.0/24 224.0.0.0/24
0 0 RETURN all -- * br0 192.168.100.0/24 255.255.255.255
0 0 MASQUERADE tcp -- * br0 192.168.100.0/24 !192.168.100.0/24 masq ports: 1024-65535
0 0 MASQUERADE udp -- * br0 192.168.100.0/24 !192.168.100.0/24 masq ports: 1024-65535
0 0 MASQUERADE all -- * br0 192.168.100.0/24 !192.168.100.0/24
重點關注下 POSTROUTING 中最后三條規則:
當 192.168.100.0/24 網段的主機訪問非本網段的目標時,則轉發到 br0 網卡出去。
這就是nat網絡的實現,說白了nat網絡就是借助了 iptables 規則來實現轉發,iptables 是非常強大的。
(3)創建虛擬機測試nat網絡模式
通過上面的測試 nat 網絡模式能夠訪問外網,完成實現。
2.3 僅主機模式
僅主機模式也叫隔離模式,僅僅在宿主機內部進行通信使用。宿主機、宿主機內的虛擬機網絡相互連通,但是虛擬機無法訪問外部網絡。
(1)編寫 host-only.xml 文件
# cat host-only.xml <network> <name>host-only</name> <bridge name='vir-host' /> <ip address='192.168.200.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.200.2' end='192.168.200.253'/> </dhcp> </ip> </network> # virsh net-define host-only.xml # virsh net-start host-only # virsh net-autostart host-only
在這個XML文件中,創建了一個網橋設備 vir-host 並配置 IP 為: 192.168.200.1 ,對比上面 nat 模式不難發現,host-only 網橋並沒有和 br0 建立聯系。
(2)創建虛擬機並測試
創建兩台虛擬機,測試二者是否可以相互通信且能夠與宿主機通信。
、
僅主機模式網絡配置完成。