Linux veth

一文搞懂 Linux veth:从小白到入门

嘿,小白朋友!如果你是 Linux 网络新手,别担心,我会用最简单的话一步步带你了解 veth(Virtual Ethernet,虚拟以太网)。veth 不是什么高大上的东西,它就像一对"虚拟网线",帮你在 Linux 系统里模拟网络连接。想象一下,你想在电脑里建两个"虚拟房间"(网络命名空间),veth 就是连接它们的"门"。下面我们从头开始讲,配上例子和图解(用文字模拟),保证你看完就能上手!

1. veth 是什么?(基础定义)
  • 简单说:veth 是一种虚拟网络设备(interface),总是成对出现。比如,你创建一对 veth0 和 veth1,它们就像两端插头的网线:一端发包,另一端就能收到。
  • 为什么需要它?在物理世界,你用网线连两台电脑;在 Linux 里,veth 连"虚拟电脑"(如容器、命名空间)。它支持所有以太网功能:MAC 地址、IP、流量控制等。
  • 对比真实网卡:真实网卡(如 eth0)连物理网络;veth 是纯软件的,速度快(内核级),常用于测试、隔离、桥接。
  • 关键点:veth 不是单身的!创建时总是一对(peer),删除一个另一个也消失。
2. veth 的工作原理(像动画一样想)
  • 成对机制:创建 veth0@veth1 时,veth0 和 veth1 是"双胞胎"。从 veth0 发送的数据包,会直接"传送"到 veth1 的接收队列(RX),反之亦然。内核用队列(queue)处理,不走物理线。

  • 命名空间隔离 :veth 的强大在于可以放进不同网络命名空间(network namespace)。比如:

    • veth0 在默认命名空间(主机)。
    • veth1 在新命名空间(容器)。
    • 这样,容器就能"联网"了,而不干扰主机。
  • 数据流 (简化图):

    复制代码
    [主机命名空间] -- veth0 <---> veth1 -- [容器命名空间]
                      |                 |
                  发送包 ------------> 接收包
                  接收包 <------------ 发送包
    • 如果包从 veth0 出,veth1 进;内核零拷贝,效率高。
  • 底层:基于 Linux net_device 结构,实现点对点(point-to-point)连接。支持 XDP、TC 等高级功能,但小白先忽略。

3. 怎么创建和使用 veth?(动手实践)

需要 root 权限(sudo)。用 ip 命令(iproute2 工具包,默认有)。

  • 步骤1: 创建一对 veth

    bash 复制代码
    sudo ip link add veth0 type veth peer name veth1
    • 结果:veth0 和 veth1 出现。用 ip link show 查看:

      复制代码
      3: veth1@veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
          link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
      4: veth0@veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
          link/ether 11:22:33:44:55:66 brd ff:ff:ff:ff:ff:ff
    • 注意:默认 DOWN(关闭),MAC 随机生成。

  • 步骤2: 激活接口

    bash 复制代码
    sudo ip link set veth0 up
    sudo ip link set veth1 up
    • 现在它们 UP 了,能发包。
  • 步骤3: 分配 IP(测试连通)

    bash 复制代码
    sudo ip addr add 192.168.1.1/24 dev veth0
    sudo ip addr add 192.168.1.2/24 dev veth1
    • 测试:ping 192.168.1.2(从 veth0 ping veth1),成功!包通过 veth "隧道"。
  • 步骤4: 结合命名空间(高级玩法)

    创建新命名空间(像新"虚拟机"):

    bash 复制代码
    sudo ip netns add myns  # 创建命名空间 myns
    sudo ip link set veth1 netns myns  # 把 veth1 移到 myns
    sudo ip netns exec myns ip addr add 192.168.1.2/24 dev veth1  # 在 myns 里设 IP
    sudo ip netns exec myns ip link set veth1 up
    • 测试:从主机 ping 192.168.1.2(成功);在 myns 里 ping 192.168.1.1(用 sudo ip netns exec myns ping 192.168.1.1)。
    • 清理:sudo ip netns del myns(自动删 veth1,veth0 也删)。
  • 删除 veth

    bash 复制代码
    sudo ip link del veth0
4. veth 的应用场景(为什么有用?)
  • 容器网络:Docker/Kubernetes 用 veth 连容器和主机桥接(bridge)。容器像独立主机,但通过 veth "上网"。
  • 网络测试:模拟多机环境,不用真机器。e.g., 测试防火墙、负载均衡。
  • VPN/隧道:结合 bridge 或 vxlan 建复杂拓扑。
  • eBPF/XDP 开发:如你之前玩的教程,用 veth 模拟流量(高性能、低开销)。
  • 隔离安全:不同命名空间隔离流量,防泄漏。
相关推荐
Johny_Zhao7 小时前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
YuMiao21 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
chlk1232 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑2 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件2 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
深紫色的三北六号2 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash2 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI3 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行4 天前
Linux和window共享文件夹
linux
Sinclair4 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器