KVM-10、四种简单的网络模型
创始人
2024-06-02 23:57:57
0

\1. 隔离模式:虚拟机之间组建网络,该模式无法与宿主机通信,无法与其他网络通信,相当于虚拟机只是连接到一台交换机上。
\2. 路由模式:相当于虚拟机连接到一台路由器上,由路由器(物理网卡),统一转发,但是不会改变源地址。
\3. NAT模式:在路由模式中,会出现虚拟机可以访问其他主机,但是其他主机的报文无法到达虚拟机,而NAT模式则将源地址转换为路由器(物理网卡)地址,这样其他主机也知道报文来自那个主机,在docker环境中经常被使用。
\4. 桥接模式:在宿主机中创建一张虚拟网卡作为宿主机的网卡,而物理网卡则作为交换机。

\1. 隔离模型:

img

​ Guest1 和 Guest2 都为虚拟机。
​ Linux在虚拟机中的网卡都包含前半段和后半段,前半段在虚拟机上,后半段在宿主机上。上图eth0在Guest1虚拟机上的网卡,对应的后半段为vnet0,在Guest1上所有发往eth0的数据就直接发往vnet0了,也可以将vnet0看作一张网卡

​ Guest1和Guest2如何通信:
​ 在宿主机中创建一个虚拟交换机,让vnet0和vnet1分别为虚拟交换机的一个接口,交换机也可以叫做bridge,只要两个虚拟网卡的前半段ip地址在同一个网段内,就可以相互通信,这就是隔离模式。

1.1 使用qemu-kvm创建隔离模式

[root@kvm ~]# yum install bridge-utils qemu-kvm -y         # 安装所需软件包# 创建网桥[root@kvm ~]# brctl addbr br0
[root@kvm ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
br0        8000.000000000000    no
[root@kvm ~]# ip link set br0 up     # 必须保持桥接网卡的活跃状态,否则虚拟机之间无法互通

虚拟机启动时,网卡的后半段不会自动添加到虚拟网桥,需要一个脚本来实现,首先编写脚本

添加网卡脚本:

[root@kvm ~]# vim /etc/qemu-ifup#!/bin/bash
#
BRIDGE=br0
if [ -n $1 ]; thenip link set $1 upsleep 1brctl addif $BRIDGE $1
[ $? -eq 0 ] && exit 0 || exit 1
elseecho "Error: no interface specified."
exit 1
fi[root@kvm ~]# sh -n /etc/qemu-ifup         # 检测有无语法错误
[root@kvm ~]# chmod +x /etc/qemu-ifup     # 给与执行权限当虚拟机停止时,网卡会自动从网桥中down掉,所以不用编写停止网卡脚本[root@kvm ~]# 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
VNC server running on `127.0.0.1:5900'-smp: 虚拟机cpu线程数-cpu: cpu的类型;host为虚拟机使用物理机cpu类型-drive: 驱动设备file: 驱动设备目录if: 驱动设备类型,virtio为半虚拟化类型,性能较好media:驱动设备是disk还是cdromcache:设备缓存,writeback为回写-netnic:虚拟机网卡前半段,这是在虚拟机中使用的网卡macaddr:设置虚拟机网卡mac地址,在使用qemu-kvm创建虚拟机时,需要手动指定mac地址,否则会出现相同的mac地址虚拟机model:网卡类型,virtio为半虚拟化类型,性能较好tap:为虚拟网卡后半段,需要连接到网桥上ifname:系统中网卡名称,比如:vnet0.0script:指定启动时,需要执行的脚本,该脚本是将虚拟机的后半段网卡添加到网桥中

启动第二台虚拟机

[root@kvm ~]# 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
VNC server running on `127.0.0.1:5901'

img

通过上图,虚拟主机之间能相互连通。

img

宿主机是无法访问到虚拟机,这就是kvm隔离模式

\2. 路由模型及NAT模型

img

NAT模式
该模式网桥要作为路由器对虚拟机地址进行转发,路由模式是无法修改源地址ip,因此虚拟机可能会成功的将报文发送给目标地址ip,而目标地址ip无法将报文回传给源地址ip;
      NAT模式则是将源地址ip改为物理网卡ip发送给目标地址,目标地址ip回传给物理网卡,在将报文发送至虚拟主机。

2.1 使用qemu-kvm创建NAT模式

[root@kvm ~]# yum install qemu-kvm iptables-services bridge-utils -y     # 安装需要的程序包,使用iptables规则对报文进行转发。

编写虚拟机开启执行脚本:

[root@kvm ~]# vim /etc/qemu-natup #!/bin/bash
#
bridge=br0
net="192.168.100.1/24"checkbr() {if brctl show | grep -i $1; thenreturn 0elsereturn 1fi
}initbr() {brctl addbr $bridgeip link set $bridge upip addr add $net dev $bridge
}enable_ip_forward() {sysctl -w net.ipv4.ip_forward=1
}setup_nat() {checkbr $bridgeif [ $? -eq 1 ]; theninitbrenable_ip_forwardiptables -t nat -A POSTROUTING -s $net ! -d $net -j MASQUERADEfi
}if [ -n $1 ]; thensetup_natip link set $1 upbrctl addif $bridge $1exit 0
elseecho "Error: no interface specified."exit 1
fi

编写虚拟机关闭执行脚本:

[root@kvm ~]# vim /etc/qemu-natdown #!/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; thenip link set $bridge downbrctl delbr $bridgeremove_rulefi
}if [ -n $1 ]; thenip link set $1 downbrctl delif $bridge $1isalone_bridge
exit 0
elseecho "Error: no interface specified."exit 1
fi

