在服务器运维和虚拟化应用中,利用一台拥有公网IP的母机(宿主机)搭建NAT网络,来创建多台没有独立公网IP的虚拟机(俗称“NAT小鸡”),是一种非常经济且高效的做法,这种方法不仅能极大节省宝贵的公网IP地址资源,还能通过端口转发的方式,让内网虚拟机对外提供服务,本文将以CentOS系统为例,详细介绍如何一步步搭建和管理NAT小鸡,涵盖环境准备、网络配置、虚拟机创建及端口转发等核心环节。

环境准备与基础组件安装
在开始之前,请确保您拥有一台运行CentOS 7或CentOS 8系统的服务器,并且该服务器具备以下条件:
- 硬件支持虚拟化:CPU需要支持Intel VT-x或AMD-V技术,可以通过命令
lscpu | grep Virtualization来检查,如果输出中包含VT-x或AMD-V,则表示支持。 - 拥有一个公网IP地址:这是母机的基础,用于作为所有内网小鸡访问外网的出口。
- 具备root权限:后续所有操作均需要管理员权限。
满足条件后,我们首先需要安装KVM虚拟化所需的核心软件包,KVM(Kernel-based Virtual Machine)是Linux内核集成的全虚拟化解决方案,而libvirt则是用于管理KVM等虚拟化技术的工具集。
打开终端,执行以下命令来安装必要的组件:
# 更新系统软件包 yum update -y # 安装KVM、libvirt、网络工具等 yum install -y qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-manager bridge-utils
安装完成后,启动libvirtd服务并设置其开机自启,这是管理虚拟机和网络的核心守护进程。
# 启动libvirtd服务 systemctl start libvirtd # 设置libvirtd服务开机自启 systemctl enable libvirtd
至此,基础环境已经准备就绪。
配置NAT网络
libvirt在安装后会默认创建一个名为default的NAT网络,其虚拟网桥为virbr0,IP地址段通常为168.122.0/24,对于大多数场景,我们可以直接使用这个默认网络,也可以根据需要进行自定义配置。
1 查看默认NAT网络
使用virsh命令来查看现有的网络列表:
virsh net-list --all
您会看到名为default的网络,状态可能为inactive(未激活),如果未激活,我们需要启动它。
2 编辑与启动NAT网络
使用 virsh net-edit default 命令可以编辑这个网络的详细配置,这个命令会调用一个文本编辑器(如vi)打开其XML配置文件,一个典型的NAT网络配置如下所示,我们重点关注 <forward mode="nat"/>、<ip> 和 <dhcp> 部分。

<network>
<name>default</name>
<uuid>...</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='...'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
下表解释了这些关键字段的作用:
| 配置元素 | 作用说明 |
|---|---|
<forward mode='nat'/> |
定义网络的转发模式,nat 表示网络地址转换,是小鸡访问外网的关键。 |
<bridge name='virbr0'/> |
定义虚拟网桥的名称,所有小鸡的虚拟网卡都将连接到这个网桥上。 |
<ip address='...'> |
定义网桥的IP地址,也就是所有NAT小鸡的默认网关。 |
<dhcp> |
定义DHCP服务,自动为连接到此网络的小鸡分配IP地址。 |
<range start='...' end='...'/> |
定义DHCP分配的IP地址池范围。 |
检查配置无误后,保存并退出编辑器,启动这个网络,并设置为开机自启:
# 启动default网络 virsh net-start default # 设置default网络开机自启 virsh net-autostart default
执行后,可以使用 ip addr show virbr0 命令查看网桥virbr0是否已经成功获取到IP地址。
创建NAT小鸡
网络环境配置好后,我们就可以开始创建第一台NAT小鸡了,创建虚拟机需要操作系统的镜像文件(ISO格式)或预先准备好的磁盘镜像(qcow2格式)。
这里我们以使用virt-install命令行工具,通过ISO镜像安装一台CentOS 7的小鸡为例。
-
上传ISO镜像:将CentOS的ISO镜像文件上传到母机的某个目录,
/var/lib/libvirt/images/。 -
执行创建命令:
virt-install \ --name nat-chick-01 \ --memory 1024 \ --vcpus 1 \ --disk path=/var/lib/libvirt/images/nat-chick-01.qcow2,size=20,format=qcow2 \ --cdrom /var/lib/libvirt/images/CentOS-7-x86_64-Minimal-2009.iso \ --network network=default \ --graphics spice \ --noautoconsole
命令参数解释:
--name nat-chick-01: 指定虚拟机的名称。--memory 1024: 分配1024MB内存。--vcpus 1: 分配1个虚拟CPU核心。--disk ...: 创建一个20GB大小、qcow2格式的虚拟磁盘。--cdrom ...: 指定安装介质为ISO镜像文件。--network network=default: 这是核心参数,将虚拟机的网卡连接到我们之前配置的名为default的NAT网络。--graphics spice: 启用SPICE图形协议,方便远程连接图形界面进行安装。--noautoconsole: 不自动连接到虚拟机的控制台。
创建完成后,您可以使用 virt-manager(图形界面)或 virsh console nat-chick-01(命令行)来连接虚拟机,完成操作系统的安装,安装过程中,网络配置选择DHCP即可,安装系统后,小鸡会自动从168.122.2 到 168.122.254 的范围内获取一个内网IP。

