VMware Workstation(环境)
设备 | 配置 |
---|---|
VMware宿主机 | 192.168.100.106 |
VMnet8 | 10.0.0.2 |
Gateway(nat) | 10.0.0.1 |
KVM宿主机 | 10.0.0.51 |
KVM(环境)
设备 | 配置 |
---|---|
tap0 | 10.0.1.1 |
kvm-001 | 10.0.1.101 |
kvm-002 | 10.0.1.102 |
一、隔离模型
Guest1和Guest2都是在宿主机上创建的虚拟机,虚拟机的网卡分为前半段和后半段,前半段位于虚拟机上,后半段在宿主机上。实际上,在Guest1上所有发往eth0的数据就是直接发往vnet0,是由vnet0进行数据的传送处理。
在隔离模式下,宿主机创建一个虚拟交换机vSwitch,然后把vnet0和vnet1接入到该虚拟交换机,交换机也可以叫做bridge,因为vnet0和vnet1在一个网桥内,所以可以互相通信。
1.1、临时生效:
1、创建虚拟网桥br0
[root@kvm-node1 ~]# brctl addbr br0
[root@kvm-node1 ~]# ifconfig br0 up
2、桥接虚拟机网卡到网桥上
[root@localhost opt]# brctl addif br0 vnet0
[root@localhost opt]# brctl addif br0 vnet1
3、两台虚拟机配置为同网段,就可以互相通信了;但无法ping通宿主机;宿主机也无法ping通虚拟机。
这就是隔离模型,虚拟机之间可以互相通信,宿主机和虚拟机之间的网络是隔离开的。
1.2、永久生效
1、创建虚拟网桥br0
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=0.0.0.0
ONBOOT=yes
2、桥接虚拟机网卡到网桥上
[root@localhost ~]# virsh edit <虚拟机名称>
<interface type='bridge'>
<mac address='52:54:00:74:63:c3'/>
<source bridge='br0'/>
<model type='virtio'/>
二、路由模型
在隔离模型的基础上,将宿主机的一块虚拟网卡virnet0加入到虚拟网桥中,这样virnet0就可以和虚拟机通信,通过将虚拟机的默认网关设置为virnet0的IP地址,然后在宿主机中打开IP地址转发,使得虚拟机可以访问宿主机。不过此时虚拟机仅仅可以将报文发送到外部网络,因为外部网络没有路由到虚拟机中,所以外部网络无法将报文回传给虚拟机。
2.1、临时生效
1、安装所需软件包
[root@localhost opt]# vim /etc/yum.repos.d/nux-misc.repo
[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
[root@localhost opt]# yum -y --enablerepo=nux-misc install tunctl
2、在宿主机上创建一个虚拟网卡
[root@kvm-node1 ~]# tunctl -b
tap0
3、将tap0网卡加入到虚拟网桥br0中
[root@kvm-node1 ~]# brctl addif br0 tap0
[root@kvm-node1 ~]# ifconfig tap0 10.0.1.1 up
[root@kvm-node1 ~]# ifconfig br0 10.0.1.1 netmask 255.255.255.0 up
[root@localhost qemu]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0263d5085d14 no tap0
vnet0
vnet1
virbr0 8000.525400de867a yes virbr0-nic
4、进入虚拟机并将虚拟机的默认网关设置为tap0的IP地址后,虚拟机可与宿主机互相通信,但无法沟通宿主机网关;
5、打开宿主机的ip转发功能
[root@kvm-node1 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
6、此时报文可转发至宿主机网关,但是网关找不到回包的路由,需要在宿主机添加一条iptables规则
[root@localhost qemu]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE
虚拟机与宿主机已经可以互通了!!!
7、在宿主机外的主机上ping虚拟机的地址
比如,我在运行VMware的主机上,当然宿主机的网关也在该主机上,此时我的windows主机的IP地址有192.168.100.106和10.0.0.2,我尝试在windows主机上去ping虚拟机的地址。
此时,外部主机(windows主机)也无法ping通虚拟机,那么为了能ping通,我们还需要添加一条路由,
添加该路由后,外部windows主机已经可以和虚拟机通信了。
通过上述实践,也可以发现路由模型的缺陷,虽然虚拟机能同宿主机通信,也能将数据包发到外部网络,但是外部网络无法回传数据包,要想外部网络能与虚拟机通信,就要添加对应的路由规则。这对于大规模的虚拟环境,显然是不切实际的。
2.1、永久生效
1、安装所需软件包
[root@localhost opt]# vim /etc/yum.repos.d/nux-misc.repo
[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
[root@localhost opt]# yum -y --enablerepo=nux-misc install tunctl
2、在宿主机上创建一个虚拟网卡
1)创建启动服务脚本
[root@hunterfu ~]# vim /etc/init.d/config_tap #作为系统服务随系统自动启动创建虚拟网卡
#!/bin/bash
#
# config_tap Start up the tun/tap virtual nic
#
# chkconfig: 2345 55 25
USER="root"
TAP_NETWORK="10.0.1.1" # 设置虚拟网卡tap0的IP(根据具体需求修改)
TAP_DEV_NUM=0
DESC="TAP config"
do_start() {
if [ ! -x /usr/sbin/tunctl ]; then
echo "/usr/sbin/tunctl was NOT found!"
exit 1
fi
tunctl -t tap$TAP_DEV_NUM -u root
ifconfig tap$TAP_DEV_NUM ${TAP_NETWORK} netmask 255.255.255.0 promisc
ifconfig tap$TAP_DEV_NUM
brctl addif br0 tap0 # 将tap0网卡加入到虚拟网桥br0中(根据具体需求修改)
}
do_stop() {
ifconfig tap$TAP_DEV_NUM down
}
do_restart() {
do_stop
do_start
}
check_status() {
ifconfig tap$TAP_DEV_NUM
}
case $1 in
start) do_start;;
stop) do_stop;;
restart) do_restart;;
status)
echo "Status of $DESC: "
check_status
exit "$?"
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
2)加入到系统服务中
[root@hunterfu ~]# chkconfig --add config_tap
3)设置开机自启动
[root@hunterfu ~]# chkconfig --level 345 config_tap on
操作完成后,就可以像其他标准服务一样,通过 service config_tap start 来进行创建和启动操作
3、将tap0网卡加入到虚拟网桥br0中 (已写入上述脚本中)
4、进入虚拟机并将虚拟机的默认网关设置为tap0的IP地址后,虚拟机可与宿主机互相通信,但无法沟通宿主机网关;
5、打开宿主机的ip转发功能
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@kvm-node1 ~]# sysctl -p # 加载一下
6、此时报文可转发至宿主机网关,但是网关找不到回包的路由,需要在宿主机添加一条iptables规则
[root@localhost qemu]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE
虚拟机与宿主机已经可以互通了!!!
7、在宿主机外的主机上ping虚拟机的地址
比如,我在运行VMware的主机上,当然宿主机的网关也在该主机上,此时我的windows主机的IP地址有192.168.100.106和10.0.0.2,我尝试在windows主机上去ping虚拟机的地址。
此时,外部主机(windows主机)也无法ping通虚拟机,那么为了能ping通,我们还需要添加一条路由,
添加该路由后,外部windows主机已经可以和虚拟机通信了。
通过上述实践,也可以发现路由模型的缺陷,虽然虚拟机能同宿主机通信,也能将数据包发到外部网络,但是外部网络无法回传数据包,要想外部网络能与虚拟机通信,就要添加对应的路由规则。这对于大规模的虚拟环境,显然是不切实际的。
三、NAT模型
NAT模型其实就是SNAT的实现,路由中虚拟机能将报文发送给外部主机,但是外部主机因找不到通往虚拟机的路由因而无法回应请求。但是外部主机能同宿主机通信,所以在宿主机上添加一个NAT转发,从而在外部主机请求虚拟机时,将虚拟机的IP地址转换为宿主机上的某个地址,从而实现外部网络与虚拟机的通信。
3.1、临时生效
step1:虚拟网卡桥接到网桥上
[root@localhost opt]# brctl addif br0 tap0
[root@localhost opt]# brctl addif br0 vnet0
[root@localhost opt]# brctl addif br0 vnet1
step2:给虚拟网桥配置IP
[root@kvm-node1 ~]# ifconfig tap0 0.0.0.0 up
[root@kvm-node1 ~]# ifconfig br0 10.0.1.1 netmask 255.255.255.0 up
此时虚拟机可与宿主机通信,但无法连接到宿主机网关;
step3:配置转发
[root@kvm-node1 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
step4:配置SNAT
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -d 0.0.0.0/0 -j MASQUERADE # 虚拟机通往外部;
step5:给虚拟机添加默认网关,将br0的IP地址设置为虚拟机的默认网关
由于宿主机上添加了iptables规则,虚拟机也可以ping通外部网络(192.168.49.1)了,NAT模型的实现完成。
3.2、永久生效
step1:虚拟网卡桥接到网桥上
[root@localhost ~]# virsh edit <虚拟机名称>
<interface type='bridge'>
<mac address='52:54:00:74:63:c3'/>
<source bridge='br0'/>
<model type='virtio'/>
step2:给虚拟网桥配置IP
1)在tap0启动服务中设置IP为0.0.0.0
[root@hunterfu ~]# vim /etc/init.d/config_tap
... ...
TAP_NETWORK="0.0.0.0"
... ...
2)在br0配置文件中设置IP为10.0.1.1
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.0.1.1
NETMASK=255.255.255.0
此时虚拟机可与宿主机通信,但无法连接到宿主机网关;
step3:配置转发
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@kvm-node1 ~]# sysctl -p # 加载一下
step4:配置SNAT
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -d 0.0.0.0/0 -j MASQUERADE # 虚拟机通往外部;
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables # 保存一下iptables策略
step5:给虚拟机添加默认网关,将br0的IP地址设置为虚拟机的默认网关
由于宿主机上添加了iptables规则,虚拟机也可以ping通外部网络(192.168.100.106)了,NAT模型的实现完成。
四、桥接模型
物理机的网卡具有桥的功能所以叫做桥接模型。
4.1、临时生效
step1:创建网桥
[root@localhost ~]# brctl addbr br1
[root@localhost ~]# ifconfig br1 up
step2:桥接物理网卡和虚拟网卡到网桥上
[root@localhost ~]# brctl addif br1 vnet0
[root@localhost ~]# brctl addif br1 ens33
step3:配置网络
[root@localhost ~]# ifconfig ens33 0.0.0.0
[root@localhost ~]# ifconfig br1 10.0.0.51 netmask 255.255.255.0 up
此时虚拟机可以ping通宿主机的IP地址(ens33的IP地址),也可以ping通外部网络(ens33的网关地址)至此,桥接模型实现完成。
4.2、永久生效
step1:创建网桥
[root@localhost ~]# brctl addbr br1
[root@localhost ~]# ifconfig br1 up
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br1
DEVICE=br1
TYPE=Bridge
BOOTPROTO=static
ONBOOT=yes
IPADDR=10.0.0.51
NETMASK=255.255.255.0
GATEWAY=10.0.0.1
DNS1=114.114.114.114
DNS2=8.8.8.8
step2:桥接物理网卡和虚拟网卡到网桥上
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTRPOTO=none # 修改
BRIDGE=br1 # 追加
[root@localhost ~]# virsh edit <虚拟机名称>
重启服务后,虚拟机就可以ping通宿主机的IP地址(ens33的IP地址),也可以ping通外部网络(ens33的网关地址)至此,桥接模型实现完成。