1. 隔離模式(相似vmare中僅主機模式):虛擬機之間組建網絡,該模式沒法與宿主機通訊,沒法與其餘網絡通訊,至關於虛擬機只是鏈接到一臺交換機上,全部的虛擬機可以相互通訊。
2. 路由模式:至關於虛擬機鏈接到一臺路由器上,由路由器(物理網卡),統一轉發,可是不會改變源地址。
3. NAT模式(相似vmare中的NAT模式):在路由模式中,會出現虛擬機能夠訪問其餘主機,可是其餘主機的報文沒法到達虛擬機,而NAT模式則將源地址轉換爲路由器(物理網卡)地址,這樣其餘主機也知道報文來自那個主機,在docker環境中常常被使用。
4. 橋接模式(相似vmare中的bridge橋接模式):在宿主機中建立一張虛擬網卡做爲宿主機的網卡,而物理網卡則做爲交換機。docker
一. 隔離模式:centos
Guest1 和 Guest2 均是虛擬機緩存
Linux在虛擬機中的網卡都包含"前半段"和"後半段"(其實是一對設備),前半段在虛擬機上,後半段在宿主機上。上圖eth0在Guest1虛擬機上的網卡,對應的後半段爲vnet0,在Guest1上全部發往eth0的數據就直接發往vnet0了,也能夠將vnet0看做一張網卡
Guest1和Guest2如何通訊:
在宿主機中建立一個虛擬交換機(即網橋,也稱軟橋),讓vnet0和vnet1分別爲虛擬交換機(網橋)的一個接口,交換機也能夠叫作bridge,只要兩個虛擬網卡的前半段ip(eth0)地址在同一個網段內(兩個虛擬機後半段的兩個虛擬網卡vnet0和vnet1均綁定在同一個網橋上),就能夠相互通訊,這就是隔離模式。bash
1.1 使用qemu-kvm建立隔離模式網絡的虛擬機網絡
虛擬機啓動時,網卡的後半段不會自動添加到虛擬網橋,須要一個腳原本實現,首先編寫腳本性能
添加網卡腳本:centos7
cat >>/etc/qemu-ifup<<endspa
#!/bin/bash BRIDGE=br0 if [ -n $1 ]; then ip link set $1 up sleep 1 brctl addif $BRIDGE $1 [ $? -eq 0 ] && exit 0 || exit 1 else echo "Error: no interface specified." exit 1 fi sh -n /etc/qemu-ifup # 檢測有無語法錯誤 chmod +x /etc/qemu-ifup # 給與執行權限
當虛擬機中止時,網卡會自動從網橋中down掉,因此不用編寫中止網卡腳本
執行以下指令啓動虛擬機:線程
qemu-kvm -smp 1 -m 512 -cpu host \
-drive file=/images/centos7.img,if=virtio,media=disk,cache=writeback \
-net nic,model=virtio,macaddr=52:54:00:11:22:33 \
-net tap,ifname=vnet0.0,script=/etc/qemu-ifup \
-daemonize
參數說明:
-smp: 虛擬機cpu線程數 -cpu: cpu的類型;host爲虛擬機使用物理機cpu類型 -drive: 驅動設備 file: 驅動設備目錄 if: 驅動設備類型,virtio爲半虛擬化類型,性能較好 media:驅動設備是disk仍是cdrom cache:設備緩存,writeback爲回寫 -net nic:虛擬機網卡前半段,這是在虛擬機中使用的網卡 macaddr:設置虛擬機網卡mac地址,在使用qemu-kvm建立虛擬機時,須要手動指定mac地址,不然會出現相同的mac地址虛擬機 model:網卡類型,virtio爲半虛擬化類型,性能較好
tap:爲虛擬網卡後半段,須要鏈接到網橋上 ifname:宿主機系統中網卡名稱(隨意指定),好比:vnet0.0 script:指定啓動時,須要執行的腳本,該腳本是將虛擬機的後半段網卡添加到網橋中
啓動第二臺虛擬機3d
qemu-kvm -smp 1 -m 512 -cpu host \
-drive file=/images/centos7-1.img,if=virtio,media=disk,cache=writeback \
-net nic,model=virtio,macaddr=52:54:00:11:22:34 \
-net tap,ifname=vnet0.1,script=/etc/qemu-ifup \
-daemonize
兩個虛擬機啓動後,分別登陸,互ping一次
而後在從宿主機分別ping兩臺虛擬機一次
2、 路由模型及NAT模型
NAT模式
該模式網橋要做爲路由器對虛擬機地址進行轉發。
路由模式是沒法修改源地址ip,所以虛擬機可能會成功的將報文發送給目標地址ip,而目標地址ip沒法將報文回傳給源地址ip;
NAT模式則是將源地址ip改成物理網卡ip發送給目標地址,目標地址ip回傳給物理網卡,在將報文發送至虛擬主機。
yum install iptables-services -y # 安裝須要的程序包,使用iptables規則對報文進行轉發。
編寫虛擬機開啓執行腳本:
cat >> /etc/qemu-natup<<end
#!/bin/bash
#
bridge=br0
net="192.168.100.1/24"
checkbr() {
if brctl show | grep -i $1; then
return 0
else
return 1
fi
}
initbr() {
brctl addbr $bridge
ip link set $bridge up
ip addr add $net dev $bridge
}
enable_ip_forward() {
sysctl -w net.ipv4.ip_forward=1
}
setup_nat() {
checkbr $bridge
if [ $? -eq 1 ]; then
initbr
enable_ip_forward
iptables -t nat -A POSTROUTING -s $net ! -d $net -j MASQUERADE
fi
}
if [ -n $1 ]; then
setup_nat
ip link set $1 up
brctl addif $bridge $1
exit 0
else
echo "Error: no interface specified."
exit 1
fi
end
編寫虛擬機關閉執行腳本:
cat >>/etc/qemu-natdown <<end
#!/bin/bash
#
bridge=br0
net='192.168.100.0/24'
remove_rule() {
iptables -t nat -F
}
isalone_bridge() {
if ! brctl show | awk "/^$bridge/{print \$4}" | grep "[^[:space:]]" &> /dev/null; then
ip link set $bridge down
brctl delbr $bridge
remove_rule
fi
}
if [ -n $1 ]; then
ip link set $1 down
brctl delif $bridge $1
isalone_bridge
exit 0
else
echo "Error: no interface specified."
exit 1
fi
end
chmod +x /etc/{qemu-natup,qemu-natdown}
ll /etc/{qemu-natup,qemu-natdown}
上述2個腳本對於nat模式的網絡很重要
建立虛擬機:
qemu-kvm -smp 1 -m 512 -cpu host \
-drive file=/images/centos7.img,if=virtio,media=disk,cache=writeback \
-net nic,model=virtio,macaddr=52:54:00:11:22:33 \
-net tap,ifname=vnet0.0,script=/etc/qemu-natup,downscript=/etc/qemu-natdown \
-daemonize
qemu-kvm -smp 1 -m 512 -cpu host \
-drive file=/images/centos7-1.img,if=virtio,media=disk,cache=writeback \
-net nic,model=virtio,macaddr=52:54:00:11:22:34 \
-net tap,ifname=vnet0.1,script=/etc/qemu-natup,downscript=/etc/qemu-natdown \
-daemonize
查看兩臺虛擬機的後半段網卡(vnetX)是否都鏈接在橋br0上,在經過POSTROUTING鏈進行源地址轉換
brctl show
ip a
iptables -nL -t nat
分別給兩臺虛擬機配置ip地址,命令以下:
ip addr add 192.168.100.20/24 dev eth0 ip addr add 192.168.100.30/24 dev eth0
兩臺虛擬機之間實現互通了,配置默認路由爲br0地址,實現公網的訪問
路由配置以下:
ip route add default via 192.168.100.1
3、橋接模式
在該模式下,宿主機會虛擬出來一張虛擬網卡做爲宿主機自己的通訊網卡(br0),而宿主機的物理網卡則成爲橋設備(交換機)(eth0),因此虛擬機至關於在宿主機所在局域網內的一個單獨的主機,他的行爲和宿主機是同等地位的,沒有依存關係。
使用qemu-kvm建立橋接模式
爲宿主機建立虛擬網卡,並將物理網卡做爲橋設備
cd /etc/sysconfig/network-scripts/ cp -a ifcfg-eno16777736 ifcfg-br0
cat >>ifcfg-eno16777736<<end
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=eno16777736
UUID=9f0bf158-e598-4309-8c0c-7609174ff212
DEVICE=eno16777736
ONBOOT=yes
BRIDGE=br0
end
cat >>ifcfg-br0 <<end TYPE=Bridge BOOTPROTO=none DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=no NAME=br0 DEVICE=br0 ONBOOT=yes IPADDR=10.0.0.11 NETMASK=255.255.255.0 GATEWAY=10.0.0.1 DNS1=10.0.0.1 DNS2=114.114.114.114
end
systemctl restart network ip a
brctl show
物理網卡eno16777736 將做爲交換機使用,沒有ip地址
編寫虛擬機啓動腳本,該腳本和隔離模式腳本一致:
cat >> /etc/qemu-ifup<<end
#!/bin/bash
#
BRIDGE=br0
if [ -n $1 ]; then
ip link set $1 up
sleep 1
brctl addif $BRIDGE $1
[ $? -eq 0 ] && exit 0 || exit 1
else
echo "Error: no interface specified."
exit 1
fi
end
啓動虛擬機:
qemu-kvm -smp 1 -m 512 -cpu host \ -drive file=/images/centos7-1.img,if=virtio,media=disk,cache=writeback \ -net nic,model=virtio,macaddr=52:54:00:11:22:34 \ -net tap,ifname=vnet0.1,script=/etc/qemu-ifup \ -daemonize