qemu为网络主要提供了4种方法:
qemu 网络包含两部分:
user:
默认使用的User Networking (SLIRP), 用来提供NAT的主机网络访问tap
: guest直接访问主机的网络, 可用于自定义网络拓扑结构,虚拟机之间通信socket
: 用来连接多个qemu实例,来仿真一个共享网络可插拔网卡(pluggable NIC): 通过device
定义网络设备,netdev
定义网络后端
# 通过NET-ID 标识关联
-device name,netdev=NET-ID,... \
-netdev type,id=NET-ID,...
# 查看机器支持的设备模型
-device ?
板载网卡(On-board NIC): 相当于上面命令的语法糖,可以一条命令定义前端和后端
-nic [tap|bridge|user|l2tpv3|vde|netmap|vhost-user|socket][,...][,mac=][,model=]
# 查看机器支持的设备模型
-nic model=?
user模式不需要root权限,使用也简单,但也有一些限制
-netdev user,id=id[...]
# 其他选项
net=[10.0.2.0/24] # guest 可以看到的IP地址
host=[10.0.2.2] # guest可见host的地址,默认所在网络的第2个IP地址
hostname=name # host dpcp服务器中保存的guest主机名
dns=addr # 分配给客户机的第一个IP
# 将访问host的hostport端口 连接重定向 guestport 端口上
hostfwd=[tcp|udp]:[hostaddr]:hostport-[guestaddr]:guestport
tftp=dir # host端本地目录(这里仅使用tftp协议传输文件,未使用host端的tftpd-hpa服务)
实例
# 在qemu 根目录下,编译好qemu
qemu-system-x86_64 \
-m 4G -smp 2 \
--enable-kvm \
-boot order=c \
-hda ubuntu1.img
-nic user,id=net1e1000,model=e1000,mac=9a:17:77:e4:90:03,hostfwd=tcp::8869-:22 \
-vnc :1
# 查看防火墙状态
sudo ufw status
对于guest 默认可以通过 10.0.2.2
访问host
查看 TAP/TUN设备
cat /boot/config-`uname -r` | grep CONFIG_TUN
# 在ubuntu20.04 默认编译到内核
CONFIG_TUN=y
# 查看tap模块信息
modinfo tap
sudo apt-get install bridge-utils # 虚拟网桥工具
sudo apt-get install uml-utilities # UML(User-mode linux)工具
# enp8s0 是自己电脑的网卡名称
sudo ifconfig enp8s0 down # 先关闭enp8s0接口
sudo brctl addbr br0 # 增加一个虚拟网桥br0
sudo brctl addif br0 enp8s0 # 在br0中添加一个接口enp8s0
sudo brctl stp br0 off # 只有一个网桥,所以关闭生成树协议
sudo brctl setfd br0 1 # 设置br0的转发延迟
sudo brctl sethello br0 1 # 设置br0的hello时间
sudo ifconfig br0 0.0.0.0 promisc up # 打开br0接口, promisc 混杂模式
sudo ifconfig enp8s0 0.0.0.0 promisc up # 打开enp8s0接口
sudo dhclient br0 # 从dhcp服务器获得br0的IP地址
sudo brctl show br0 # 查看虚拟网桥列表
sudo brctl showstp br0 # 查看br0的各接口信息
# 配置TAP设备的操作:
sudo tunctl -t tap0 -u `whoami` # 创建一个tap0接口,只允许xxx用户访问
sudo brctl addif br0 tap0 # 在虚拟网桥中增加一个tap0接口
sudo ifconfig tap0 0.0.0.0 promisc up # 打开tap0接口
sudo brctl showstp br0 # 查看br0的各个接口
删除设备
sudo brctl delif br0 tap0 # 删除br0 上的 tap0 接口
sudo tunctl -d tap0 # 删除 tap0 设备
sudo brctl delif br0 enp8s0
sudo ifconfig br0 down
sudo brctl delbr br0 #删除br0 桥接设备
sudo ifconfig enp8s0 up
#Check if an IP is assigned to eth0, if not request one
sudo dhclient -v enp8s0 # 使用DHCP 动态获取IP地址, -v 显示详情
如果 ping
外网可以就不需要配置下面
sudo qemu-system-x86_64 \
-m 4G -smp 2 \
--enable-kvm \
-boot order=c \
-drive file=ubuntu.img,index=0,media=disk,format=qcow2 \
-device e1000,netdev=tape0 \
-netdev tap,id=tape0,ifname=tap0,script=no,downscript=no \
-vnc :1
# 或者这
sudo qemu-system-x86_64 \
-m 4G -smp 2 \
--enable-kvm \
-boot order=c \
-drive file=ubuntu.img,index=0,media=disk,format=qcow2 \
-nic tap,id=tape0,ifname=tap0,script=no,downscript=no \
-vnc :1
参考Qemu连接外网的配置方法
配置时,可根据自己电脑的网段进行配置
后面发现是:在qemu 里查看路由 route -n
时有条默认路由 到 49.123.64.1
然后简单的就配置tap ip 地址为 49.123.64.1,而host的默认路由就是 49.123.64.1, 此时就发生了一些冲突,把tap ip 地址 改成网段其他的就行,同时qemu也需要把默认路由指向tap