进入小鸡系统后,可以通过 ping baidu.com 来测试是否能访问外网,如果可以,说明NAT网络搭建成功。
配置端口转发
NAT模式下,外网无法直接访问内网小鸡,要实现外网访问,需要在母机上设置端口转发,我们希望将母机的2222端口转发到小鸡nat-chick-01(假设其内网IP为168.122.50)的22端口(SSH端口)。
CentOS 7/8 默认使用 firewalld 作为防火墙管理工具,配置端口转发如下:
# 1. 开启IP地址伪装(通常libvirt的NAT网络已自动设置,但检查一下更保险) firewall-cmd --permanent --add-masquerade # 2. 添加端口转发规则 firewall-cmd --permanent --add-forward-port=port=2222:proto=tcp:toaddr=192.168.122.50:toport=22 # 3. 重载防火墙配置使规则生效 firewall-cmd --reload
配置完成后,您就可以通过 ssh root@<母机公网IP> -p 2222 来连接到内网的NAT小鸡了,对于Web服务(80/443端口)或其他服务,原理相同,只需修改对应的端口号即可。
相关问答FAQs
我的NAT小鸡创建后无法连接外网,该怎么办?
解答: 这是一个常见问题,可以按照以下步骤进行排查:
- 检查NAT网络状态:在母机上执行
virsh net-list,确保default网络处于active状态。 - 检查小鸡IP配置:登录小鸡,使用
ip addr或ifconfig查看是否获取到168.122.x网段的IP地址,使用ip route查看默认网关是否为168.122.1。 - 检查DNS配置:在小鸡内查看
/etc/resolv.conf文件,确保有正确的DNS服务器地址(如114.114.114或8.8.8)。 - 检查母机防火墙和转发:在母机上,执行
sysctl net.ipv4.ip_forward,确保返回值为1(表示开启),检查firewalld规则,确保没有阻止FORWARD链,可以尝试临时关闭防火墙systemctl stop firewalld测试是否为防火墙问题,若是,再针对性地添加规则。 - Ping测试:在小鸡内
ping 192.168.122.1(网关),通则说明与母机网络连接正常,再ping 8.8.8.8,不通则说明是NAT转发或DNS问题。
如何让外网通过域名访问我NAT小鸡上的网站?
解答: 要实现通过域名访问,需要结合端口转发和DNS解析两步操作。
- 端口转发:按照上文第四部分的方法,在母机上设置端口转发,将母机的
80端口转发到小鸡168.122.50的80端口,命令为:firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=192.168.122.50:toport=80,然后重载防火墙。 - DNS解析:登录您的域名提供商管理后台,添加一条A记录(或CNAME记录),将您的域名(如
www.yourdomain.com)解析到母机的公网IP地址。 - 等待生效:DNS解析全球生效需要一段时间(通常是几分钟到几小时不等),生效后,用户在浏览器访问
www.yourdomain.com时,请求会先到达您的母机,然后通过防火墙的端口转发规则,被精准地导向内网小鸡的Web服务,从而实现域名访问。