1、命令行安装方式
virt-install \
--name=kvm99 --ram 1024 --vcpus=1 \
--disk path=/home/vms/kvm99.qcow2,size=10,format=qcow2,bus=virtio \
--location=/mnt/CentOS-7-x86_64-Minimal-1611.iso --network network=default,model=virtio \
--graphics=none --console=pty,target_type=serial \
--extra-args="console=tty0 console=ttyS0"
--network network=default 配置网络使用默认,NAT 方式
dnsmasq 服务
libvirt默认使用了一个名为default的nat网络,这个网络默认使用virbr0作为桥接接口,使用dnsmasq来为使用nat网络的虚拟机提供dns及dhcp服务,dnsmasq生效后的配置文件默认保存在以下路径:
/var/lib/libvirt/dnsmasq/default.hostsfile mac&&ip绑定的配置文件
/var/lib/libvirt/dnsmasq/default.leases dhcp分配到虚拟机的ip地址列表
/var/lib/libvirt/network/default.xml default网络的配置文件
dnsmasq服务的启动脚本在/etc/init.d/dnsmasq ,但是我们如果手动使用此脚本来启动服务将会导致dnsmasq读取其自己的配置文件来启动此服务,因此这么做是不推荐的,因为这个服务完全由libvirtd在接管,
当libvirtd服务启动的时候,它会将它管理的被标记为autostart的network一并启动起来,而启动network的时候就会自动调用dnsmasq并赋予其适宜的配置文件来运行服务。
使用libvirt管理的网络都会用到dnsmasq来产生相应的配置,比如定义了一个名为route110的network,那么这个route110将使用一个新的桥接接口virbr1来接入网络,并使用dnsmasq产生名为route110.hostsfile和route110.leases的配置文件。
其实这里提到的virbr0和virbr1都是libvirt产生的虚拟网卡,其作用就相当于一个虚拟交换机,为虚拟机提供网络转发服务。
2、安装完成后,修改网段,也可以用默认网段 192.168.122.0/24
virsh net-edit default
default
5e3af757-8a76-4fe1-af65-3352b68e23f6
# 安装好 libvirtd 后,默认会安装一块 virbr0 的虚拟网卡,网段为 192.168.122.0/24
3、重新定义
virsh net-define /etc/libvirt/qemu/networks/default.xml
4、停止 网卡
virsh net-destroy default
5、启动网卡
virsh net-start default
6、重启 libvirtd
systemctl restart libvirtd
7、虚拟机配置 网卡
# 设置IP,其它参数已省略
…………
IPADDR=192.168.77.6
NETMASK=255.255.255.0
GATEWAY=192.168.77.1
DNS1=8.8.8.8
8、宿主机 查看 iptables
iptables -t nat -nL
# 显示
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
RETURN all -- 192.168.77.0/24 224.0.0.0/24
RETURN all -- 192.168.77.0/24 255.255.255.255
MASQUERADE tcp -- 192.168.77.0/24 !192.168.77.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.77.0/24 !192.168.77.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.77.0/24 !192.168.77.0/24
iptables -t filter -nL
# 显示
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 192.168.77.0/24 ctstate RELATED,ESTABLISHED
ACCEPT all -- 192.168.77.0/24 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:68
从上面防火墙可以看出, 在启动 libvirtd 网卡的时候,会动态生成 iptables nat,filter 表,以实现 SNAT 功能,虚拟机可以访问外网。因为没有保存,如果重启 iptables 会全部丢失,接下来我们重新启动 iptables 来手动配置 SNAT 功能
重启 iptables 后 虚拟机就不能上网了
systemctl restart iptables
配置 SNAT 转发功能,实现虚拟机通过 宿主机 来上网
vim /etc/sysctl.conf
# 加入
net.ipv4.ip_forward = 1
# 立退生效
sysctl –p
# 清空规则链
iptables -F
# 方法一 有固定IP 这里指宿主机 192.168.1.73
iptables -t nat -A POSTROUTING -s 192.168.77.0/24 -j SNAT --to-source 192.168.1.73
# 方法二 如果没有固定IP
iptables -t nat -A POSTROUTING -s 192.168.77.0/24 -j MASQUERADE
通过上面配置,这里虚拟机就可以上网了,也可以访问 192.168.1.0/24 网段的主机了,但是 192.168.1.0/24 网段的主机是不能访问 虚拟机 192.168.77.6,这时可以通过 端口映射来实现这个功能
宿主机 外网 192.168.1.73 内网 192.168.77.1 (这里就是生成的virbr0 虚拟网卡)
虚拟机 192.168.77.6
其它主机 192.168.1.86 (跟宿主机在一个网段)
实现 192.168.1.86 通过 访问 192.168.1.73 8802 端口 来实现 登陆 192.168.77.66 22 端口
配置 端口 映射功能,实现 192.168.1.0/24 网段主机 远程登陆 192.168.77.6
iptables -t nat -A PREROUTING -d 192.168.1.73 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 192.168.77.6:22
保存生效
service iptables save
这时找一台 192.168.1.0/24 网段的主机 我这里是 192.168.1.86,进行访问
telnet 192.168.1.73 8022
# 成功
Trying 192.168.1.73...
Connected to 192.168.1.73.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.6.1
接下来配置 宿主机 filter 表防火墙
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0] # 转发功能要打开
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
COMMIT