热门标签 | 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


推荐阅读
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 随着Linux操作系统的广泛使用,确保用户账户及系统安全变得尤为重要。用户密码的复杂性直接关系到系统的整体安全性。本文将详细介绍如何在CentOS服务器上自定义密码规则,以增强系统的安全性。 ... [详细]
  • CentOS7通过RealVNC实现多人使用服务器桌面
    背景:公司研发团队通过VNC登录到CentOS服务器的桌面实现软件开发工作为防止数据外泄,需要在RealVNC设置禁止传输文件、访问粘贴板等策略过程&# ... [详细]
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • Node.js在服务器上的多种部署策略
    本文探讨了Node.js应用程序在服务器上部署的几种有效方法,包括使用Screen、PM2以及通过宝塔面板进行简易管理。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
  • 本文介绍了SELinux的两种主要工作模式——强制模式和宽容模式,并提供了如何在CentOS 7中正确启用和配置SELinux的方法,以及在遇到登录问题时的解决策略。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文介绍了Linux操作系统的核心组成部分——内核及其版本分类,以及市面上常见的几种Linux发行版,旨在为初学者提供一个清晰的学习路径。 ... [详细]
  • 如何处理PHP缺少扩展的问题
    本文将详细介绍如何解决PHP环境中缺少扩展的问题,包括检查当前环境、修改配置文件以及验证修改是否生效的具体步骤,帮助开发者更好地管理和使用PHP扩展。 ... [详细]
  • Kafka入门指南
    本文将详细介绍如何在CentOS 7上安装和配置Kafka,包括必要的环境准备、JDK和Zookeeper的配置步骤。 ... [详细]
  • 网络安全实验:Telnet与SSH服务对比及抓包分析
    本实验旨在对比Telnet和SSH两种安全通信协议的服务差异,并通过搭建服务器和使用Wireshark抓包工具进行详细分析。 ... [详细]
  • 本文介绍了Linux系统中的expect命令及其在自动化任务中的应用,同时探讨了Python中的pexpect模块如何实现类似功能。 ... [详细]
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社区 版权所有