一个计算机技术爱好者与学习者

0%

Linux虚拟网络设备tun/tap和veth pair

1. Linux虚拟网络设备简介

本文内容主要来自ChatGPT。

Linux虚拟网络设备有多种类型,它们在不同场景下被用于创建和管理虚拟网络连接。以下是一些常见的Linux虚拟网络设备:

  • TUN/TAP:TUN(网络层虚拟设备)和TAP(数据链路层虚拟设备)设备用于在用户空间和内核空间之间创建虚拟网络设备。它们通常用于实现VPN、虚拟机等场景。
  • veth pair:veth pair是一对虚拟以太网设备,它们在内核空间中相互连接。当一个veth设备接收到数据包时,它会将数据包传递给与之配对的另一个veth设备。veth pair常用于连接不同的网络命名空间或虚拟机。
  • bridge:虚拟桥接器用于将多个网络设备连接在一起,以便它们可以在同一个局域网中相互通信。虚拟桥接器通常用于连接虚拟机、容器或其他虚拟网络设备。
  • macvlan:macvlan设备允许在同一个物理网络接口上创建多个虚拟接口,每个接口都有自己的MAC地址。这种设备类型在虚拟化和容器环境中非常有用,因为它可以让多个虚拟设备共享同一个物理网络接口。
  • ipvlan:ipvlan与macvlan类似,但它在同一个物理网络接口上创建多个虚拟接口,这些接口共享相同的MAC地址但具有独立的IP地址。ipvlan在某些场景下可能比macvlan更高效,因为它避免了ARP广播风暴。
  • VXLAN:虚拟可扩展局域网(VXLAN)是一种在数据中心网络中创建可扩展的虚拟局域网的技术。VXLAN使用UDP封装将二层以太网帧封装到IP数据包中,从而实现跨数据中心和广域网的虚拟网络连接。
  • GRE:通用路由封装(GRE)是一种封装协议,可以在不同网络协议之间创建点对点连接。在Linux中,可以使用GRE隧道在两个网络节点之间创建虚拟网络连接。

VXLAN(Virtual Extensible LAN)和GRE(Generic Routing Encapsulation)并非严格意义上的网络设备,而是网络隧道协议。然而,在Linux系统中,它们可以被视为一种特殊类型的虚拟网络设备,因为它们可以创建和管理虚拟网络连接。

本文中,我们主要学习tun/tap和veth pair。

参考文档:

2. tun/tap原理

tun/tap是Linux内核中的虚拟网络设备驱动,用于在用户空间和内核空间之间创建虚拟网络设备。tun设备用于处理三层数据包(IP数据包),而tap设备用于处理二层数据包(以太网帧)。

tun/tap设备允许用户空间程序与内核空间虚拟网络设备进行通信。当用户空间程序往tun/tap设备写入数据时,内核将数据包作为虚拟设备的输入进行处理。同样,当内核向用户空间程序发送数据包时,程序可从tun/tap设备读取数据。这使得用户空间程序可以模拟一个完整的网络设备,用于实现VPN、虚拟机等功能。

3. 使用tun/tap设备

3.1. 使用tap设备

1、安装iproute2和uml-utilities软件包

1
sudo apt-get install iproute2 uml-utilities

2、创建一个tap设备

1
sudo ip tuntap add dev tap0 mode tap

3、为tap设备分配IP地址并启用设备

1
2
sudo ip addr add 192.168.100.1/24 dev tap0
sudo ip link set tap0 up

4、测试设备的连通性

1
ping 192.168.100.1

3.2. 使用tun设备

同样地,创建一个tun设备的命令如下:

1
2
3
sudo ip tuntap add dev tun0 mode tun
sudo ip addr add 10.0.0.1/24 dev tun0
sudo ip link set tun0 up

4. veth pair原理

veth pair(Virtual Ethernet Pair)是一对虚拟以太网设备,它们在内核空间中相互连接。当一个veth设备接收到数据包时,它会将数据包传递给与之配对的另一个veth设备。veth pair常用于连接不同的网络命名空间或虚拟机。

veth pair在内核空间中表现为一对连接在一起的虚拟网络设备。当一个veth设备接收到数据包时,数据包会立即传递给与之配对的另一个veth设备。这种机制使得veth pair可以用于连接不同的网络命名空间,例如Docker容器或Linux容器(LXC)中的网络。这种连接方式类似于将两台物理主机通过网线连接起来,但在这种情况下,连接发生在虚拟环境中。

5. 使用veth pair

5.1. 相同网络命名空间内

1、创建一对veth设备

1
sudo ip link add veth0 type veth peer name veth1

2、为veth设备分配IP地址并启用设备

1
2
3
4
sudo ip addr add 192.168.200.1/24 dev veth0
sudo ip link set veth0 up
sudo ip addr add 192.168.200.2/24 dev veth1
sudo ip link set veth1 up

3、测试设备之间的连通性

1
ping 192.168.200.2 -c 4 -I veth0

5.2. 不同网络命名空间内

如有需要,可以将veth pair与不同的网络命名空间关联。

1、创建两个网络命名空间

1
2
sudo ip netns add ns1
sudo ip netns add ns2

2、将veth0移动到ns1命名空间

1
sudo ip link set veth0 netns ns1

3、将veth1移动到ns2命名空间

1
sudo ip link set veth1 netns ns2

4、在网络命名空间内分配IP地址并启用veth设备

1
2
3
4
sudo ip netns exec ns1 ip addr add 192.168.200.1/24 dev veth0
sudo ip netns exec ns1 ip link set veth0 up
sudo ip netns exec ns2 ip addr add 192.168.200.2/24 dev veth1
sudo ip netns exec ns2 ip link set veth1 up

5、在命名空间之间测试设备的连通性

1
sudo ip netns exec ns1 ping 192.168.200.2 -c 4
  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-tun-tap-vethpair/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~