参考 文章
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"
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 也可以实现
vmware | qemu | |
---|---|---|
桥接 | VMnet0 | (tap + 虚拟网桥)本文给出了整个搭建过程 |
NAT | VMnet8 | (tap only) -netdev user,id=net0 -device e1000,netdev=net0 |
HostOnly | VMnet1 | (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
1 和 2 是同一种 ,都是 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连接在一起,从而实现虚拟机与虚拟网桥之间的通信