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 模拟流量(高性能、低开销)。
  • 隔离安全:不同命名空间隔离流量,防泄漏。
相关推荐
brucelee1862 小时前
在 Linux Ubuntu 24.04 安装 IntelliJ IDEA
linux·ubuntu·intellij-idea
阿伟实验室2 小时前
debian10部署简易web服务器
运维·服务器·前端
Linux技术芯2 小时前
金刚经修心课 你的生活指南
linux
Kathleen1003 小时前
计算机网络——应用层
运维·服务器·计算机网络
Mr.H01274 小时前
多线程文件拷贝:从原理到实现的完整指南
linux·运维
橘子真甜~4 小时前
C/C++ Linux网络编程5 - 网络IO模型与select解决客户端并发连接问题
linux·运维·服务器·c语言·开发语言·网络·c++
霖004 小时前
ZYNQ——ultra scale+ IP 核详解与配置
服务器·开发语言·网络·笔记·网络协议·tcp/ip
oushaojun24 小时前
Linux内核KGDB进阶:源码级调试实战演练(转)
linux·运维·kgdb
船长㉿5 小时前
vim常用命令
linux·编辑器·vim