4.4.3 KVM使用NAT模式网络

前言:之前连载过 4.4.2 使用网桥模式(bridge networking mode) 一文,其实使用NAT的情况也蛮多的,不需要建物理的bridge配置会更加方便,所以现在把KVM NAT也连载出来。(两个脚本qemu-ifup-NAT和qemu-ifdown-NAT,请到github下载:https://github.com/smilejay/kvm-book/tree/master/scripts

NAT(Network Addresss Translation ,网络地址转换),属于广域网接入技术的一种,它将内网地址转化为外网的合法IP地址,它被广泛应用于各种类型的Internet接入方式和各种类型的网络之中。NAT将来自内网IP数据包的包头中的源IP地址转换为一个外网的IP地址。众所周知,IPv4的地址资源已几近枯竭,而NAT使内网的多个主机可以共用一个IP地址接入网络,这样有助于节约IP地址资源,这也是NAT最主要的作用。另外,通过NAT访问外部网络的内部主机,其内部IP对外是不可见的,这就隐藏了NAT内部网络拓扑结构和IP信息,也就能够避免内部主机受到外部网络的攻击。客观事物总是有正反两面性的,没有任何技术是十全十美的。NAT技术隐藏了内部主机细节从而提高了安全性,但是如果NAT内的主机作为Web或数据库服务器需接受来自外部网络的主动连接,这时NAT就表现出了局限性,不过,可以在拥有外网IP的主机上使用iptables等工具实现端口映射,从而让外网对这个外网IP的一个端口的访问被重新映射到NAT内网的某个主机的相应端口上去。
在QEMU/KVM中,默认使用IP伪装的方式去实现NAT,而不是使用SNAT(Source-NAT)或DNAT(Destination-NAT)的方式。图4-6展示了KVM中的NAT模式网络的结构图,宿主机在外网的IP是10.10.10.190,其上运行的各个客户机的IP属于内网的网络段192.168.122.0/24。
kvm-nat-mode
图4-6 KVM中的NAT模式网络
在KVM中配置客户机的NAT网络方式,需要在宿主机中运行一个DHCP服务器给宿主机分配NAT内网的IP地址,可以使用dnsmasq工具来实现。在KVM中,DHCP服务器为客户机提供服务的基本架构如图4-7所示。
dnsmasq-dhcp
图4-7 宿主机中的dnsmasq为客户机提供DHCP服务
通过下面几步可以使客户机启动并以NAT方式配置好它的网络。
1) 检查配置宿主机内核编译的配置,将网络配置选项中与NAT相关的选项配置好,否则在启动客户机使用NAT网络配置时可能会遇到如下错误提示,因为无法按需加载“iptable_nat”和“nf_nat”等模块。

2) 安装必要的软件包:bridge-utils、iptables和dnsmasq等。其中bridge-utils包含管理bridge的工具brctl(在4.5.2节中已使用过),iptables是对内核网络协议栈中IPv4包的过滤工具和NAT管理工具,dnsmasq是一个轻量级的DHCP和DNS服务器软件。当然,如有其他满足类似功能的软件包,也可以选用。在宿主机中,查看所需软件包情况,如下:

3) 准备一个为客户机建立NAT用的qemu-ifup脚本及关闭网络用的qemu-ifdown脚本。这两个脚本中的$1(传递给它们的第一个参数)就是在客户机中使用的网络接口在宿主机中的虚拟网络名称(如tap0、tap1等)。
其中,在启动客户机时建立网络的脚本示例(/etc/qemu-ifup-NAT)如下,主要功能是:建立bridge,设置bridge的内网IP(此处为192.168.122.1),并且将客户机的网络接口与其绑定,然后打开系统中网络IP包转发的功能,设置iptables的NAT规则,最后启动dnsmasq作为一个简单的DHCP服务器。

当然,对于这两个脚本中实现的功能,可以根据实际情况进行修改,另外,手动来完成这样的功能而不依赖于这两个脚本一样是可行的。
4) 当启动客户机时,使用上面提到的启动脚本。创建客户机的qemu-kvm命令行如下:
qemu-system-x86_64 rhel6u3.img -m 1024 -smp 2 -net nic -net \ tap,script=/etc/qemu-ifup-NAT,downscript=/etc/qemu-ifdown-NAT
在启动客户机后,检查脚本中描述的宿主机中的各种配置生效的情况,如下:

5) 在客户机中,通过DHCP动态获得IP,并且检查网络是否畅通,如下:

从上面的命令行输出可知,客户机可以通过DHCP获得网络IP(192.168.122.0/24子网中),其默认网关是宿主机的bridge的IP(192.168.122.1),并且可以ping通网关(192.168.122.1)和子网外的另外一个主机(192.168.199.103),说明其与外部网络的连接正常。
另外,客户机中的DNS服务器默认配置为宿主机(192.168.122.1),如果宿主机没有启动DNS服务,则可能导致在客户机中无法解析域名。这时需要将客户机中/etc/resolv.conf修改为与宿主机中一致可用的DNS配置,然后就可以正常解析外部的域名(主机名)了,如下:

6) 添加iptables规则进行端口映射,让外网主机也能访问客户机。
到步骤5)为止,客户机已可以正常连通外部网络,但是外部网络(除宿主机外)无法直接连接到客户机。其中一个解决方案是,在宿主机中设置iptables的规则进行端口映射,使外部主机对宿主机IP的一个端口的请求转发到客户机中的某一个端口。
在宿主机中,查看网络配置情况,然后iptables设置端口映射将如下,将宿主机的80端口(常用于HTTP服务)映射到客户机的80端口。

在客户机中,编辑一个在HTTP服务中被访问的示例文件(/var/www/html/index.html,Apache默认根目录为/var/www/html),然后启动Apache服务。
[root@kvm-guest ~]# cat /var/www/html/index.html
This an index page demo running on apache in kvm-guest.
[root@kvm-guest ~]# service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for kvm-guest
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
在外部网络某主机上测试连接宿主机(192.168.82.0)的80端口,就会被映射到客户机(192.168.122.140)中的80端口,如图4-8所示,外部网络已经可以正常访问在NAT内网中的那台客户机80端口上的HTTP服务了。

图4-8 外部网络主机访问宿主机而被映射到客户机中相应的端口
在上面的示例中,NAT的配置涉及的一些iptables配置规则仅用于实验演示,在实际生产环境中需要根据实际情况进行更细粒度的配置,如果将访问规则和数据包转发规则设置得过于宽松可能会带来网络安全方面的隐患。

master

Stay hungry, stay foolish.

发表评论

邮箱地址不会被公开。 必填项已用*标注

*