热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用iptables实现KVM虚拟机的端口映射

1.KVM及Libvirt简介KVM(Kernel-basedVirtualMachine),是一个开源的系统虚拟化平台,是针对包含虚拟化扩展(IntelVT或AMD-V)的x86硬件(目前大部分主流的Intel或AMD处理器都支持虚拟化扩展)基于Linux系统提供虚拟化解决方案。KVM是基于Linux内核的,使用Li
1.    KVM及Libvirt简介

KVM(Kernel-basedVirtual Machine),是一个开源的系统虚拟化平台,是针对包含虚拟化扩展(Intel VT或AMD-V)的x86硬件 (目前大部分主流的Intel或AMD处理器都支持虚拟化扩展)基于Linux系统提供虚拟化解决方案。KVM是基于Linux内核的,使用Linux自身的调度器进行管理,相对于Xen,其核心源码要少很多。目前是基于Linux的虚拟化技术中最流行的平台,它也是RedHat公司私有云产品的虚拟化平台,在工业界也有很广泛的应用。

Libvirt是Linux上的一个虚拟化平台的管理库,支持对KVM,Xen,LXC等虚拟化软件的管理,为各种虚拟化平台提供统一的编程接口。当前流行的基于Libvirt库的虚拟化平台的管理软件非常的丰富多样,在后面的介绍中主要用到三种:

Virsh:全面的基于命令行的虚拟化平台的管理工具。

Virt-install: 进行虚拟机安装的基于命令行的工具。

Virt-clone:进行虚拟机快速克隆的基于命令行的工具。

2.    安装相关组件

2.1  准备工作
2.1.1       确定处理器是否支持虚拟化扩展

运行命令:

egrep'(vmx|svm)' /proc/cpuinfo

如果有对应的输出,则说明处理器有虚拟化扩展的支持,Intel处理器如果有虚拟化扩展的支持flags中会有vmx字段,AMD处理器则对应的有svm字段。

2.1.2       升级到支持KVM的Linux系统

支持KVM的Linux内核的最低版本是2.6.20,目前公司默认使用的rhel4版本的系统不支持KVM,安装之前最好先更换成rhel 6或者CentOS 6以后的版本。

2.2 安装KVM

1. 安装KVM及相应组件

运行命令:

yum install kvmlibvirt python-virtinst qemu-kvm virt-viewer

2.启动libvirt服务

运行命令:

/etc/init.d/libvirtdstart

3. 查看KVM服务是否正常安装

运行命令:

ls -l /dev/kvm

virsh -c qemu:///system list

如果有对应的/dev/kvm字符设备文件则说明KVM正常安装,如果virsh命令正常运行并且有对应的如下输出则表明libvirt相关组件服务正常。

Id    Name                    State

--------------------------------------------------------

2.3 安装配置VNC

虚拟机一般通过ssh等远程登录软件进行使用和管理,但是在虚拟机网络还没有配置或者网络出现故障的时候就只能通过虚拟化软件KVM对虚拟机进行访问和管理了。KVM支持两种原生的(不需要通过虚拟机网络)对虚拟机的访问方式,VNC和console。由于console的支持需要对虚拟机的镜像做一些改动,配置较复杂,并且不提供图形界面的传输。因此,一般都会选择配置KVM的VNC支持来进行虚拟机的管理。

VNC(VirtualNetwork Computing)是一款开源的非常优秀的远程控制工具软件。KVM中有内置的VNC的支持,使KVM的用户非常方便的管理KVM中虚拟机。

1.      安装配置VNC

运行命令:

yum install tigervnc-server

2.      编辑/etc/sysconfig/vncservers,增加一行:

VNCSERVERS="1:root"

设置VNC的password,运行命令:

3.      vncpasswd

按照提示进行密码设置。

3. 虚拟机安装

KVM虚拟机的数据都是存放在虚拟磁盘中的,虚拟机的运行,实际上是将虚拟磁盘加载到KVM中进行运行。对应的虚拟机的安装有两种方式:

1.      如果没有虚拟磁盘,那么需要先创建虚拟磁盘,然后使用iso镜像文件或相应的安装源在虚拟磁盘上进行相应的系统的安装。

2.      如果有了虚拟磁盘,并且之前在虚拟磁盘上安装有相应的系统,那么直接加载到KVM中进行运行即可。(虚拟机迁移以及快速加载使用这种方式)。

这里主要介绍方式1,利用virt-install工具进行虚拟机的安装。(方式2与方式1的步骤相同,只是相应的virt-install命令中的一些参数不同)

具体步骤如下:

1.      准备好系统镜像iso文件

/home/kvm/isoimages/rhel-server-6.1-x86_64-dvd.iso

2.      创建空的虚拟磁盘

KVM支持的虚拟磁盘主要有两种格式raw和qcow2。raw格式的磁盘比较耗费宿主机的磁盘空间,即创建多大的虚拟磁盘,就占用了多大的实际物理磁盘空间。qcow2格式是一种按需写入的虚拟磁盘格式,即虚拟机的镜像实际使用了多少磁盘空间,物理磁盘就分配多大的磁盘空间,直到达到最大的创建时指定的磁盘大小。raw格式读写速度比较快,qcow2读写速度相对要慢一些。qcow2是由qcow格式升级而来,在读写速度上已经有非常大的提升,与raw格式相差已经不大。如果不是对读写性能有非常苛刻的要求,一般都使用qcow2格式的虚拟磁盘,不仅节省物理磁盘空间,而且便于迁移。创建过程如下:

运行命令:

qemu-img create-f qcow2 /home/kvm/base.qcow2 20G

3.      安装虚拟机,运行如下命令:

virt-install \

--connectqemu:///system \

--virt-type kvm\

--name rhel_base\

