简介

qemu为网络主要提供了4种方法:

  • 基于网桥的虚拟网卡;
  • 基于NAT的虚拟网络
  • QEMU内置的用户模式网络
  • 直接分配网络设备的网络(包括VT-d和SR-IOV)

qemu网络组成

qemu 网络包含两部分:

  • 提供给 guset 的模拟网卡(virtual networking device / NIC),如intel的 e1000 网卡
  • 与模拟网卡交互的网络后端(network backend),如将数据包交给host
    • 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 模式

user模式不需要root权限,使用也简单,但也有一些限制

  • 数据包需要经过qemu自带的SLIRP网络协议栈, 性能较差
  • 部分网络协议不一定有效(如ICMP)
  • host 或外部网络不能直接访问guest
-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 模式

查看 TAP/TUN设备

cat /boot/config-`uname -r` | grep CONFIG_TUN
# 在ubuntu20.04 默认编译到内核
CONFIG_TUN=y

# 查看tap模块信息
modinfo tap
tap 设置

参考qemu使用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 外网可以就不需要配置下面

qemu 启动
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

参考

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