本文主要介绍个人在学习过程中遇到的一些 Linux 基本网络设备,如 tun/tap、bridge、veth 等。文中参考了一些优秀博文,非常感谢这些文章作者的辛勤付出!
网络命名空间
对于命名空间,博文 Network namespaces 有一个精辟的总结:
namespaces limit what you can see.
作者这是拿 namespaces 和 cgroups 进行了比较,原句大意为:cgroups 控制了你能使用的资源数量,而 namespaces 则限制了你所能看到的资源。
Linux 内核提供了 6 种类型的命名空间:pid、net、mnt、uts、ipc 和 user,这里我们只涉及 net namespace,即网络命名空间。每一个网络命名空间都有独立的网络栈(网卡、路由表、iptable 规则等)。
它经常被用来隔离网络设备和服务,只有拥有同样命名空间的设备才能看到彼此。
跟网络命名空间相关的命令如下:
1 | ip netns help |
Tun/Tap
对于 Tun、Tap,博文 Understanding TUN TAP Interfaces 概括得很不错(这里就不翻译了…):
TUN Interfaces
TUN devices work at theIP level or layer three level
of the network stack and are usuallypoint-to-point connections. A typical use for a TUN device is establishing VPN connections since it gives the VPN software a chance to encrypt the data before it gets put on the wire.
Since a TUN device works at layer three it can only accept IP packets and in some cases only IPv4. If you need to run any other protocol over a TUN device you’re out of luck. Additionally because TUN devices work at layer three they can’t be used in bridges and don’t typically support broadcasting.
TAP Interfaces
TAP devices, in contrast, work at theEthernet level or layer two
and therefore behave very much like a real network adaptor. Since they are running at layer two they can transport any layer three protocol andaren’t limited to point-to-point connections. TAP devices can be part of a bridge and are commonly used in virtualization systems to provide virtual network adaptors to multiple guest machines.
Since TAP devices work at layer two they will forward broadcast traffic which normally makes them a poor choice for VPN connections as the VPN link is typically much narrower than a LAN network (and usually more expensive).
概念
在 Tun/Tap 通用驱动 FAQ 页面上,作者对 Tun、Tap 这两种设备有一个很明确的定义。另外,博文网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP的图画的太漂亮易懂!下边将结合这两篇博文介绍 Tun、Tap。
物理网卡
我们先来看一下物理网卡是怎么工作的,如下图:
图片来源
物理网卡接收到数据包后把它交给内核的 Network Stack 处理,然后通过 Socket API 通知给用户程序。
Tun
Tun 是一个虚拟的点对点
的网络设备。Tun 驱动程序为 IP 隧道技术提供底层的内核支持,并为用户空间应用程序提供了两个接口:
- /dev/tunX 字符设备(可能为 /dev/net/tun)
- tunX 虚拟点对点接口
用户空间应用程序可以向 /dev/tunX 写 IP 帧,内核会从 tunX 接口接收到该帧;同时,内核向 tunX 写入的数据也能被用户空间的应用程序从 /dev/tunX 读取到。如下图所示:
图片来源
博文网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP还说到了如何基于 Tun 设备搭建一个 UDP VPN:
图片来源数据包会通过内核网络栈两次。但是经过 App 的处理后,数据包可能已经加密,并且原有的 IP 头被封装在 UDP 内部,所以第二次通过网络栈内核看到的是截然不同的网络包。
译注:这是很多 VPN 的实现原理,切记!
Tap
Tap 是一个虚拟的以太
网络设备。Tap 驱动程序为以太网隧道技术提供底层的内核支持,并为用户空间应用程序提供了两个接口:
- /dev/tapX 字符设备
- tapX 虚拟以太网设备
工作流程跟 Tun 的类似。
Tun 和 Tap 区别
两者区别在于:
- TUN 设备的 /dev/tunX 文件收发的是 IP 层数据包,只能工作在 IP 层,无法与物理网卡做 bridge,但是可以通过三层交换(如 ip_forward)与物理网卡连通。
- TAP 设备的 /dev/tapX 文件收发的是 MAC 层数据包,拥有 MAC 层功能,可以与物理网卡做 bridge,支持 MAC 层广播
Tun/Tap 设备管理
用 ip tuntap 即可对 Tun/Tap 设备进行管理(也可用已弃用的工具 tunctl):
1 | $ ip tuntap help |
如创建删除:
1 | $ sudo ip tuntap add tap0 mode tap |
Bridge
网桥(Bridge)的话,目前知道的有两种,一种是 Linux 自带的,另一种是 OpenvSwitch 创建的。网桥类似于交换机,工作在链路层,不需要路由功能,理论上不可以配置 IP,但特别的是它可以配置 IP
,这样做主要为了方便对网桥进行管理。
Linux Bridge
管理工具 brctl
Linux 原生的网桥可以用 brctl 工具进行管理。
1 | $ brctl -h |
详细的用法可参考这篇博文 bridge。
记得在把网卡加到网桥后,执行dhclient mybridge
使配置正常。
要点记录
- 已经挂载到网桥上的设备,这些设备以后的通信就得通过该网桥,而且这些设备已配置的 IP 都将无用(链路层)
- 往往将原物理网卡的 IP 配置给网桥,以便于对网桥进行管理
- 如果机器只有一个网卡,把网卡加入网桥的一瞬间会导致连接断开(详细原因参考博文一个关于Linux Bridge配置的吐嘈)
OpenvSwitch Bridge
有待添加
Veth
Veth 是 Virtual Ethernet 的缩写,也是一种网络设备,不过它是成对存在的,称为 Veth Pair,主要用于不同网络命名空间之间的通信,如下图所示:
图片来源
新建一个 Veth Pair 的命令也很简单:
1 | $ sudo ip link add veth00 type veth peer name veth01 |
使用例子可参考:
最后,关于 Veth 和 Tap 的区别,我看 StackOverflow 有一个问题写的挺好的:
Veth
is a special net devices which were created in pair, I consider it as a method to change the traffic’s direction, that is, when the out direction traffic is sent to veth device from Linux protocol stack, it was sent to another its mirror veth device, so the mirror one treats it as a in direction traffic and put it back to Linux protocol stack for further usage.
Tap
device is logical net device but have different with any other one: it allows user space program directly injecting traffic into Linux protocol stack, as well as it can retrieve traffic from the stack. It opens a tunnel to Linux protocol stack at level 2(or tun device at level 3) in user space, the stack will consider data from user space as in direction traffic.