答案:配置Linux虚拟机NAT网络需通过libvirt创建或启用default网络,确保虚拟机连接至virbr0网桥并获取私有IP,宿主机开启IP转发和防火墙规则,实现虚拟机经NAT访问外网。

在Linux上配置虚拟机NAT网络,核心在于让虚拟机通过宿主机访问外部网络,同时保持虚拟机与宿主机内部网络相对隔离。这通常涉及到宿主机的网络管理工具(如
libvirt
在Linux环境下,配置虚拟机NAT网络,我们主要以KVM/QEMU为例,因为它在Linux上是原生且功能强大的虚拟化解决方案。如果你使用VirtualBox,其配置会更直观,在虚拟机设置中选择“网络”->“连接方式”为“NAT”即可。
对于KVM/QEMU,通常通过
libvirt
libvirt
default
检查或启用默认NAT网络: 打开终端,首先检查
libvirt
virsh net-list --all
你可能会看到一个名为
default
active
查看或编辑NAT网络定义: 如果
default
virsh net-edit default
这会打开一个文本编辑器显示网络的XML配置。一个典型的NAT网络配置看起来会是这样:
<network>
<name>default</name>
<uuid>...</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<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'/>
<bridge name='virbr0' .../>
virbr0
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
libvirt
你可以根据需要调整IP地址范围,但通常默认设置已经足够。保存并退出编辑器。
启动或激活网络: 如果网络状态不是
active
virsh net-start default virsh net-autostart default # 设置开机自启动
将虚拟机连接到NAT网络:
virt-manager
virt-manager
default
virtio
virsh
virsh edit <vm_name>
<interface type='network'>
<interface type='network'> <mac address='52:54:00:xx:xx:xx'/> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </interface>
<source network='default'/>
default
libvirt
启动虚拟机并验证网络: 启动你的虚拟机。进入虚拟机内部,检查其网络配置。如果虚拟机配置为DHCP客户端(大多数Linux发行版默认如此),它应该会自动从
libvirt
192.168.122.x
192.168.122.1
ping 8.8.8.8
这个过程听起来可能有些繁琐,但一旦
default
在选择虚拟机网络模式时,NAT(网络地址转换)和桥接(Bridge)是最常见的两种。它们各自有其适用场景和优缺点,我通常会根据具体需求来权衡。
NAT网络(Network Address Translation)
优点:
缺点:
桥接网络(Bridged Network)
优点:
**缺点:
我的选择偏好:
我个人在日常开发和测试中,如果只是想让虚拟机能够上网,并且不需要外部访问,NAT网络是我的首选。它简单、安全、可靠。但如果我需要搭建一个内部服务,让团队成员能够访问,或者进行网络攻防实验,那么桥接网络的优势就凸显出来了,虽然配置上可能需要多花点心思。
虚拟机配置了NAT网络后,却无法访问外部网络,这确实是让人头疼的问题。我遇到过不少次,通常都是一些细节没到位。这里整理一些常见的排查思路和解决办法,希望能帮你快速定位问题。
检查宿主机libvirt
virsh net-list --all
确保你的NAT网络(通常是
default
active
virsh net-start default
virsh net-autostart default
virsh net-edit default
<forward mode='nat'/>
<bridge name='virbr0'/>
<ip ...>
检查虚拟机网卡配置:
virt-manager
virsh edit <vm_name>
<interface type='network'>
<source network='default'/>
ip a
ifconfig
192.168.122.x
libvirt
192.168.122.1
ip route
cat /etc/resolv.conf
sudo systemctl restart NetworkManager
sudo service networking restart
宿主机防火墙问题: 这是另一个常见的“坑”。宿主机上的防火墙可能会阻止NAT转发。
firewalld
firewalld
libvirt
firewalld
sudo systemctl stop firewalld
libvirt
libvirt
ufw
ufw
iptables
libvirt
iptables
iptables -t nat -L
iptables -L -v
POSTROUTING
FORWARD
iptables
libvirt
宿主机IP转发是否开启: NAT功能依赖于宿主机内核的IP转发功能。
cat /proc/sys/net/ipv4/ip_forward
0
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
/etc/sysctl.conf
net.ipv4.ip_forward = 1
sudo sysctl -p
DNS解析问题: 如果能
ping 8.8.8.8
ping google.com
/etc/resolv.conf
8.8.8.8
114.114.114.114
排查时,我通常会从虚拟机内部开始,先确认它自身网络配置是否正确,然后逐步向外,检查宿主机的网络服务、防火墙和转发设置。这个过程需要耐心和细致。
在NAT模式下,虚拟机隐藏在宿主机之后,外部网络无法直接访问到它。但如果虚拟机内部运行着Web服务器、SSH服务或其他应用,我们确实需要让外部(包括宿主机所在的局域网)能够访问。这时,就需要用到端口转发(Port Forwarding),它本质上是在宿主机上设置一个规则,将宿主机某个端口收到的连接请求,转发到虚拟机内部的特定IP和端口。
对于KVM/QEMU,实现端口转发主要有两种方式:通过
libvirt
iptables
iptables
方法一:通过libvirt
这种方法是将端口转发规则集成到
libvirt
libvirt
iptables
编辑NAT网络定义:
virsh net-edit default
找到
<network>
<forward mode='nat'/>
<ip ...>
<portforward>
添加端口转发规则示例: 假设你的虚拟机IP是
192.168.122.100
80
8080
80
<network>
<name>default</name>
<!-- ... 其他配置 ... -->
<forward mode='nat'/>
<portforward name='web-server' proto='tcp'>
<port start='8080' end='8080'/>
<target type='ipv4' address='192.168.122.100' port='80'/>
</portforward>
<!-- ... 其他配置 ... -->
</network>name='web-server'
proto='tcp'
tcp
udp
all
<port start='8080' end='8080'/>
8080
<target type='ipv4' address='192.168.122.100' port='80'/>
保存并重启网络: 保存XML文件。然后需要停止并重新启动
default
virsh net-destroy default virsh net-start default
注意: 停止网络会导致所有连接到该网络的虚拟机暂时断网。
方法二:直接使用iptables
这种方法直接在宿主机上添加
iptables
libvirt
确认IP转发已开启: 如果未开启,请参照上一节的方法开启:
net.ipv4.ip_forward = 1
添加iptables
192.168.1.10
192.168.122.100
8080
80
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.122.100:80 sudo iptables -A FORWARD -p tcp -d 192.168.122.100 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
nat
PREROUTING
8080
192.168.122.100:80
filter
FORWARD
192.168.122.100
80
FORWARD
DROP
使iptables
iptables
netfilter-persistent
sudo apt-get
以上就是Linux如何配置虚拟机NAT网络的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号