在典型的數據中心網絡下,服務器會通過彙集交換機彙集到一起,然後彙集交換機通過核心交換機進行不同彙集交換機下服務器數據轉發.

使用tcpdump抓取LLDP包得到網絡拓撲

典型數據中心網絡,圖片出處見水印

通常,彙集交換機下面有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層的包,其包的格式如下

使用tcpdump抓取LLDP包得到網絡拓撲

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,分別表示上聯交換機的端口號和交換機名.有這個信息我們就知道線有沒有連接錯誤了.

使用tcpdump抓取LLDP包得到網絡拓撲

實際上仔細觀察輸出,能看到裏面還有很多我們可以得到的信息.比如交換機的廠商,是二層交換機還是三層交換機,口子是否配置了VLAN,是否配置了默認VLAN,口子的類型,是否自動協商,是否鏈路聚合,口子的MTU.

如果熟悉交換機配置的同學應該能看到這些就是配置交換機口子的時候的常用配置.LLDP都能拉下來.

那交換機那邊呢?

我們剛纔說了服務器那邊可以通過tcpdump來抓交換機的信息.那交換機能抓服務器的麼?

我們知道LLDP包是自己主動從網口發出去的.服務器上面需要安裝lldpd才能發送這個包出去(也有其他類似的軟件). 當服務器有發這個包出去的時候,交換機就能收到. 然後交換機上面有相應的命令可以看到上來的機器的主機名和端口名. 這樣我們也能反向看到服務器的連接信息.

相关文章