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 | sudo ip addr add 192.168.100.1/24 dev tap0 |
4、测试设备的连通性
1 | ping 192.168.100.1 |
3.2. 使用tun设备
同样地,创建一个tun设备的命令如下:
1 | sudo ip tuntap add dev tun0 mode tun |
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 | sudo ip addr add 192.168.200.1/24 dev veth0 |
3、测试设备之间的连通性
1 | ping 192.168.200.2 -c 4 -I veth0 |
5.2. 不同网络命名空间内
如有需要,可以将veth pair与不同的网络命名空间关联。
1、创建两个网络命名空间
1 | sudo ip netns add ns1 |
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 | sudo ip netns exec ns1 ip addr add 192.168.200.1/24 dev veth0 |
5、在命名空间之间测试设备的连通性
1 | sudo ip netns exec ns1 ping 192.168.200.2 -c 4 |