• qemu 网络配置


    简介

    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 ?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    板载网卡(On-board NIC): 相当于上面命令的语法糖,可以一条命令定义前端和后端

    -nic [tap|bridge|user|l2tpv3|vde|netmap|vhost-user|socket][,...][,mac=][,model=]
    
    # 查看机器支持的设备模型
    -nic model=?
    
    • 1
    • 2
    • 3
    • 4

    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服务)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    实例

    # 在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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    对于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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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的各个接口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    删除设备

    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  显示详情
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果 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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    外网连接

    参考Qemu连接外网的配置方法
    配置时,可根据自己电脑的网段进行配置
    请添加图片描述
    后面发现是:在qemu 里查看路由 route -n 时有条默认路由 到 49.123.64.1 然后简单的就配置tap ip 地址为 49.123.64.1,而host的默认路由就是 49.123.64.1, 此时就发生了一些冲突,把tap ip 地址 改成网段其他的就行,同时qemu也需要把默认路由指向tap

    参考

  • 相关阅读:
    PyCharm+PyQT5之三界面与逻辑的分离
    ALV概念讲解
    免费的百度官网认证怎么搞?什么单位官网认证免费?
    logback.xml配置详解
    SpringBoot全局异常处理请求参数校验及响应体包装
    解读AXI协议,做一个不被AXI折磨的芯片设计工程师
    3个常用的损失函数
    【MySQL】事务管理
    建筑施工网络优化名词解释,网络规划与优化技术
    5个实用的性能测试工具(软件测试工程师必备)
  • 原文地址:https://blog.csdn.net/qq_41146650/article/details/126465032