qemu在ubuntu2204下的桥接 - 实操篇

参考 文章

TUN & TAP

  • Tap(以太网隧道)设备和Tun(网络隧道)设备是两种不同的虚拟网络设备,它们的功能和用途略有不同,因此不完全相同。
  • 本篇文章 采用 tap 设备 , 来实现 VLAN
TAP设备主要用于模拟以太网层,用于虚拟机之间、虚拟机与外部网络之间的通信,
而TUN设备主要用于处理IP包,用于隧道和VPN等特定网络用例。
选择哪种设备取决于您的具体网络需求和配置。

使用 TAP 设备(桥接) 和  TUN 设备(VPN)的 时候, 他们的数据流方向是不同的
	https://blog.csdn.net/VE_Edge/article/details/122721863 中的 "04 应用场景"
  • TAP(以太网隧道)设备
TAP设备模拟的是以太网(Ethernet)层,因此它可以处理数据链路层的数据,包括MAC地址信息。
TAP设备通常用于创建虚拟局域网(VLAN),以便将多个虚拟机连接到同一虚拟网络中,就像它们都在同一物理网络上一样。
TAP设备通常用于实现虚拟机之间或虚拟机与宿主机之间的通信,以及虚拟机与外部网络的通信。它具有较高的网络层次,可以处理各种网络协议。

虚拟局域网(VLAN)或将多个虚拟机连接到同一虚拟网络的操作通常会使用TAP设备而不是TUN设备
	这是因为TAP设备模拟以太网层,它可以处理数据链路层的数据,包括MAC地址信息,因此更适合用于模拟局域网
使用TAP设备时,多个虚拟机可以像它们都在同一物理网络上一样进行通信,它们可以通过虚拟交换机或虚拟网络连接到同一个TAP设备,就像它们连接到同一个以太网交换机一样。
https://blog.csdn.net/VE_Edge/article/details/122721863 中的 "04 应用场景->虚拟机 VM"
  • TUN(网络隧道)设备
TUN设备模拟的是网络层,它只能处理IP包。它不处理数据链路层,不包含MAC地址信息。
TUN设备通常用于创建虚拟专用网络(VPN)或隧道,以安全地传输IP包,通常用于跨越不同网络的通信。
TUN设备通常用于实现点对点通信,它更适合用于路由和隧道通信,而不是直接模拟局域网。

TUN设备通常更适合于点对点通信、路由和隧道,因为它模拟的是网络层而不是以太网层。它通常用于创建虚拟专用网络(VPN)或实现网络隧道,以便跨越不同网络的通信。

https://blog.csdn.net/VE_Edge/article/details/122721863 中的 "04 应用场景->VPN"

img

qemu上网方式

qemu上跑的代码要操作网卡通信,所以 
    1.本质上是qemu 模拟了一个虚拟网卡
    2.并且该网卡的数据最后要通到 真实网卡
基于这个考虑,目前是这种技术
前端(对应1),负责 接收 qemu上的代码 传递的数据
    模拟了什么型号的网卡(Network Interface Card)
    我们 用 -net nic,model=xxx 或者 -device xxx 来 选中 qemu 可以模拟的网卡,比如他可以是一张螃蟹卡
    	-net nic,model=rtl8139
    	xxx 可以 从 qemu-system-arm -M vexpress-a9 -device help
后端(对应2),负责 把nic(Network Interface Card)的数据包发到宿主机的网络
    我们可以用 -net zzz 或者 -netdev zzz 来表示 这种后端技术
    zzz 可取 user、tap、bridge、socket、vde 等
    而 user 就是 下面说的 "Usermode Networking"
    而 bridge 就是下面说的 "Bridged Networking"
配置kvm/qemu的网络有两种方法。
其一,默认方式为用户模式网络(Usermode Networking),数据包由NAT方式通过主机的接口进行传送。
	使用的技术为 tap only
其二,使用桥接方式(Bridged Networking),外部的机器可以直接联通到虚拟机,就像联通到你的主机一样。
	使用的技术为 tap + 虚拟网桥(bridge)
	

与 vmware 的对比

vmware 有三种方式可以创建虚拟网络 , qemu 也可以实现
vmwareqemu
桥接VMnet0(tap + 虚拟网桥)本文给出了整个搭建过程
NATVMnet8(tap only) -netdev user,id=net0 -device e1000,netdev=net0
HostOnlyVMnet1(tap only) -netdev user,id=net0,net=192.168.100.0/24 -device e1000,netdev=net0

如何搭建

可选技术解读

该文介绍了三种方法

1.qemu虚拟机网桥方式网络通信
	// 虚拟网桥 + tap虚拟网卡 , 后端 -net bridge , 属于 Bridged Networking
2.qemu虚拟机tap方式网络通信 方法一:网桥下的tap0上网
	// 虚拟网桥 + tap0       , 后端 -net tap    , 属于Bridged Networking 
