在现代 IT 环境中,物理机与虚拟机(VM)的网络配置是确保系统间高效通信与数据传输的关键。无论是为了测试、开发,还是生产部署,正确配置网络能够提升系统性能、增加灵活性,并保障安全性。本文将详细介绍如何在Ubuntu 20.04 LTS系统下,针对常见的虚拟化技术(如 KVM、VirtualBox 和 VMware)配置物理机与虚拟机之间的网络连接。
在开始配置物理机和虚拟机之间的网络之前,了解以下基本概念至关重要:
桥接网络 (Bridged Networking):虚拟机直接连接到物理网络,就像一个独立的物理设备一样,拥有独立的 IP 地址。此模式适用于需要虚拟机与物理网络中其他设备进行直接通信的场景。
NAT (Network Address Translation):虚拟机通过主机的 IP 地址访问外部网络,外部网络无法直接访问虚拟机,除非进行端口转发配置。适用于虚拟机需要访问外部网络但不需要被外部访问的场景。
Host-Only 网络:创建一个仅限主机与虚拟机之间通信的网络,虚拟机无法访问外部网络,外部设备也无法访问虚拟机。适用于测试环境或需要隔离的场景。
端口转发 (Port Forwarding):在 NAT 网络模式下,将主机的特定端口流量转发到虚拟机的指定端口,实现外部访问虚拟机服务。
选择合适的网络模式取决于具体的使用场景和安全需求。
KVM 是 Linux 内核的一部分,提供高性能的虚拟化解决方案。常见的网络模式包括:
桥接网络:通过桥接宿主机的物理网卡,使虚拟机连接到与宿主机相同的物理网络,实现虚拟机与物理机在同一子网中通信。
NAT 网络:使用 libvirt
提供的默认虚拟网络(通常是 virbr0
),虚拟机通过宿主机的网络访问外部网络。
仅主机网络:创建一个独立的虚拟网络,仅允许虚拟机与宿主机之间的通信。
VirtualBox 是由 Oracle 开发的开源虚拟化软件,支持多种网络模式:
桥接适配器:将虚拟机直接连接到物理网络,虚拟机像物理机一样拥有独立的 IP 地址。
NAT:虚拟机通过宿主机的 IP 地址访问外部网络,外部无法直接访问虚拟机。
NAT 网络:类似于 NAT,但允许同一 NAT 网络内的多个虚拟机之间通信。
仅主机网络:创建一个仅限宿主机与虚拟机之间通信的网络。
内部网络:创建一个完全隔离的网络,仅允许特定虚拟机之间通信。
VMware 提供多种虚拟化解决方案,如 VMware Workstation 和 VMware ESXi。常见的网络模式包括:
桥接网络:虚拟机直接连接到物理网络,获得独立的 IP 地址。
NAT 网络:虚拟机通过宿主机的 IP 地址访问外部网络,外部无法直接访问虚拟机。
仅主机网络:创建一个仅限宿主机与虚拟机之间通信的网络。
自定义网络:允许用户根据需求创建多个自定义的虚拟网络,适用于复杂的网络拓扑。
无论使用哪种虚拟化技术,配置物理机与虚拟机之间的网络通常遵循以下步骤:
根据使用场景和安全需求选择适合的网络模式:
需要虚拟机与物理网络中其他设备直接通信:选择 桥接网络。
虚拟机只需访问外部网络,不需要被外部访问:选择 NAT 网络。
需要虚拟机与宿主机之间进行隔离通信,且不需要外部访问:选择 仅主机网络。
安装必要的软件
sudo apt update
sudo apt install -y bridge-utils virt-manager
创建桥接接口
编辑网络配置文件(以 Netplan 为例,Ubuntu 20.04 默认使用 Netplan):
sudo nano /etc/netplan/01-netcfg.yaml
示例配置:
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: no
addresses: [192.168.1.100/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8,8.8.4.4]
bridges:
br0:
interfaces: [enp3s0]
addresses: [192.168.1.100/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8,8.8.4.4]
parameters:
stp: false
forward-delay: 0
dhcp4: no
注意:将
enp3s0
替换为实际的物理网卡名称,IP 地址根据实际网络配置调整。
应用配置
sudo netplan apply
配置虚拟机使用桥接网络
使用 virt-manager
或编辑虚拟机配置文件,使其使用 br0
作为网络桥接接口。
通过 virt-manager
配置:
virt-manager
。br0
作为桥接接口。打开 VirtualBox 并选择虚拟机
进入虚拟机的设置
配置网络
enp3s0
)。启动虚拟机并配置网络
打开 VMware 并选择虚拟机
进入虚拟机的设置
配置网络适配器
启动虚拟机并配置网络
默认 NAT 网络
KVM 默认使用 virbr0
作为 NAT 网络,不需要额外配置。
配置端口转发
使用 iptables
或编辑 libvirt 的网络配置文件。
示例使用 firewall-cmd
(CentOS 7 及以上):
如果使用 Ubuntu,可使用
iptables
或ufw
进行配置。
sudo firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toaddr=192.168.122.50:toport=80
sudo firewall-cmd --reload
替换
192.168.122.50
为虚拟机的 IP 地址,8080
为宿主机端口,80
为虚拟机端口。
重启服务
sudo systemctl restart libvirtd
打开 VirtualBox 并选择虚拟机
进入虚拟机的网络设置
配置端口转发
HTTP
。8080
。80
。启动虚拟机并配置服务
http://<宿主机IP>:8080
访问虚拟机的服务。打开 VMware 并选择虚拟机
进入虚拟机的设置
配置网络适配器
配置端口转发
VMware Workstation 提供了图形界面配置端口转发,但也可以手动编辑配置文件。
VMnet8
)。8080
。80
。启动虚拟机并配置服务
http://<宿主机IP>:8080
访问虚拟机的服务。Host-Only 网络创建一个仅限宿主机与虚拟机之间通信的独立网络,虚拟机无法访问外部网络,外部设备也无法访问虚拟机。
创建 Host-Only 网络
使用 virsh
创建自定义网络:
sudo virsh net-define hostonly.xml
sudo virsh net-autostart hostonly
sudo virsh net-start hostonly
hostonly.xml 示例:
<network>
<name>hostonlyname>
<bridge name="virbr1" />
<ip address="192.168.100.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.100.2" end="192.168.100.254" />
dhcp>
ip>
network>
配置虚拟机使用 Host-Only 网络
使用 virt-manager
或编辑虚拟机配置文件,选择 virbr1
作为网络接口。
打开 VirtualBox 并访问全局网络设置
创建 Host-Only 网络
vboxnet0
)。配置虚拟机使用 Host-Only 网络
vboxnet0
。启动虚拟机并配置网络
打开 VMware 并访问虚拟网络编辑器
创建 Host-Only 网络
VMnet1
作为 Host-Only 网络。配置虚拟机使用 Host-Only 网络
启动虚拟机并配置网络
配置完成后,需要验证物理机与虚拟机之间的网络连通性,确保通信正常。
动态IP (DHCP):让虚拟机通过 DHCP 自动获取 IP 地址。适用于大多数场景,但可能导致 IP 地址变化。
静态IP:手动分配固定的 IP 地址,确保虚拟机每次启动时使用相同的 IP。适用于需要稳定网络连接的场景。
在虚拟机内配置静态IP示例(Ubuntu):
编辑 Netplan 配置文件
sudo nano /etc/netplan/01-netcfg.yaml
示例配置:
network:
version: 2
renderer: networkd
ethernets:
ens3:
addresses: [192.168.1.50/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8,8.8.4.4]
注意:将
ens3
替换为虚拟机内实际的网络接口名称,IP 地址根据实际需求设置。
应用配置
sudo netplan apply
确保宿主机和虚拟机的防火墙设置允许必要的流量通过。
检查 UFW 状态
sudo ufw status
允许特定端口
例如,允许 SSH(端口 22)和 HTTP(端口 80)流量:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
启用 UFW
sudo ufw enable
注意:根据实际需求开放必要的端口,避免开放不必要的服务以提升安全性。
类似于宿主机,确保虚拟机内部的防火墙允许所需的流量。
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw enable
从宿主机 ping 虚拟机
ping 192.168.1.50
从虚拟机 ping 宿主机
ping 192.168.1.100
测试特定端口的连通性
使用 telnet
或 nc
测试端口:
telnet 192.168.1.50 80
或
nc -zv 192.168.1.50 80
为确保虚拟机始终使用相同的 IP 地址,可以在宿主机的 DHCP 服务器上为虚拟机分配静态 IP,或在虚拟机内配置静态 IP。
在宿主机上为虚拟机分配静态IP(KVM 使用 DHCP 预留):
查找虚拟机的 MAC 地址
virsh domiflist <虚拟机名称>
编辑 libvirt 网络配置
编辑 virbr0.xml
或自定义网络的 XML 文件:
sudo virsh net-edit <网络名称>
添加 DHCP 预留
<host mac='52:54:00:6b:29:28' ip='192.168.122.50'/>
重新启动网络
sudo virsh net-destroy <网络名称>
sudo virsh net-start <网络名称>
确保虚拟机能够正确解析域名:
配置虚拟机的 DNS 服务器
编辑虚拟机内的 /etc/netplan/01-netcfg.yaml
或 /etc/resolv.conf
文件,添加 DNS 服务器地址。
nameservers:
addresses: [8.8.8.8,8.8.4.4]
应用配置
sudo netplan apply
启用 SSH 访问
在虚拟机内安装并配置 SSH 服务:
sudo apt update
sudo apt install openssh-server -y
sudo systemctl enable ssh
sudo systemctl start ssh
配置 SSH 密钥认证
增强安全性,避免使用密码认证。
在宿主机上生成 SSH 密钥对
ssh-keygen -t rsa -b 4096
将公钥复制到虚拟机
ssh-copy-id [email protected]
配置防火墙规则
仅允许特定 IP 访问虚拟机的 SSH 端口,减少潜在攻击面。
sudo ufw allow from 192.168.1.100 to any port 22
使用 VPN 提升安全性
在需要跨网络访问虚拟机时,使用 VPN 可以确保通信的加密与安全。
以下是一个具体的示例,展示如何在 KVM 环境下配置桥接网络,使虚拟机能够与物理网络中的其他设备进行通信。
enp3s0
(根据实际情况调整)sudo apt update
sudo apt install -y bridge-utils virt-manager
编辑 Netplan 配置文件
sudo nano /etc/netplan/01-netcfg.yaml
添加桥接配置
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: no
bridges:
br0:
interfaces: [enp3s0]
dhcp4: yes
parameters:
stp: false
forward-delay: 0
说明:
enp3s0
:替换为实际的物理网卡名称。dhcp4: yes
:桥接接口通过 DHCP 获取 IP 地址,可以根据需要设置为静态 IP。
应用 Netplan 配置
sudo netplan apply
验证桥接接口
ip addr show br0
应显示 br0
接口的 IP 地址。
打开 virt-manager
sudo virt-manager
创建或编辑虚拟机
配置网络
br0
作为桥接接口。配置虚拟机网络
在虚拟机内,确保网络接口通过 DHCP 获取 IP 地址,或者手动配置静态 IP。
示例静态IP配置(Ubuntu):
network:
version: 2
renderer: networkd
ethernets:
ens3:
addresses: [192.168.1.50/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8,8.8.4.4]
重启虚拟机网络
sudo netplan apply
测试网络连接
从宿主机 ping 虚拟机
ping 192.168.1.50
从虚拟机 ping 宿主机
ping 192.168.1.100
访问虚拟机服务
根据配置的端口转发或桥接网络,访问虚拟机提供的服务。
检查桥接接口配置是否正确
确认宿主机的桥接接口已正确设置,并且物理网卡未绑定其他网络配置。
确认 DHCP 服务器可用
确保物理网络中有 DHCP 服务器在运行,或者正确配置虚拟机的静态 IP。
查看虚拟机网络接口状态
在虚拟机内运行:
ip addr show
sudo dhclient -v
检查防火墙设置
确认宿主机和虚拟机的防火墙允许所需的流量。
确认网络模式选择正确
确保虚拟机使用的网络模式符合预期,如桥接网络模式下应能与物理网络通信。
验证物理网络配置
确认物理网络没有限制桥接模式下的新设备连接。
检查端口转发配置
确认 NAT 模式下端口转发规则正确无误。
确认虚拟机内服务正在运行
在虚拟机内检查服务状态:
sudo systemctl status <服务名称>
验证防火墙规则
确认虚拟机内部和宿主机的防火墙允许相应端口的流量。
检查 Netplan 配置是否正确
确保桥接接口配置无误,物理网卡仅作为桥接接口的从接口。
重新应用 Netplan 配置
sudo netplan apply
查看网络接口状态
ip addr show
通过本文的指南,你已经了解了如何在不同虚拟化技术(KVM、VirtualBox、VMware)下,配置物理机与虚拟机之间的网络连接。根据不同的使用场景和需求,选择适合的网络模式(桥接网络、NAT、仅主机网络等)能够有效提升系统的通信效率与安全性。以下是关键要点的回顾:
此外,正确配置防火墙与网络安全措施,确保网络通信的安全性,也是保障系统稳定运行的重要环节。
网络接口管理
ip addr show # 显示所有网络接口及其地址
ip link show # 显示所有网络接口
Netplan 配置
sudo nano /etc/netplan/01-netcfg.yaml # 编辑 Netplan 配置文件
sudo netplan apply # 应用 Netplan 配置
Firewall (UFW) 管理
sudo ufw status # 查看 UFW 状态
sudo ufw enable # 启用 UFW
sudo ufw disable # 禁用 UFW
sudo ufw allow <端口>/<协议> # 允许特定端口
sudo ufw deny <端口>/<协议> # 拒绝特定端口
KVM 网络管理
virsh net-list --all # 列出所有网络
virsh net-start <网络名称> # 启动网络
virsh net-destroy <网络名称> # 销毁网络
virsh net-edit <网络名称> # 编辑网络配置
VirtualBox 网络管理
VBoxManage list hostonlyifs # 列出所有 Host-Only 网络接口
VBoxManage hostonlyif create # 创建 Host-Only 网络接口
VBoxManage modifyvm <虚拟机名称> --bridgeadapter1 <物理网卡名称> # 配置桥接适配器
VMware 网络管理
VMware 的网络配置通常通过 GUI 工具完成,如 Virtual Network Editor。也可以通过编辑配置文件手动配置。
希望此指南能够帮助你顺利配置物理机与虚拟机之间的网络连接,无论是在开发、测试还是生产环境中。如有进一步的问题或需要更详细的指导,请参考相关官方文档或下方留言。