当前位置: 首页 > news >正文

Ubuntu20.04配置虚拟网卡对实现流量镜像

1. 为什么需要虚拟网卡对?

在KVM虚拟化环境中,我们经常遇到一个棘手的问题:如何在不影响物理网络设备的情况下,将物理端口的网络流量完整地镜像到虚拟机中进行分析?这就是虚拟网卡对(veth pair)大显身手的时候了。

想象一下,你正在管理一个云平台,某个客户的虚拟机突然出现网络异常。为了排查问题,你需要抓取进出该虚拟机的所有网络包。但直接在生产环境中的物理网卡上抓包可能会影响业务,这时候虚拟网卡对就像给你的网络装了一个"监控摄像头",可以无干扰地复制所有流量。

虚拟网卡对由两个虚拟接口组成,它们就像连在一起的双胞胎——一端收到的数据会立即出现在另一端。这种特性特别适合用于:

  • 网络流量监控和分析
  • 入侵检测系统(IDS)部署
  • 网络性能测试
  • 安全审计

我曾在实际项目中遇到过这样的情况:某个关键业务虚拟机频繁出现网络延迟,通过配置veth pair将流量镜像到监控虚拟机,最终发现是TCP窗口缩放参数设置不当导致的性能问题。

2. 环境准备与依赖检查

2.1 系统要求确认

在开始配置前,我们需要确保系统满足以下条件:

  • 运行Ubuntu 20.04 LTS(建议使用最新补丁版本)
  • 已安装KVM虚拟化平台
  • 具有root或sudo权限
  • 网络管理使用netplan(Ubuntu 20.04默认)

可以通过以下命令检查系统信息:

lsb_release -a

确认输出中包含"Ubuntu 20.04"。对于KVM的检查:

kvm-ok

如果看到"KVM acceleration can be used",说明虚拟化支持已就绪。

2.2 必要工具安装

虽然Ubuntu 20.04已经包含了大部分所需工具,但为了确保完整性,建议运行:

sudo apt update sudo apt install -y net-tools iproute2 bridge-utils

这些工具包将提供ifconfig、ip等网络配置命令。我在多个项目中发现,完整安装这些工具可以避免后续配置中出现一些奇怪的依赖问题。

3. 创建虚拟网卡对

3.1 使用systemd-networkd配置

Ubuntu 20.04推荐使用systemd-networkd来管理网络设备,它能确保配置在重启后依然有效。我们将创建一个.netdev文件来定义veth pair:

sudo nano /etc/systemd/network/sr-veth.netdev

文件内容如下:

[NetDev] Name=veth0 Kind=veth [Peer] Name=veth1

这个配置定义了一对名为veth0和veth1的虚拟网卡。保存文件后,需要启用并启动systemd-networkd服务:

sudo systemctl enable systemd-networkd sudo systemctl start systemd-networkd

3.2 验证网卡对创建

执行以下命令检查虚拟网卡是否创建成功:

ip link show

你应该能在输出中看到veth0和veth1两个接口,它们的状态目前可能是DOWN。我在第一次配置时犯过一个错误——忘记检查接口状态,导致后续步骤全部失败。

4. 配置netplan使虚拟网卡永久生效

4.1 编辑netplan配置文件

为了让虚拟网卡在系统启动时自动激活,我们需要修改netplan配置:

sudo nano /etc/netplan/00-installer-config.yaml

在配置文件中添加以下内容(注意保持原有配置不变):

network: version: 2 renderer: networkd ethernets: veth0: dhcp4: no veth1: dhcp4: no

这个配置告诉系统不要为这两个接口分配IP地址(因为我们只是用它们来镜像流量)。如果你需要为接口分配静态IP,可以添加相应的addresses配置。

4.2 应用netplan配置

执行以下命令使配置生效:

sudo netplan apply

然后再次检查接口状态:

ip link show veth0 ip link show veth1

现在两个接口应该都处于UP状态。如果遇到问题,可以尝试重启systemd-networkd服务:

sudo systemctl restart systemd-networkd

5. 将虚拟网卡对连接到KVM虚拟机

5.1 创建网络桥接

为了将虚拟网卡对连接到KVM虚拟机,我们需要创建一个桥接设备。首先编辑netplan配置:

sudo nano /etc/netplan/00-installer-config.yaml

添加桥接配置:

network: version: 2 renderer: networkd ethernets: veth0: dhcp4: no veth1: dhcp4: no bridges: br-veth: interfaces: [veth1] dhcp4: no

这个配置将veth1接口加入到名为br-veth的桥接中。应用配置:

sudo netplan apply

5.2 配置KVM虚拟机网络

现在可以通过virt-manager图形界面或virsh命令行工具将虚拟机的网络接口连接到这个桥接。使用virsh的命令如下:

virsh edit 你的虚拟机名称

在部分修改或添加以下配置:

<interface type='bridge'> <source bridge='br-veth'/> <model type='virtio'/> </interface>

保存退出后,启动虚拟机。现在虚拟机通过veth1连接到主机,而veth0可以用于流量监控。

6. 配置流量镜像

6.1 使用tc实现流量镜像

Linux的tc(流量控制)工具可以帮我们实现流量镜像。假设你的物理网卡是eth0,要将它的流量镜像到veth0:

sudo tc qdisc add dev eth0 handle ffff: ingress sudo tc filter add dev eth0 parent ffff: protocol all u32 match u8 0 0 action mirred egress mirror dev veth0

这个配置会复制eth0的所有入口流量到veth0。要镜像出口流量:

sudo tc qdisc add dev eth0 root handle 1: prio sudo tc filter add dev eth0 parent 1: protocol all u32 match u8 0 0 action mirred egress mirror dev veth0

