NAT 与仅主机网络
NAT 与仅主机(host-only / isolated)是两种非桥接的网络模式:NAT 让虚机经宿主做地址转换出网,外部要访问虚机就得配置端口转发;仅主机网络只在宿主与虚机之间互通,天然隔离,适合实验与取证环境。libvirt 默认提供的 default 网络就是 NAT 模式。
基本信息
| 默认 NAT 网络 | libvirt 的 default 网络使用 virbr0,网段常见 192.168.122.0/24 |
|---|---|
| 出网方式 | 经宿主机做源地址转换(SNAT) |
| 外部访问虚机 | 需要端口转发(DNAT)或宿主侧代理 |
| 仅主机网络 | 不提供外网出口,只有宿主可达 |
| 管理工具 | virsh net-* 系列命令,或 virt-manager |
| 持久化 | 手工写入的 iptables 规则不会随重启保存 |
模式对比
| 模式 | 虚机出网 | 外部访问虚机 | 典型用途 |
|---|---|---|---|
| NAT | 经宿主转换出网 | 需端口转发 | 开发机、单机实验 |
| 仅主机 | 不提供 | 仅宿主可访问 | 隔离实验、取证环境 |
| 桥接 | 直接走物理网络 | 同网段直接可达 | 需要独立 IP 的服务器场景 |
| DNS 与 DHCP | 由虚拟网络提供 | 由虚拟网络提供 | 依赖外部网络 |
典型使用场景
- 单机开发环境:虚机需要访问外网下载依赖
- 隔离实验:虚机与宿主互通但不接触外网
- 取证与分析环境需要严格网络隔离
- 临时验证服务:把宿主端口映射给外部访问
- 搭建多虚机互联的实验拓扑
为 NAT 网络加端口转发
为 NAT 网络加端口转发
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 \
-j DNAT --to 192.168.122.10:22 # 把宿主 2222 转发到虚机 22
sudo iptables -t nat -L POSTROUTING -n | head -5 # 看 NAT 出网规则是否存在
virsh net-list --all # 查看虚拟网络状态
virsh net-dumpxml default | grep -E 'forward|ip address' # 看是否启用 forward
# 注意:手工规则不随宿主重启保存,也不随 libvirt 网络事件自动维护NAT 网络的细节最好用 net-* 命令管理:手工往 iptables 里加规则,在 libvirt 重启网络(net-destroy 后 net-start)时会被清理掉,表现为“早上还通、重启网络后就不通”。需要长期生效的转发规则应写进网络定义或宿主持久化配置。
仅主机网络没有出口:需要装包或更新时,要么临时再加一块 NAT 网卡,要么在宿主上做代理,别指望它自己连上外网。