说明:此操作环境为CENTOS7无图形界面环境下,ubuntu 8也可以进行参考。
第一步: 检测环境。
查看CPU是否支持虚拟化,如果不行自行进bios开启虚拟化。
lscpu | grep Virtualization
第二步:安装kvm及相关。
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install
此步操作完成后,reboot一下。
第三步: 创建虚拟机
请先开启转发功能,创建的虚机才可上网:
vi /etc/sysctl.conf
将net.ipv4.ip_forward=0更改为net.ipv4.ip_forward=1 ,并取消掉前面的注视符“#”
如果没有就增加内容。
以下为创建NAT模式虚机,想了解与桥接的区别和如何设置为桥接,请自行放狗。
virt-install -n winxp --description "winxp" \
--os-type=win\
--os-variant=winxp\
--ram=1024 --vcpus=1\
--disk path=/home/kvm/winxp.img,size=10\
--network default\
--accelerate\
--graphics vnc,listen=0.0.0.0,keymap=en-us\
--cdrom=/home/bingxp.iso
#第4行,设置内存以及CPU。
#第5行为设置虚机磁盘文件路径以及大小,10为10GB
#第6行为NAT模式。
此时虚拟机已经建立并启动
第四步: 通过vnc给虚机安装OS。
#如VNC可直接连接成功,可以跳过此步,第五步为:解决连接vnc后无法从光盘引导安装OS,。
上面说过,虚机已经创建成功并启动,默认vnc端口为5900。监听ip为宿主IP,在配置文件中体现为:0.0.0.0。
但centos7默认开启防火墙,5900端口被屏蔽。建议关闭防火墙:
systemctl stop firewalld #临时关闭
systemctl disable firewalld #禁止开机
如果没有手动修改过vnc端口但连不上,请先检查虚机是否已经开启:
virsh list --all # 列出全部虚机并显示其状态。
如果主机开启并仍无法连接。
可以执行如下代码查询具体vnc端口:
virsh vncdisplay winxp
默认返回结果为0,或者1等自然整数。
例如:第一台虚机为0,既5900+0=5900, 第二胎虚机为1,既5900+1=5901, 以此类推。
如果手动指定为20001,那么查询结果既为20001。
第五步:虚拟机配置。
创建好虚机后,默认配置是从硬盘启动,并非从CDROM引导。
可以先将虚机强行关闭:
virsh destroy winxp
然后进行编辑:
virsh edit winxp
此时默认为vi编辑winxp.xml
配置文件
更改为从光驱引导:
更改为:
检查并添加ISO路径。
检查
具体示例如下:
以下为修改VNC配置示例供参考:
更改为:
#自动获取端口改为no,端口改为2008,增加vnc密码。
wq后,需要重新加载xml文件,然后启动虚机。
virsh define /etc/libvirt/qemu/winxp.xml
virsh start winxp #启动虚机
第六步:设置虚机DHCP地址。
#虚机可以手动设置网卡IP,手动设置网卡IP的可以略过此步。
编辑kvm的网络配置文件:
vi /etc/libvirt/qemu/networks/default.xml
获得虚机的mac地址后,可以参照如下示例进行配置(kvm默认网段为:192.168.122.0/24):
第七步:端口转发
下面均为介绍iptables相关内容,如果愿意使用rinetd或者其他的工具,或者使用桥接模式的,可以不用看了。
如果需要远程管理我们可以使用自带的vnc,但如果认为vnc不如系统自带的3389或ssh方便,我们可将NAT网络内的端口转发出来。
操作完上面第三步内开启转发的功能后,进行如下操作。
注:第四步已经将防火墙关闭,现在是在关闭防火墙的环境下操作,如果要开启防火墙,请自行检查iptables规则是否与防火墙冲突。
下面两条规则为将宿主机的2009端口,自动转发到虚机的3389端口。
iptables -t nat -A PREROUTING -p tcp --dport 2009 -j DNAT --to-destination 192.168.122.101:3389
iptables -t nat -A POSTROUTING -p tcp --dport 2009 -d 192.168.122.101 -j SNAT --to 192.168.122.1
开启转发后一直不通,因为对iptables不熟,这个坑了我2天,网上查询资料后,终于解决。因为默有两条拒绝规则,删除即可。
首先将规则列出:
iptables -nL -v --line-numbers -t filter
会有两条如下规则:
4 7 420 REJECT all — * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
5 0 0 REJECT all — virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
然后删除这两条规则,删除两次第四条即可,因为删除第四条后,第五条又变成第四条了。
iptables -D FORWARD 4 -t filter #删除编号为4的FORWARD规则
然后进行保存并重启iptables服务:
service iptables save #保存规则
service iptables resart #重启服务
转发端口即可工作了。
下面要有一个大坑介绍。
我们上面已经了“save”保存了,但宿主机重启后,iptables自行恢复,屏蔽规则也恢复了,端口转发又无法工作了。
因为在centos7下,需要把配置写入文件,然后开机后再从配置文件读取才可以。目前只找到这个方法。
iptables-save > /etc/sysconfig/iptables #文件路径可自行指定。
在 /etc/rc.local内加入如下内容;
iptables-restore < /etc/sysconfig/iptables
service iptables save
service iptables restart
好了,现在全部搞定了!!
另外由于宿主机映射到外网的端口是由网管分配,附一条转发本地ssh端口的iptables规则。
-A PREROUTING -p tcp -m tcp --dport 3000 -j REDIRECT --to-ports 22
以下为本文的参考链接,感谢这些作者,排名不分先后:
如何在 CentOS 7 / RHEL 7 终端服务器上安装 KVM
linux kvm 虚拟机 nat 网络 iptables 宿主机端口转发到虚拟机
CentOS7安装iptables防火墙
linux下用iptables做本机端口转发方法