计算机通过物理网卡设备连接以太网,每个物理网卡上可能存在一个或者多个网络接口,网络管理员通过网线或者光纤将网卡设备接口连接到交换机上,从而实现计算机与外部网络的物理连接。
在Linux操作系统中,网络设备是内核对物理网卡设备的抽象和封装,它为各种协议实例提供统一的接口,充当硬件设备与应用之间的桥梁。在内核中每个物理网络设备都有自己的设备对象、驱动程序,内核通过统一的接口调用驱动程序,驱动程序控制硬件实现网络通信功能。当然网络设备也不一定与物理设备绑定。例如,虚拟网络设备并无实际硬件支撑,这类设备属于纯软件实现,但是内核并不对其进行区分,内核同等对待物理设备和虚拟设备。在应用程序层面,用户直接对网络设备进行编程,不关心该设备与物理设备的对应关系。
用户可以通过ifconfig命令查看当前计算机上安装的网络设备。下面是某台主机的网络设备列表:enp0s8设备为本机上的一个网络设备,该设备对应一个物理网卡;docker0设备则是一个虚拟网桥设备,该设备没有对应的物理设备。
注意
有时我们也称网络设备为网络接口设备或者接口,之后不做区分。
设备是IP地址的载体,一般情况下,IP地址配置在特定的网络设备上,但是地址自身不归设备所有,所有的IP地址统一由内核管理。一般情况下,一个网络设备只需要配置一个IP地址,但是在某些场景下可能需要给设备配置多个IP地址。
➢主机只有一张网卡,但是要求接入多个二层网络中。不同的二层网络使用不同的地址段,本场景下用户可以为网卡设备配置多个地址,每个地址对应一个二层网络。当然,这种组网方式有很多问题,不建议使用。
➢主机对外提供多个服务,每个服务绑定一个独立的地址。例如,一个主机上开启了多个服务,每个服务绑定的端口都是8080,为了避免端口冲突,此时可以为该主机分配多个地址,每个服务绑定一个地址+8080端口。
Linux系统对接口设备配置多地址没有太多限制,可以给网卡配置同一个网段的多个地址,也可以配置不同网段的地址。当一个网络设备配置了同一个网段的多个地址时,地址属性有主地址和辅地址之分。
➢ 主地址(Primary IP address): 用户向网卡配置的本网段的第一个地址。
➢ 辅地址(Secondary IP address): 用户向网卡配置本网段的非第一个地址。
一个设备配置同一个网段地址时只能有一个主地址,但可以有0个或者多个辅地址。例如,用户先后给一个网络设备配置了三个地址,分别是192.168.56.106/24、192.168.56.253/24、192.168.56.254/24,那么用户配置的第一个地址192.168.56.106/24就是这个网络设备的主地址,其他地址均为辅地址。
如果用户给一个网络设备配置了多个网段的地址,那么每个网段上都有一个主地址,以及0个或者多个辅地址。
接下来进行实例化验证,执行操作前的系统配置如下(仅列出了enp0s8设备的关键信息):
使用ifconfig命令查看网络设备IP地址时,结果只能显示第一个地址,如果用户想查看该设备上配置的所有地址,则可以使用ip命令。ip命令为IPROUTE2软件包提供的网络管理命令之一,此命令的功能非常强大。在后面的范例中会按照需要使用ifconfig或者ip命令。
(1)实验1:同一设备配置同一个网段的多个地址
实验主机enp0s8设备已经配置了地址192.168.56.106/24,下面尝试增加同网段地址:
系统将192.168.56.0/24网段的第一个地址作为主地址,后续增加的地址均作为辅地址。通过ip命令查看地址配置,显示如下:
其中,辅地址标识为“secondary”。从上述输出看,设备原有的地址192.168.56.106为主地址,后续配置的两个地址均为辅地址。
(2)实验2:同一设备配置不同网段的多个地址
继续在enp0s8设备上增加192.168.57.0/24网段的2个地址,新增的地址与设备现有的地址不是同一个网段:
查看IP地址配置情况:
命令显示enp0s8设备上存在两个主地址和三个辅地址。对于同一个网段的地址,先配置的为主地址,后配置的为辅地址。
无论网络设备上配置了多少个地址,使用ifconfig命令都只能看到一个地址。例如,前面为enp0s8网卡配置了5个地址,使用ifconfig查看系统IP地址配置,只能显示一个地址。
如何解决使用ifconfig命令无法看到多地址的问题呢?Linux提供了接口别名方案。接口别名相当于为接口设备另外起了一个名字,每个别名都可以配置独立的IP地址,用户将多出来的地址分别配置到别名设备上就可以了。
接口别名的格式为“<设备名称> : <设备编号>”。例如,enp0s8:1设备是enp0s8设备的一个别名。向别名设备配置IP地址,等同于在设备上增加地址。
下面使用ifconfig命令为enp0s8:1设备配置IP地址:
用户在配置地址前不需要创建enp0s8:1设备,因为enp0s8:1不是真实存在的设备,仅仅是某个设备的别名。可以认为设备别名仅仅是为了让ifconfig命令能够显示多IP地址而存在的。
通过ifconfig命令查看设备信息,结果如下:
可以看到ifconfig命令显示存在两个设备。
为了确定接口别名并没有增加设备,通过ip命令查看地址配置情况:
结果显示最后一行新增的192.168.56.252/24地址依旧归属于enp0s8设备,只不过该地址绑定的接口设备别名为enp0s8:1。
由此可见,通过别名配置多地址与使用ip命令配置多地址的效果是一样的。
Linux使用子接口传输带VLAN标签的报文,子接口的命名格式为“<设备名称>. <设备编号>”。虽然子接口与接口别名的格式相似,但是两者有本质的区别:子接口设备是独立的设备,通过子接口发出去的报文将被打上VLAN标签,而通过接口别名发出去的报文只是普通的报文。
既然子接口是真实的设备,那么使用前要先将其创建出来。通过下面的命令创建一个VLANID为100的子接口设备,设备名称为enp0s8.100。
启用此设备,并给设备分配一个IP地址:
查看设备的配置情况:
编号为5的设备为本次创建的子接口设备,系统按照“enp0s8.100@enp0s8”的格式显示设备名称。其中,@前面的字符串表示子接口设备名称,@后面的字符串表示子接口绑定的父接口设备名称。
子接口设备的报文收发操作均通过绑定的父接口设备实现。通过子接口发送报文时,内核在设备驱动层为报文打上VLAN标签。接收报文时,在子接口设备驱动层剥掉报文中的VLAN标签,此过程对应用程序透明。
一旦在父接口设备上创建了子接口,该父接口上就可能传输带VLAN标签的报文,相当于此父接口开启了trunk模式。所以,当此父接口设备与交换机连接时,需要将与其连接的交换机端口设置为trunk模式,否则交换机将丢弃子接口发送的带VLAN标签的报文。