以上两个脚本对于NAT模型来说非常重要。

使用qemu-kvm 创建虚拟机

[root@kvm ~]# 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
net.ipv4.ip_forward = 1
VNC server running on `127.0.0.1:5900'[root@kvm ~]# 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
br0        8000.9acac824e624    no        vnet0.0
VNC server running on `127.0.0.1:5901'

查看两台虚拟机的后半段网卡都连接在桥br0上,在通过POSTROUTING链进行源地址转换。

[root@kvm ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
br0        8000.9acac824e624    no        vnet0.0vnet0.1[root@kvm ~]# ip a 
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN link/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 forever
2: eno16777736:  mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:7b:9f:8c brd ff:ff:ff:ff:ff:ffinet 10.0.0.11/24 brd 10.0.0.255 scope global eno16777736valid_lft forever preferred_lft forever
6: vnet0.0:  mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 500link/ether 9a:ca:c8:24:e6:24 brd ff:ff:ff:ff:ff:ff
7: br0:  mtu 1500 qdisc noqueue state UP link/ether 9a:ca:c8:24:e6:24 brd ff:ff:ff:ff:ff:ffinet 192.168.100.1/24 scope global br0valid_lft forever preferred_lft forever
8: vnet0.1:  mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 500link/ether f6:6c:f7:34:91:d4 brd ff:ff:ff:ff:ff:ff[root@kvm ~]# iptables -L -n -t nat 
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         Chain INPUT (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  192.168.100.0/24    !192.168.100.0/24 

分别给两台虚拟机配置ip地址,命令如下:

ip addr add 192.168.100.20/24 dev eth0 
ip addr add 192.168.100.30/24 dev eth0

img

两台虚拟机之间实现互通了,配置默认路由为br0地址,实现公网的访问。

路由配置如下:

ip route add default via 192.168.100.1

img

kvm-nat模型实现成功。

\3. 桥接模式

img

​ 在该模式下,宿主机会虚拟出来一张虚拟网卡作为宿主机本身的通信网卡,而宿主机的物理网卡则成为桥设备(交换机),所以虚拟机相当于在宿主机所在局域网内的一个单独的主机,他的行为和宿主机是同等地位的,没有依存关系。

3.1 使用qemu-kvm创建桥接模式

为宿主机创建虚拟网卡,并将物理网卡作为桥设备

[root@kvm ~]# cd /etc/sysconfig/network-scripts/
[root@kvm network-scripts]# cp -a ifcfg-eno16777736 ifcfg-br0
[root@kvm network-scripts]# vim ifcfg-eno16777736TYPE=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[root@kvm network-scripts]# vim ifcfg-br0 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[root@kvm network-scripts]# systemctl restart network 
[root@kvm network-scripts]# ip a 
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN link/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 forever
2: eno16777736:  mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000link/ether 00:0c:29:7b:9f:8c brd ff:ff:ff:ff:ff:ff
5: br0:  mtu 1500 qdisc noqueue state UP link/ether 00:0c:29:7b:9f:8c brd ff:ff:ff:ff:ff:ffinet 10.0.0.11/24 brd 10.0.0.255 scope global br0valid_lft forever preferred_lft forever[root@kvm network-scripts]# brctl show
bridge name    bridge id        STP enabled    interfaces
br0        8000.000c297b9f8c    no        eno16777736

物理网卡eno16777736 将作为交换机使用,没有ip地址

编写虚拟机启动脚本,该脚本和隔离模式脚本一致:

[root@kvm network-scripts]# vim /etc/qemu-ifup #!/bin/bash
#
BRIDGE=br0
if [ -n $1 ]; thenip link set $1 upsleep 1brctl addif $BRIDGE $1
[ $? -eq 0 ] && exit 0 || exit 1
elseecho "Error: no interface specified."
exit 1
fi

启动虚拟机

[root@kvm network-scripts]# 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
VNC server running on `127.0.0.1:5900'

img

桥接模式完成。 以上为KVM最简单是4种网络模型,最为常见的是桥接模型。虚拟化环境中,目前见过最多的就是使用桥接模型。现在流行的docker一般是基于nat模型实现的。

本文作者:hukey

本文链接:https://www.cnblogs.com/hukey/p/6436211.html

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
VNC server running on `127.0.0.1:5900’

[外链图片转存中...(img-6rVWRJLy-1678704075210)]桥接模式完成。 以上为KVM最简单是4种网络模型,最为常见的是桥接模型。虚拟化环境中,目前见过最多的就是使用桥接模型。现在流行的docker一般是基于nat模型实现的。本文作者:hukey本文链接:https://www.cnblogs.com/hukey/p/6436211.html版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆[许可协议](https://www.cnblogs.com/hukey/p/6436211.html)进行许可。

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...