Obtener información CDP de ESXi desde línea de comandos

Como ya expliqué en la entrada de hace unos años, Cisco Discovery Protocol (CDP) es un protocolo propietario de Cisco que permite visualizar información de los equipos directamente conectados (Sistema Operativo, IP, modelo de dispositivo…) a nivel de capa 2 (Data Link).

En el caso de VMware y ESX/ESXi, el método más efectivo para consultar esta información es con las herramientas que nos ofrece el propio sistema. Digo esto porque haciendo tcpdump es probable que no veáis este tráfico debido a la arquitectura de virtual switches y demás.

Lo primero es identificar la tarjeta de red de la cual queremos recopilar la información CDP. También podemos ver toda la información a nivel global con el comando que pongo al final de la entrada. En la guía de comandos útiles de ESXi especifiqué la forma de sacar las interfaces de red:

~ # esxcfg-nics -l
Name    PCI           Driver      Link Speed     Duplex MAC Address       MTU    Description                   
vmnic0  0000:04:00.00 igb         Up   100Mbps   Full   00:xx:xx:xx:xx:xx 1500   Intel Corporation ...
vmnic1  0000:04:00.01 igb         Up   100Mbps   Full   00:xx:xx:xx:xx:xx 1500   Intel Corporation ...

Una vez identificada, podemos consultar todos los datos CDP con el siguiente comando por cada una de las interfaces:

~ # vim-cmd hostsvc/net/query_networkhint --pnic-name=vmnic0

Y la información que obtenemos:

(vim.host.PhysicalNic.NetworkHint) [
   (vim.host.PhysicalNic.NetworkHint) {
      dynamicType = , 
      device = "vmnic0", 
      subnet = (vim.host.PhysicalNic.NetworkHint.IpNetwork) [
         (vim.host.PhysicalNic.NetworkHint.IpNetwork) {
            dynamicType = , 
            vlanId = 0, 
            ipSubnet = "XXXXXXX-XXXXXXX", 
         }
      ], 
      connectedSwitchPort = (vim.host.PhysicalNic.CdpInfo) {
         dynamicType = , 
         cdpVersion = 2, 
         timeout = 0, 
         ttl = 56, 
         samples = 685364, 
         devId = "XXXXXXX(XXXXXXX)", 
         address = "XXXXXXX", 
         portId = "X/XX", 
         deviceCapability = (vim.host.PhysicalNic.CdpDeviceCapability) {
            dynamicType = , 
            router = false, 
            transparentBridge = true, 
            sourceRouteBridge = false, 
            networkSwitch = true, 
            host = false, 
            igmpEnabled = true, 
            repeater = false, 
         }, 
         softwareVersion = "unknown", 
         hardwarePlatform = "XXXXXXX", 
         ipPrefix = "0.0.0.0", 
         ipPrefixLen = 0, 
         vlan = XXX, 
         fullDuplex = true, 
         mtu = 0, 
         systemName = "XXXXXXX", 
         systemOID = "XXXXXXX", 
         mgmtAddr = "XXXXXXX", 
         location = "XXXXXXX", 
      }, 
      lldpInfo = (vim.host.PhysicalNic.LldpInfo) null, 
   }
]

También podemos obtener la información de todas las interfaces con un único comando:

~ # vim-cmd hostsvc/net/query_networkhint