物理网卡、子网卡、虚拟VLAN网卡的关系

1.物理网卡:物理网卡这里指的是服务器上实际的网络接口设备,在系统中可以看到的,比如2个物理网卡分别对应是eth0和eth1这两个网络接口。
2. 子网卡:子网卡在这里并不是实际上的网络接口设备,但是可以作为网络接口在系统中出现,如eth0:1、eth1:2这种网络接口。它们必须要依赖于物理网卡,虽然可以与物理网卡的网络接口同时在系统中存在并使用不同的IP地址,而且也拥有它们自己的网络接口配置文件。但是当所依赖的物理网卡不启用时(Down状态)这些子网卡也将一同不能工作。
3.虚拟VLAN网卡:这些虚拟VLAN网卡也不是实际上的网络接口设备,也可以作为网络接口在系统中出现,但是与子网卡不同的是,他们没有自己的配置文件。他们只是通过将物理网加入不同的VLAN而生成的VLAN虚拟网卡。如果将一个物理网卡添加到多个VLAN当中去的话,就会有多个VLAN虚拟网卡出现,他们的信息以及相关的VLAN信息都是保存在/proc/net/vlan/config这个临时文件中的,而没有独自的配置文件。它们的网络接口名是eth0.1、eth1.2这种名字。
注:当需要启用VLAN虚拟网卡工作的时候,关联的物理网卡网络接口上必须没有IP地址的配置信息。

实验环境

电脑

系统 Ubuntu 18.04
物理网卡 eth1
ip地址 192.168.1.10

设备

系统 QNX 7.0.X
物理网卡 emac0
IP地址 192.168.1.1

电脑和设备网线直连,相互能ping通。

子网卡实验

电脑端配置子网卡

添加物理网卡eth1的子网卡eth1:1,并分配ip地址192.168.1.11。子网卡的ip地址应和物理网卡在同一网段。

  1. # ifconfig eth1:1 192.168.1.11
  2. # ifconfig
  3. eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  4. inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255
  5. inet6 fe80::cc1f:79bc:9523:6b08 prefixlen 64 scopeid 0x20<link>
  6. ether 00:0e:c6:a2:7c:eb txqueuelen 1000 (Ethernet)
  7. RX packets 695 bytes 50361 (50.3 KB)
  8. RX errors 0 dropped 0 overruns 0 frame 0
  9. TX packets 721 bytes 62418 (62.4 KB)
  10. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  11. eth1:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  12. inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255
  13. ether 00:0e:c6:a2:7c:eb txqueuelen 1000 (Ethernet)

从设备ping电脑子网卡ip

  1. # ping 192.168.1.11
  2. PING 192.168.1.11 (192.168.1.11): 56 data bytes
  3. 64 bytes from 192.168.1.11: icmp_seq=0 ttl=64 time=1 ms
  4. 64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0 ms
  5. ----192.168.1.11 PING Statistics----
  6. 2 packets transmitted, 2 packets received, 0% packet loss
  7. round-trip min/avg/max = 0/0/1 ms variance = 1 ms^2
  8. #

能ping通说明子网卡工作正常。

删除子网卡

  1. ifconfig eth1:1 down

网桥实验

安装工具

  1. apt install bridge-utils

创建网桥

  1. # brctl addbr br1

将网卡加入网桥

  1. brctl addif br1 eth1

将网卡加入网桥之前电脑和设备之间是连接正常的,加入之后就ping不通了。

分配IP地址

删除网卡IP地址,为网桥分配IP地址。

  1. # ifconfig eth1 0
  2. # ifconfig br1 192.168.1.10
  3. # ifconfig
  4. br1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  5. inet 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255
  6. inet6 fe80::20e:c6ff:fea2:7ceb prefixlen 64 scopeid 0x20<link>
  7. ether 00:0e:c6:a2:7c:eb txqueuelen 1000 (Ethernet)
  8. RX packets 0 bytes 0 (0.0 B)
  9. RX errors 0 dropped 0 overruns 0 frame 0
  10. TX packets 31 bytes 4442 (4.4 KB)
  11. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  12. eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  13. inet6 fe80::cc1f:79bc:9523:6b08 prefixlen 64 scopeid 0x20<link>
  14. ether 00:0e:c6:a2:7c:eb txqueuelen 1000 (Ethernet)
  15. RX packets 1158 bytes 80177 (80.1 KB)
  16. RX errors 0 dropped 0 overruns 0 frame 0
  17. TX packets 1195 bytes 102447 (102.4 KB)
  18. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

