一文搞懂 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
bashsudo 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: 激活接口
bashsudo ip link set veth0 up sudo ip link set veth1 up- 现在它们 UP 了,能发包。
-
步骤3: 分配 IP(测试连通)
bashsudo 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: 结合命名空间(高级玩法)
创建新命名空间(像新"虚拟机"):
bashsudo 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 也删)。
- 测试:从主机 ping 192.168.1.2(成功);在 myns 里 ping 192.168.1.1(用
-
删除 veth:
bashsudo ip link del veth0
4. veth 的应用场景(为什么有用?)
- 容器网络:Docker/Kubernetes 用 veth 连容器和主机桥接(bridge)。容器像独立主机,但通过 veth "上网"。
- 网络测试:模拟多机环境,不用真机器。e.g., 测试防火墙、负载均衡。
- VPN/隧道:结合 bridge 或 vxlan 建复杂拓扑。
- eBPF/XDP 开发:如你之前玩的教程,用 veth 模拟流量(高性能、低开销)。
- 隔离安全:不同命名空间隔离流量,防泄漏。