在典型的数据中心网络下,服务器会通过汇集交换机汇集到一起,然后汇集交换机通过核心交换机进行不同汇集交换机下服务器数据转发.
通常,汇集交换机下面有24到48不等的口子,占用标准机柜1U,放在机柜的顶部.机柜中的服务器连接到交换机中.
如果服务器很多,连线不规范,那么要找到哪台服务器连接到哪台交换机的那个口子会比较麻烦.此时可以使用抓LLDP包来解决.
LLDP协议介绍
LLDP协议(link layer discovery protocol)是一个厂商无关的链路层协议,网络设备用这个协议在LAN上广播自己的id,capabilities,neigh等信息.
LLDP中广播出来的信息是存储在网络设备的MIB(management information database)中的,这些信息可以使用一个SNMP(simple network management protocol)来得到,当然也可以直接抓包得到. 在一个使能了LLDP协议的网络中,这个网络的拓扑可以被爬出来.
LLDP包是一个纯2层的包,其包的格式如下
LLDP信息会从网络设备的接口发送出来,发送信息的间隔一般是固定的(比如30s),这个信息是一个以太网包.这个以太网包中都是一些type-length-value(TLV)的组合.
这个包的目的MAC地址是一个二层多播地址. 其值一般为固定的01:80:c2:00:00:0e.
每个帧都需要下面的这些强制的TLV:chassis id,prot id, time-to-live.强制的tlv后面是可选的tlv,这个包最后的tlv是一个特殊的tlv,其type和length都是0.
linux下使用tcpdump来抓lldp包
要在linux服务器上使用tcpdump抓到lldp包,需要上联的交换机使能了LLDP.通常交换机有一个全局配置来使能LLDP,在数据中心网络中,特别是下联了服务器的交换机推荐使能LLDP.
通常使用tcpdump是来抓3层ip包或者是4层tcp/udp包. 其实tcpdump的-e选项可以抓取二层链路层包.
tcpdump -i enp3s0 -nev ether proto 0x88cc
上面的命令可以抓到机器enp3s0口上联交换机的lldp信息.
其中-i enp3s0表示抓enp3s0口. -n表示输出数字的ip. -e表示输出的内容中也把链路层的信息输出. -v表示tcpdump输出更加verbose(详细)的信息. ether proto 0x88cc表示抓Ethernet类型的88cc类型的包.从上面的截图中可以看到0x88cc是LLDP包的协议类型.
下图是抓到的一个包的结果.我们基本只需要看Port Description和System Name,分别表示上联交换机的端口号和交换机名.有这个信息我们就知道线有没有连接错误了.
实际上仔细观察输出,能看到里面还有很多我们可以得到的信息.比如交换机的厂商,是二层交换机还是三层交换机,口子是否配置了VLAN,是否配置了默认VLAN,口子的类型,是否自动协商,是否链路聚合,口子的MTU.
如果熟悉交换机配置的同学应该能看到这些就是配置交换机口子的时候的常用配置.LLDP都能拉下来.
那交换机那边呢?
我们刚才说了服务器那边可以通过tcpdump来抓交换机的信息.那交换机能抓服务器的么?
我们知道LLDP包是自己主动从网口发出去的.服务器上面需要安装lldpd才能发送这个包出去(也有其他类似的软件). 当服务器有发这个包出去的时候,交换机就能收到. 然后交换机上面有相应的命令可以看到上来的机器的主机名和端口名. 这样我们也能反向看到服务器的连接信息.