此时设备能够ping通该IP地址。

开启生成树协议

  1. # brctl stp br1 on
  2. # brctl show
  3. bridge name bridge id STP enabled interfaces
  4. br1 8000.000ec6a27ceb yes eth1

查看生成树状态

  1. # brctl showstp br1
  2. br1
  3. bridge id 8000.000ec6a27ceb
  4. designated root 8000.000ec6a27ceb
  5. root port 0 path cost 0
  6. max age 20.00 bridge max age 20.00
  7. hello time 2.00 bridge hello time 2.00
  8. forward delay 15.00 bridge forward delay 15.00
  9. ageing time 300.00
  10. hello timer 0.14 tcn timer 0.00
  11. topology change timer 0.00 gc timer 0.00
  12. flags
  13. eth1 (1)
  14. port id 8001 state forwarding
  15. designated root 8000.000ec6a27ceb path cost 4
  16. designated bridge 8000.000ec6a27ceb message age timer 0.00
  17. designated port 8001 forward delay timer 0.00
  18. designated cost 0 hold timer 0.00
  19. flags

由输出信息,可以看出STP的状态为forwarding(转发状态),也就是说,该网桥已经参与生成树,会转发数据帧,同时也会转发BPDU。

将网卡从网桥中删除

  1. brctl delif br1 eth1

删除网桥

删除网桥之前要先停用该网桥,UP状态的网桥无法删除。

  1. ifconfig br1 down
  2. brctl delbr br1

VLAN实验

用vconfig命令设置VLAN

加载802.1q模块

  1. $ sudo modprobe 8021q
  2. $ lsmod | grep 8021q
  3. 8021q 32768 0
  4. garp 16384 1 8021q
  5. mrp 20480 1 8021q

安装vlan工具

  1. apt install vlan

创建VLAN

  1. # vconfig add eth1 5
  2. Added VLAN with VID == 5 to IF -:eth1:-

为VLAN设备分配IP地址

  1. ifconfig eth1.5 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.1.255 up

注意:不同VLAN的IP地址要配置在不同的网段(subnet)。物理网卡其实也在一个VLAN中,只是默认PVID为0,所以VLAN设备的IP地址和物理设备的IP地址也要在不同网段。
查看系统VLAN信息

  1. # cat /proc/net/vlan/config
  2. VLAN Dev name | VLAN ID
  3. Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
  4. eth1.5 | 5 | eth1

此时设备能同时ping通电脑物理网卡的IP地址和VLAN网卡的IP地址。电脑也能ping通设备的IP地址,但通过wireshark抓包发现是源地址是物理网卡的IP地址。
删除VLAN

  1. sudo ifconfig eth1.5 down
  2. or
  3. sudo vconfig rem eth1.5

用IP命令设置VLAN

为eht0添加VLAN

  1. ip link add link eth0 eth0.5 type vlan id 5
  2. ip link
  3. ip -d link show eth0.5

分配IP并启用

  1. ip addr add 192.168.2.10/24 dev eth0.5
  2. ip link set eth0.5 up
  3. ip address

添加路由

  1. sudo ip route add 192.168.2.0/24 dev eth1.5

查看路由

  1. $ ip route
  2. default via 10.25.11.1 dev eth0 proto dhcp metric 102
  3. default via 10.25.7.1 dev wlan0 proto dhcp metric 600
  4. 10.25.7.0/24 dev wlan0 proto kernel scope link src 10.25.7.133 metric 600
  5. 10.25.11.0/24 dev eth0 proto kernel scope link src 10.25.11.153 metric 102
  6. 169.254.0.0/16 dev wlan0 scope link metric 1000
  7. 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
  8. 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.11
  9. 192.168.1.0/24 dev brvlan5 proto kernel scope link src 192.168.1.10
  10. 192.168.2.0/24 dev eth1.5 scope link

删除路由

  1. $ sudo ip route del 192.168.2.0/24

删除vlan

  1. ip link delete eth0.5
  2. or
  3. ip link set dev eth0.5 down