Nat模式
注意:
[root@localhost ~]# yum info firewalld
不同版本的firewalld工具,对iptables规则的影响不一样,如果使用的是 centos7.7之前的版本,那么防火墙版本应该在: 0.6.3.2.el7版本,这时候,防火墙必须是打开的状态才可以看到路由转发规则。
而到了centos7.8版本的时候,firewalld防火墙版本已经更新,现在 firewalld工具必须是关闭状态,才可以看到路由转发规则。
查看路由转发规则,或者iptables-save命令 ,都可以
[root@localhost ~]# iptables -t nat -L
KVM默认的网络方式,如果想要使用这种模式(centos7.7之前)防火墙需要打开,因为需要用到iptables规则
# 防火墙添加规则,打开5900端口
[root@localhost ~]# firewall-cmd --add-port=5900/tcp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-all
添加路由转发
[root@localhost ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
NAT模式自定义网段
1、直接修改我们现在使用的default网络的信息
[root@kvm01 ~]# virsh net-edit default
……
<ip address='192.168.120.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.120.2' end='192.168.120.254'/>
</dhcp>
……
[root@kvm01 ~]# virsh net-destroy --network default
[root@kvm01 ~]# virsh net-start --network default
[root@kvm01 ~]# virsh net-dumpxml default
<network>
<name>default</name>
<uuid>795e355e-4265-498a-ac30-336d7af9c47a</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:6d:6b:d9'/>
<ip address='192.168.120.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.120.2' end='192.168.120.254'/>
</dhcp>
</ip>
</network>
此时,kvm虚拟机的virbr0网卡的IP地址就改变了
[root@kvm01 ~]# ip a
……
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:6d:6b:d9 brd ff:ff:ff:ff:ff:ff
inet 192.168.120.1/24 brd 192.168.120.255 scope global virbr0
valid_lft forever preferred_lft forever
……
打开虚拟机test01,仍然用dhcp的方式获取IP地址,就会看到kvm虚拟机域获取到的IP地址已经变了
[root@kvm01 ~]# virsh start test01
[root@kvm01 ~]# virsh vncdisplay test01
:0
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=dhcp
ONBOOT=yes
[root@localhost ~]# systemctl restart network
2、可以去自定义一个网段
[root@kvm01 ~]# virsh net-dumpxml default > test.xml
[root@kvm01 ~]# vim test.xml
<network>
<name>test</name>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<ip address='192.168.110.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.110.2' end='192.168.110.254'/>
</dhcp>
</ip>
</network>
[root@kvm01 ~]# virsh net-create test.xml
Network test created from test.xml
[root@kvm01 ~]# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
test active no no
[root@kvm01 ~]# virsh net-dumpxml test
<network>
<name>test</name>
<uuid>c620e968-5c5e-48fc-8319-5fd8a1fbdab7</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:b0:36:b9'/>
<ip address='192.168.110.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.110.2' end='192.168.110.254'/>
</dhcp>
</ip>
</network>
[root@kvm01 ~]# ip a
...
5: virbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500
qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:b0:36:b9 brd ff:ff:ff:ff:ff:ff
inet 192.168.110.1/24 brd 192.168.110.255 scope global
virbr1
valid_lft forever preferred_lft forever
6: virbr1-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc
pfifo_fast master virbr1 state DOWN group default qlen
1000
link/ether 52:54:00:b0:36:b9 brd ff:ff:ff:ff:ff:ff
修改想要使用此网络的虚拟机域,这里我们使用test01虚拟机域
[root@kvm01 ~]# virsh edit test01
...
67 <interface type='network'>
68 mac地址这里直接删除即可。
69 <source network='test'/>
...
[root@kvm01 ~]# virsh start test01
PS:虚拟机域的IP获取方式改为dhcp,直接启用,即可看到分配到的IP地址,当然是在我们test网络同一个网段的
总结:nat模式支持主机与虚拟机的互访,也支持虚拟机访问互联网,但不支持外网访问虚拟机域
桥接网络
1、创建虚拟桥接网卡br0
[root@kvm01 ~]# systemctl stop NetworkManager
[root@kvm01 ~]# virsh iface-bridge ens33 br0 #过程有可能报错,先看/etc/sysconfig/network-scripts/有没有自动生成 br0
[root@kvm01 ~]# cd /etc/sysconfig/network-scripts/
[root@kvm01 network-scripts]# ls
ifcfg-br0
查看配置文件会看到,ens33桥接到了br0上
[root@kvm01 network-scripts]# cat ifcfg-ens33
DEVICE="ens33"
ONBOOT="yes"
BRIDGE="br0"
[root@kvm01 network-scripts]# cat ifcfg-br0
DEVICE="br0"
ONBOOT="yes"
TYPE="Bridge"
BOOTPROTO="none"
IPADDR="192.168.1.150"
NETMASK="255.255.255.0"
GATEWAY="192.168.1.1"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
DHCPV6C="no"
STP="on"
DELAY="0"
[root@kvm01 network-scripts]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29efc727 yes ens33
virbr0 8000.5254006d6bd9 yes virbr0-nic
vnet0
2、修改kvm虚拟机域的xml配置文件
[root@kvm01 ~]# virsh edit test02
...
69 <interface type='bridge'> #修改
70 <mac address='52:54:00:97:98:6f'/> #无须修改
71 <source bridge='br0'/> #修改
...
3、开启虚拟机域,配置IP,验证是否能够连通外网
[root@kvm01 ~]# virsh start test02
[root@kvm01 ~]# virsh vncdisplay test02
:0
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=dhcp
ONBOOT=yes
[root@localhost ~]# systemctl restart network
也可配置静态IP验证
PS:这时候需要注意,往往到这一步,很可能会报一个错,说要开启虚拟网卡的混杂模式,出于安全考虑是不允许的,然后就会出现,dhcp模式获取不到IP,即使手动设置好IP之后,仍然ping不通外网。
因为要开启网卡的混杂模式,需要我们对VMware的vmnet0网卡有权限进行操作,如果使用的是Windows操作系统装的VMware,只要使用管理员运行VMware就可以了,如果是Linux操作系统上安装的VMware,需要更改一下/dev/vmnet0网卡的权限,当然如果想要使用nat网络,更改/dev/vmnet8就可以了。
练习:
1、由test01虚拟机,克隆一台虚拟机test02
2、test01使用默认的nat模式访问外网,并部署一个httpd服务。test02使用bridge模式访问外网,并部署一个nginx服务
3、两台虚拟机域哪一台能给外网提供服务,并总结两种网络模式的优缺点
练习实操:
1、由test01虚拟机,克隆一台虚拟机test02
[root@kvm01 ~]# virsh list --all
Id Name State
----------------------------------------------------
- centos7.0 shut off
- test01 shut off
[root@kvm01 ~]# virt-clone --auto-clone -o test01 -n test02
[root@kvm01 ~]# virsh list --all
Id Name State
----------------------------------------------------
- centos7.0 shut off
- test01 shut off
- test02 shut off
[root@kvm01 ~]# ls /kvm-vm/
centos7.0.qcow2 test01.raw test02.raw
[root@kvm01 ~]# ls /etc/libvirt/qemu/
centos7.0.xml networks test01.xml test02.xml
2、test01使用默认的nat模式访问外网,并部署一个httpd服务。test02使用bridge模式访问外网,并部署一个nginx服务
1)test01使用默认的nat模式访问外网,并部署一个httpd服务
继上边的实验继续部署httpd服务:
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# echo 1231111111111 > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd
[root@localhost ~]# curl 192.168.110.45
1231111111111
外界访问不到:
[root@kvm01 ~]# curl 192.168.110.45
curl: (7) Failed connect to 192.168.110.45:80; No route to host
例图:
2)test02使用bridge模式访问外网,并部署一个nginx服务
继上边的实验继续部署nginx服务:
在kvm虚拟机中编写nginx.repo文件,scp到test02虚拟机域中
[root@kvm01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[root@kvm01 ~]# scp /etc/yum.repos.d/nginx.repo root@192.168.1.143:/etc/yum.repos.d/
在test02虚拟机域中安装nginx
[root@localhost ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[root@localhost ~]# yum -y install nginx
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx
[root@localhost ~]# curl 192.168.1.143 #本机访问
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
……
[root@localhost ~]# firewall-cmd --add-port=5900/tcp --permanent #防火墙添加规则,打开5900端口
success
[root@localhost ~]# firewall-cmd --add-port=80/tcp --permanent #防火墙添加规则,打开80端口
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-all
……
ports: 5900/tcp 80/tcp
……
外界访问:
[root@kvm01 ~]# curl 192.168.1.143
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
例图:
3、两台虚拟机域哪一台能给外网提供服务,并总结两种网络模式的优缺点
test02可以给外界提供服务;
优缺点:
nat: | nat模式支持主机与虚拟机的互访,也支持虚拟机访问互联网,但不支持外网访问虚拟机域 |
---|---|
bridge: | bridge模式支持主机与虚拟机的互访,也支持虚拟机访问互联网,支持外网访问虚拟机域 |