--ram 2048 \

--vcpus=2 \

--diskpath=/home/kvm/base.qcow2,format=qcow2 \

--graphics vnc,listen=0.0.0.0,port=8025\

--cdrom/home/kvm/isoimages/rhel-server-6.1-x86_64-dvd.iso \

--networknetwork=default  \

--os-type linux\

--os-variantrhel6

注意几点:

(1)    --disk-path路径与之前创建的虚拟磁盘路径对应, format选qcow2。

(2)    --cdrom 路径与之前准备的iso镜像路径相同。

(3)    --network使用network=default,KVM虚拟机最主要使用bridge和nat两种网络模式,由于公司内部对平行的10段平行网络地址有严格的限制,因此我们使用nat网络模式。

(4)    --graphic中vnc的配置,最好使用8000-9000之间的端口,这样我们就可以从自己的办公电脑登录到虚拟机了。后面会从8025端口进行连接。

4.      VNC客户端登陆,完成系统的安装及配置

运行完上面的virt-install命令后,界面上又什么都没有了,这是因为我们使用的是没有图形界面的Linux系统,不支持多窗口的显示。我们需要使用VNC客户端进行连接,然后完成安装过程。

在自己的办公电脑上安装VNC客户端,VNC的服务器和客户端都有多种,根据我之前安装的tiger-vncserver,使用TightVNC客户端能正常使用。其下载地址如下:

http://www.tightvnc.com/download.php

安装好客户端以后,打开客户端,在远程机器地址栏输入:宿主机器名:8025,就可以登录到虚拟机,然后我们就能在客户端中看到未完成的安装过程,按照系统的安装步骤,完成安装即可。

5.      安装完虚拟机后进行网络配置

将网络配置成DHCP模式,在我安装的rhel6版本的系统中,网络配置文件/etc/sysconfig/network-scripts/ifcfg-eth0如下:

DEVICE="eth0"

BOOTPROTO="dhcp"

HWADDR="52:54:00:3A:59:36"

NM_COnTROLLED="yes"

OnBOOT="yes"

6.      重启虚拟机网络,运行命令:

service network restart

这样,整个虚拟机的安装就告一段落了,此时虚拟机与宿主机之间能够自由通信,虚拟机也能正常访问宿主机所能访问到的网络,但是宿主机以外的外部访问不能进入虚拟机。

4. 完成端口映射配置

由于我们使用的是NAT网络模式,要想宿主机以外的机器能顺利访问虚拟机,就只能通过端口映射的方式进行了。端口映射的大体过程如下:

要完成以上的映射过程,就需要我们基于Linuxiptables建立相应的转发映射规则,将任意的发往宿主机的8322端口的流量都转发给虚拟机的80端口。我们需要在宿主机中运行以下两条命令:

iptables -t nat-A PREROUTING -p tcp --dport 8322 -j DNAT --to 192.168.122.219:22

iptables -AFORWARD -d 192.168.122.219/32 -p tcp -m state --state NEW -m tcp --dport 22 -jACCEPT

以上命令中,虚拟机的IP为192.168.122.219。两条iptables规则的意思大致如下:

1.      发往宿主机的8322端口的流量,全部向虚拟机192.168.122.219的22端口转发。

2.      允许转发给虚拟机192.168.122.219的22端口的流量通过宿主机转发出去。

完成上面的步骤以后,我们就可以在自己的办公电脑上通过ssh客户端软件登录到虚拟机了。例如,使用putty进行登录。

         如果我们要在虚拟机上部署其他的网络服务,只需要对相应的端口进行映射,就可以正常的使用虚拟机中的服务。

5. 虚拟机的管理 5.1 Virsh

在没有图形界面的宿主机中,对KVM虚拟化平台进行管理最好的方式就是virsh工具。在安装完KVM的宿主机上运行命令:

virsh

便可登录到virsh管理界面中,virsh是基于libvirt的虚拟机管理工具,其中中提供各种各样的管理虚拟化平台的命令,功能非常强大。而libvirt管理的虚拟机主要是通过相应的XML文件进行描述的,要改变对应虚拟机的配置只需要修改其对应的配置文件即可。例如在我的试验的宿主机中:

在宿主机上,目前运行着3个虚拟机。

对应的三个虚拟机,我们的系统中有对应的三个xml配置文件,配置着虚拟机的各种属性。

5.2 virt-clone简介

在日常的运维或者开发过程中,配置程序运行的环境,往往是非常繁琐的一个过程。我们如果用虚拟机进行相应服务的搭建,那么我们可以通过虚拟机的克隆,能快速创建一完全一样的,拥有相同运行环境的虚拟机。virt-clone为KVM中运行的虚拟机提供了快速克隆的机制。和virsh,virt-install一样,它也是一个命令行的工具,使用起来比较简单。具体的使用方法可以问问man,运行命令:

man virt-clone


推荐阅读
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 解决U盘安装系统后无法重启的问题
    本文详细探讨了运维新手常遇到的U盘安装系统后无法正常重启的问题,提供了从问题分析到具体解决方案的完整步骤。通过理解Boot Loader的工作原理和正确配置启动项,帮助用户顺利解决问题。 ... [详细]
  • 选择适合生产环境的Docker存储驱动
    本文旨在探讨如何在生产环境中选择合适的Docker存储驱动,并详细介绍不同Linux发行版下的配置方法。通过参考官方文档和兼容性矩阵,提供实用的操作指南。 ... [详细]
  • 本文详细介绍了如何通过RPM包在Linux系统(如CentOS)上安装MySQL 5.6。涵盖了检查现有安装、下载和安装RPM包、配置MySQL以及设置远程访问和开机自启动等步骤。 ... [详细]
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
author-avatar
手机用户2502860581
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有