Linux网络设备类型

olivee 4年前 ⋅ 1168 阅读

网络设备类型

[root@localhost ~]# ip address help
Usage: ...
       ip address [ show [ dev IFNAME ] [ scope SCOPE-ID ] [ master DEVICE ]
                         [ type TYPE ] [ to PREFIX ] [ FLAG-LIST ]
                         [ label LABEL ] [up] [ vrf NAME ] ]
... 
TYPE := { vlan | veth | vcan | dummy | ifb | macvlan | macvtap |
          bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan | lowpan |
          gre | gretap | ip6gre | ip6gretap | vti | nlmon | can |
          bond_slave | ipvlan | geneve | bridge_slave | vrf | hsr | macsec }

看到Linux的网络设备类型有以下几种: vlan 、 veth 、 vcan 、 dummy 、 ifb 、 macvlan 、 macvtap 、 bridge 、 bond 、 ipoib 、 ip6tnl 、 ipip 、 sit 、 vxlan 、 lowpan 、 gre 、 gretap 、 ip6gre 、 ip6gretap 、 vti 、 nlmon 、 can 、 bond_slave 、 ipvlan 、 geneve 、 bridge_slave 、 vrf 、 hsr 、 macsec

下面对我们在网络虚拟化中用到的几种设备类型进行学习:

vlan

对于VLAN概念的理解,有几点要强调:

  1. VLAN分离了广播域;
  2. 单独的一个VLAN模拟了一个常规的交换以太网,因此VLAN将一个物理交换机分割成了一个或多个逻辑交换机;
  3. 不同VLAN之间通信需要三层参与;
  4. 当多台交换机级联时,VLAN通过VID来识别,该ID插入到标准的以太帧中,被称作tag;
  5. 大多数的tag都不是端到端的,一般在上行路上第一个VLAN交换机打tag,下行链路的最后一个VLAN交换机去除tag;
  6. 只有在一个数据帧不打tag就不能区分属于哪个VLAN时才会打上tag,能去掉时尽早要去掉tag;
  7. 最终,IEEE 802.1q解决了VLAN的tag问题。除了IEEE 802.1q,其余的都是和实现相关的,虽然Cisco和H3C的实现很类似,Linux可以和它们有大不同。

关 键看最后3点,也就是3,4,5。这是VLAN最难理解的部分,不过一旦理解了,VLAN也就不剩下什么了。为了使得叙述上以及配置上更加的方 便,Cisco以及其他的厂商定义了很多的细节,而这些细节在IEEE 802.1q标准中并没有被定义,这些细节包括但不局限于以下几点:

  1. 每一个VLAN交换机端口需要绑定一个VLAN id;
  2. 每一个VLAN交换机端口处于下面三类中的一类:access,trunk,hybrid。
  • 2.1. access端口:从此类端口收到的数据帧是不打tag的,从此类端口发出的数据帧是不打tag的;
  • 2.2. trunck端口:从此类端口收到的数据帧打着tag,从此类端口发出的数据帧需要打tag(不考虑缺省VLAN的情况);
  • 2.3. hybrid端口:略

Linux 上的VLAN和Cisco/H3C上的VLAN不同,后者的VLAN是现有了LAN,再有V,也就是说是先有一个大的LAN,再划分为不同的VLAN,而 Linux则正好相反,由于Linux的Bridge设备是被创建出来的逻辑设备,因此Linux需要先创建VLAN,再创建一个Bridge关联到该 VLAN

veth

  • veth 和其它的网络设备都一样,一端连接的是内核协议栈。

  • veth 成对出现的设备,相当于一根网线的两个接口,用于连接两个设备。这个设备可以是namespace、linux bridge。

  • 在 veth pair 设备上,任意一端(RX)接收的数据都会在另一端(RX)发送出去,veth pair在转发的过程中不会篡改数据包的内容

bridge

  • 首先,bridge是一个虚拟网络设备,所以具有网络设备的特征,可以配置IP、MAC地址等;其次,bridge是一个虚拟交换机,和物理交换机有类似的功能。

  • 对于普通的网络设备来说,只有两端,从一端进来的数据会从另一端出去,如物理网卡从外面网络中收到的数据会转发给内核协议栈,而从协议栈过来的数据会转发到外面的物理网络中。

  • 而bridge不同,bridge有多个端口,数据可以从任何端口进来,进来之后从哪个口出去和物理交换机的原理差不多,要看mac地址。

ipip 、 gre 和 sit

IP隧道技术:是路由器把一种网络层协议封装到另一个协议中以跨过网络传送到另一个路由器的处理过程。IP 隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技术亦称为IP封装技术(IP encapsulation)。

Linux 原生支持多种三层隧道,其底层实现原理都是基于 tun 设备。我们可以通过命令 ip tunnel help 查看 IP 隧道的相关操作。

Linux系统内核实现的IP隧道技术主要有三种(PPP、PPTP和L2TP等协议或软件不是基于内核模块的):ipip、gre、sit 。这三种隧道技术都需要内核模块 tunnel4.ko 的支持。

  • ipip 需要内核模块 ipip.ko ,该方式最为简单!但是你不能通过IP-in-IP隧道转发广播或者IPv6数据包。你只是连接了两个一般情况下无法直接通讯的IPv4网络而已。至于兼容性,这部分代码已经有很长一段历史了,它的兼容性可以上溯到1.3版的内核。据网上查到信息,Linux的IP-in-IP隧道不能与其他操作系统或路由器互相通讯。它很简单,也很有效。

  • GRE 需要内核模块 ip_gre.ko ,GRE是最初由CISCO开发出来的隧道协议,能够做一些IP-in-IP隧道做不到的事情。比如,你可以使用GRE隧道传输多播数据包和IPv6数据包。

  • sit 他的作用是连接 ipv4 与 ipv6 的网络。个人感觉不如gre使用广泛 。

其它

vxlan

lowpan

gretap

ip6gre

ip6gretap

vti

nlmon

can

bond_slave

ipvlan

geneve

bridge_slave

vrf

hsr

macsec

vcan

dummy

ifb

macvlan

macvtap

bond

ipoib

ip6tnl