因为经常能弄到的服务器都是 1 个 IP 的 . 但又想用 windows 怎么办呢 ? 其实可以通过安装虚拟机的方式来实现 . 今天主要就来介绍下 , 就一个 IP 的时候 , 怎么安装 windows 虚拟机 , 并且通过 NAT 的方式来实现端口转换 .
建议安装 Centos6. Centos7 的 firewalld 有部分命令还是需要用到 iptables 命令来实现端口转发 , 没有 centos6 那么方便 . 以下的教程是基于 Centos6.
另外 , 请不要在 VPS 上进行任何尝试 …. 一般被抓到玩虚拟机就是被封号 ..
第一步 : 安装环境
yum -y install qemu-kvm libvirt python-virtinst bridge-utils avahi dmidecode virt-viewer virt-install
第二步 : 配置桥接网络
先拷贝一份目前的网络配置文件 , 命名为 ifcfg-br0
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-br0
配置 ifcfg-br0. 首先确保下面两行的 . 如果没有的话 , 就在末尾加入就可以了 . 其他的信息不需要动
TYPE=Bridge DEVICE=br0
修改原网卡的配置文件 ifcfg-eth0. 只需要修改下面两行信息 , 如果没有 , 就在末尾加入 , 其他也不需要动 .
BRIDGE=br0 NM_CONTROLLED=no
重启下网络
service network restart
第三步 : 修改一些配置文件
开启 VNC, 方便使用 vnc 进行连接安装
vim /etc/libvirt/qemu.conf
把 vnc_listen = "0.0.0.0"
前面的注释 # 去掉
启动 libvirt 等相关服务 .
/etc/init.d/messagebus restart /etc/init.d/avahi-daemon restart /etc/init.d/libvirtd restart
开启 IPv4 的转发
vim /etc/sysctl.conf
把 net.ipv4.ip_forward = 1
值原来是 0, 改成 1
执行命令 sysctl -p
使配置生效
关闭 selinux
vim /etc/selinux/config
修改为 :SELINUX=disabled
重启生效 .
第四步 : 准备好系统的 ISO
带 virtio 驱动的 windows 的 ISO 可以在这里下载到 : https://soft.91yun.org/Windows/virtio
( 需要梯子 , 你懂的 )
第五步 : 创建系统需要的硬盘文件
qemu-img create -f qcow2 /home/kvm/win10.qcow2 100G
win10.qcow2
是文件名 , 你可以自行修改 , 后面安装命令会用到
100G
是硬盘大小 , 你可以自行修改
第六步 : 使用 virsh-install 开始安装 windows
virt-install \ --hvm \ --name win10 \ --ram 2048 \ --vcpus=2 \ --cpu host \ --accelerate \ --network network=default,model=virtio \ --cdrom=/home/iso/win10.iso \ --disk path=/home/kvm/win2010.qcow2,format=qcow2,sparse=true,cache=none,bus=virtio \ --graphics vnc,listen=0.0.0.0,port=5901,password=91yun \ --os-type=windows \ --autostart
以下是你需要自行修改的参数说明 :
--name win10
这里的 win10 是虚拟机的名字 , 你可以自行修改
--ram 2048
给虚拟机 2048M 内存 (2G), 你可以自行修改
--vcpus=2
给虚拟机分配 2 个 CPU 核心 , 你可以自行修改
--cpu host
这个选项是安装 windows10 专用的 , 因为 windows 不支持很多老的虚拟化的 CPU, 如果安装 windows10 使用了这个选项依然安装的时候蓝屏 , 就把这个选项改成 --cpu core2duo
就是使用 core2duo 的 cpu 配置 . 如果是老的 win2008,win2012 或者 linux, 可以不需要这个选项 .
--cdrom=/home/iso/win10.iso
指定安装的 iso 地址 . 请自行修改
--disk path=/home/kvm/win10.qcow2
在第五步生成的硬盘文件地址 , 请自行修改
--graphics vnc,listen=0.0.0.0,port=5901,password=91yun
这里的 5901 是虚拟机的 vnc 端口 , 每个虚拟机请分配不同的端口 . password 是设置 vnc 连接使用的密码 , 请自行修改 .
--os-type=windows
如果你安装的是 linux 就把这个改成 linux 就可以了
第七步 : 通过 VNC 来安装系统
vnc 的下载地址 :https://www.realvnc.com/en/connect/download/viewer/
输入你的 服务器地址 : 端口
即可访问你的虚拟机了
如果连不上虚拟机 , 请确认你的 vnc 端口已经在防火墙里面通过 . 通过命令是 :iptables -A INPUT -p tcp --dport 5901 -j ACCEPT
虚拟机安装完系统第一次重启的时候 , 不会自动起来 , 你需要在服务器上执行 virsh start win10
来唤醒虚拟机 . 这个 win10 就是你上面安装代码设置的 –name
第八步 : 配置防火墙 iptables
执行
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE service iptables save service iptables restart
如果你不需要端口转发 , 那么你执行完这个 iptables 命令 , 你的 windows 虚拟机就已经可以上网了 .
如果你需要端口转发 , 比如需要通过 3389 端口使用远程桌面连接连接你的 windows 虚拟机 . 那么你需要执行以下代码 .
NAT 端口转发设置
首先执行 :
iptables -I FORWARD -o virbr0 -d 192.168.122.111 -j ACCEPT
需要注意的是 , 这里的 192.168.122.111 是你虚拟机的 IP, 如果你需要端口转发 , 建议在虚拟机里面设置成固定 IP, 而不是 dhcp 获取 . 否则你虚拟机 ip 变了就又连不上了 .
下面是一个代码段 , 有要开放的端口都可以依次设置 . 比如要开放 3389, 那么 iptables 命令就是 : 192.168.122.111 是虚拟机的 ip
iptables -A INPUT -p tcp --dport 3389 -j ACCEPT iptables -t nat -A PREROUTING -p tcp -m tcp -i br0 --dport 3389 -j DNAT --to-destination 192.168.122.111:3389 service iptables save service iptables restart
如果你想把服务器的 2222 端口转发到虚拟机的 22 端口 . 那么就执行
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT iptables -t nat -A PREROUTING -p tcp -m tcp -i br0 --dport 2222 -j DNAT --to-destination 192.168.122.111:22 service iptables save service iptables restart
ok, 这样你的端口就转发成功了 .
最后 , 虚拟机管理 virsh 命令的常用使用
virsh start 虚拟机
: 启动虚拟机 , 比如 virsh start win10
virsh destroy 虚拟机
: 强制关闭虚拟机 , 比如 virsh destroy win10
最后的最后 : 常见问题解答
如果你通过 vnc 连接虚拟机的时候 ,vnc 闪退 .
虚拟机的属性设置 (properties)>>Expert>>ColorLevel 设置成 full
如果你通过 vnc 连接虚拟机的时候 ,vnc 显示 “ZlibInStream:Inflate Failed/ZlibInStream :exceeded bytesIn” 错误
调整画面质量即可解决 :Options -> General -> Picture quality -> Low
如果还有问题 , 欢迎在评论区提出 , 我会不断更新这个 FAQ.
大佬好,提个小建议。有关禁用SELinux,你的方法可能需要重启才能生效,而且是永久生效的,如果想不重启即刻生效可以使用setenforce 0来解决,这种方法即刻生效,但重启后会失效,可以搭配你的方法一起使用。可能有错,欢迎指出。
你说的没错O(∩_∩)O~~