6.2 验证流量镜像

在虚拟机中启动抓包工具验证:

sudo tcpdump -i eth0 -w captured.pcap

同时在主机上生成一些测试流量:

ping -c 5 google.com

停止抓包后检查captured.pcap文件,应该能看到复制的ping包。我在实际使用中发现,有时需要调整tc的优先级参数才能获得最佳镜像效果。

7. 高级配置与优化

7.1 选择性流量镜像

如果只需要镜像特定类型的流量,可以修改tc过滤器。例如,只镜像HTTP流量(端口80):

sudo tc filter add dev eth0 parent 1: protocol ip u32 match ip dport 80 0xffff action mirred egress mirror dev veth0

或者只镜像来自特定IP的流量:

sudo tc filter add dev eth0 parent 1: protocol ip u32 match ip src 192.168.1.100 action mirred egress mirror dev veth0

7.2 性能优化考虑

流量镜像会消耗CPU资源,特别是在高流量环境下。可以通过以下方式优化:

  • 使用BPF过滤器减少复制的数据量
  • 在多核系统上为tc设置CPU亲和性
  • 限制镜像的流量速率

例如,使用BPF过滤器只镜像TCP流量:

sudo tc filter add dev eth0 parent ffff: bpf bytecode '1,6 0 0 0,84 0 0 240,21 0 3 6,6 0 0 65535,6 0 0 0' action mirred egress mirror dev veth0

8. 常见问题排查

8.1 虚拟网卡对不工作

如果veth pair看起来没有传递流量,可以尝试:

  1. 检查两端接口是否都是UP状态
  2. 确认没有防火墙规则阻止流量
  3. 使用ip命令检查接口统计信息:
ip -s link show veth0 ip -s link show veth1

如果RX/TX计数器没有增长,说明流量没有通过。

8.2 流量镜像不完整

有时会发现镜像的流量缺失,可能原因包括:

  • tc过滤器配置错误
  • 系统资源不足导致丢包
  • 网络接口处于混杂模式

可以通过增加缓冲区大小来减少丢包:

sudo sysctl -w net.core.rmem_max=2097152 sudo sysctl -w net.core.wmem_max=2097152

8.3 配置重启后失效

虽然我们使用了systemd-networkd和netplan,但tc规则默认不会持久化。要解决这个问题,可以:

  1. 将tc命令写入/etc/rc.local
  2. 创建systemd服务单元来在启动时应用tc规则
  3. 使用ifupdown脚本(如果使用该网络管理器)

我通常推荐第二种方法,创建一个如/etc/systemd/system/tc-mirror.service的服务单元。

http://www.jsqmd.com/news/484570/

相关文章:

  • Ubuntu系统下CloudCompare编译安装与常见问题解决指南
  • NetApp DS2246 Disk Shelf扩容实战:SAS与ACP线缆连接全解析
  • 告别gatttool:Ubuntu 18.04下Bluetoothctl操作BLE设备避坑大全
  • 2026年京津冀地区靠谱的不锈钢全屋定制厂家排名,售后完善是关键 - 工业品牌热点
  • 告别PDF打印乱序!用PyPDF2合并文件+Python自动化打印的完整流程
  • 2026年辽宁镀银企业TOP5名单出炉,大连科华领跑行业
  • 网址解析要不要带www?无需纠结,做好“统一”即可
  • 2026年广播电台广告承包商口碑榜:这些公司值得合作,上海花旗大厦广告/上海白玉兰广场广告,广播电台广告公司承包商哪家好 - 品牌推荐师
  • 线结构光三维重建(二):光平面标定与激光轮廓提取的实战优化
  • Dify 2026轻量化模型编译全链路(ARM64+TensorRT加速实录):单节点吞吐提升217%,功耗压降至8.3W
  • Transformer自注意力机制为什么这么慢?拆解QK矩阵乘法的时间消耗
  • 如何选拉萨装修公司,西藏云舍装饰口碑究竟好不好 - mypinpai
  • Z-Image-Turbo-rinaiqiao-huiyewunv 一键部署教程:基于 Ubuntu 的快速环境搭建指南
  • 汽车NVH工程师必看:亥姆霍兹共振器在车门隔音中的实战应用(Comsol仿真全流程)
  • Bacnet 实战工具指南 (一)
  • Nunchaku-flux-1-dev辅助UI/UX设计:自动生成界面原型与图标
  • 用Multisim快速仿真运放滤波器:低通/高通/带通一键测试教程
  • gemma-3-12b-it惊艳效果展示:跨语言图文问答+多步推理真实案例集
  • 文墨共鸣大模型部署排错指南:常见网络问题与403 Forbidden解决
  • 农业特点:稳定+但是不赚钱
  • RK3568 AMOLED小平板硬件设计实战:微型终端的高密度集成方法
  • Python实战:海康工业相机回调取流+OpenCV显示全流程避坑指南(附代码)
  • FireRed-OCR Studio应用场景:跨境电商多平台商品页截图→规格参数结构化入库
  • 网站安装环境检测提示“目录不可写”(红色警告)问题|已解决
  • 基于R7FA2E1A72DFL的嵌入式电子时钟设计
  • OpenWebUI+Dify打造智能对话系统:从环境配置到API调用的完整流程
  • 别再只会用Win+R了!命令行高手都在用的3种场景化打开方式
  • 网站后台登录提示“账号或密码错误”,确认信息正确仍无法登录问题|已解决
  • LSS算法深度解析:从图像特征到BEV空间的完整流程(含Efficientnet应用)
  • Web3 的庖丁解牛