3.qemu虚拟机tap方式网络通信 方法一:纯tap0上网
	// tap0 only 			 , 后端 -net tap     ,属于 Usermode Networking
	
12 是同一种 ,都是 tap+虚拟网桥
	但是后端设置不同 : tap和虚拟网桥被绑定了,所以命令行中后端写 -net tap 和 -net bridge 都无所谓
	如果你想,可以写全部,因为他们被绑定了
	对应 vmware中的桥接网络
3为tap only
	对应 vmware中的 NAT

tap+虚拟网桥 和 tap only的主观区别是,
	tap+虚拟网桥  guest os 获取的ip 和host的ip为同一网段
	tap only     guest os 获取的ip 和host的ip为同一网段

选择用 第二种技术搭建

第一种没走通
以下是第二种在 ubuntu 2204  qemu-system-arm 上的实现
文章中也列举了 1604 的操作

搭建操作概括

  • 操作概括
0.环境准备(安装驱动和工具包)
1.创建 虚拟网桥
2.创建 一个名为tap0 的tap 设备
3.绑定 名为tap0的tap设备 和 网桥
    qemu启动的时候 /etc/qemu-ifup 做的
    tap设备 的名称(ifname的值) 被 传给 /etc/qemu-ifup 当做 $1
4.绑定 虚拟网桥 和 真实网卡(在我这里是enp3s0)
    ubuntu2204 采用的是 netplan 管理的网络,用的是 yaml 语法
    ubuntu1604, 是 用/etc/network/interfaces 做的
5.重启网络  
6.启动qemu-system-arm
7. 数据流流向
	
	qemu 上的跑的代码
		|
	qemu 仿真的 网卡
		|
	   qemu 进程
	   |
	   内核tap设备 ------------ 内核bridge ------- 内核真实网卡驱动
	   												|
	   											   真实网卡
	   											   	|
	   											   	PHY----------------->外界网络
                

搭建实操

  • 0.环境准备
$ modprobe bridge
$ lsmod |grep bridge
bridge                331776  0
stp                    16384  1 bridge
llc                    16384  2 bridge,stp
sudo apt install -y bridge-utils uml-utilities
  • 1.创建网桥
sudo brctl addbr virbr0
sudo brctl stp virbr0 on
brctl show
  • 2.创建一个名为 tap0 的TAP设备
sudo ip tuntap add dev tap0 mode tap
//sudo ip link set tap0 up
  • 3.绑定 tap设备(名为 tap0 的TAP设备) 和 网桥
/etc/qemu-ifup 原生支持
其实本质上做了下面的事情
ifconfig tap0 up 
brctl addif virbr0 tap0
  • 4.绑定 虚拟网桥 和 真实网卡
// 2204 的版本
// 注意缩进
// TODO 将 enp3s0 换为你的真实网卡名
// TODO 修改 macaddress
$ cat /etc/netplan/virbr0.yaml 
network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: false
      dhcp6: false
  bridges:
    virbr0:
      macaddress: d8:cb:8a:5c:66:86
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.1.250/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses:
          - 192.168.1.1
      interfaces:
        - enp3s0
// 1604的版本
$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)

# 可以 man 5 interfaces 查看 语法

# Lines  beginning  with  the  word "auto" are used to identify the physical interfaces to be brought up when ifup is run with the -a option.
# Stanzas defining logical interfaces start with a line consisting of the word "iface" followed by the name of the logical interface.
# This  will be "inet" for TCP/IP networking
# The loopback Method may be used to define the IPv4 loopback interface.
# The dhcp Method may be used to obtain an address via DHCP with any of the tools: dhclient, pump, udhcpc, dhcpcd.
# For compatibility with bridge-utils package, if bridge_ports option is specified, VLAN interface configuration is not performed.

auto lo
iface lo inet loopback

auto enp3s0

auto virbr0
iface virbr0 inet dhcp
	bridge_ports enp3s0
  • 5.重启网络
sudo systemctl restart NetworkManager.service // 等同于 sudo  /etc/init.d/network-manager  restart
  • 6.启动qemu-system-arm
sudo qemu-system-arm -M vexpress-a9 -m 512M  -kernel ../u-boot/u-boot -nographic   \
    -net nic \
    -net tap,ifname=tap0
也可以用如下,但并未验证
-net bridge,id=net0,helper=/usr/lib/qemu-bridge-helper,br=virbr0
	// 这个 helper 程序的作用是在虚拟机启动时,帮助创建虚拟网桥并进行相关的配置。它可以让虚拟机与物理网络进行通信,而不需要直接绑定真实物理网卡。
	// helper 程序的帮助,可以使虚拟网桥正确地连接到物理网络
	// TAP设备并没有在命令行中显式地配置,但是实际上它会隐式地与虚拟机的NIC连接在一起,从而实现虚拟机与虚拟网桥之间的通信
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值