Ir al contenido

Rutas y siguientes saltos

Argo mantiene el estado de reenvío separado del kernel de Linux. Cuando ip y estos comandos no coinciden, son estos comandos los que mueven el tráfico.

La tabla de rutas del vRouter, por VRF.

Ventana de terminal
{"command":["rt","--dump","2"]}
Flags: L=Label Valid, P=Proxy ARP, T=Trap ARP, F=Flood ARP, H=Proxy ARP for host interface, V=Preferred VRF
Labels/Misc: S=SiteId N=NetworkId
vRouter inet4 routing table 0/2/unicast
Destination PPL Flags Label Nexthop Labels/Misc
Number of routes: 4
0.0.0.0/0 0 - 0
169.254.254.102/32 32 L 263 13
172.16.12.126/32 32 L 0 46 (S,N):2298:0
172.16.84.126/32 32 L 0 46 (S,N):2298:0

La tabla de siguientes saltos. Cada ruta apunta a un ID de siguiente salto, y esto los resuelve.

Ventana de terminal
{"command":["nh","--list"]}
Id:0 Type:Drop Fmly: AF_INET Rid:0 Vrf:0
Flags:Valid, Tunnel: None
Id:1 Type:Drop Fmly: AF_INET Rid:0 Vrf:0
Flags:Valid, Tunnel: None
Id:2 Type:Receive Fmly: AF_INET Rid:0 Vrf:1
Flags:Valid, Policy, Tunnel: Udp,
Oif:0
Id:3 Type:Receive Fmly: AF_INET Rid:0 Vrf:2
Flags:Valid, Policy, Tunnel: Udp,
Oif:0
Id:4 Type:Receive Fmly: AF_INET Rid:0 Vrf:3
Flags:Valid, Policy, Tunnel: Udp,
Oif:0
Id:5 Type:Receive Fmly: AF_INET Rid:0 Vrf:4
Flags:Valid, Policy, Tunnel: Udp,
Oif:0
Id:6 Type:Vrf_Translate Fmly: AF_INET Rid:0 Vrf:1
Flags:Valid, Policy, Tunnel: None
Id:7 Type:Vrf_Translate Fmly: AF_INET Rid:0 Vrf:2
Flags:Valid, Policy, Tunnel: None
Id:8 Type:Vrf_Translate Fmly: AF_INET Rid:0 Vrf:3
Flags:Valid, Policy, Tunnel: None
Id:9 Type:Vrf_Translate Fmly: AF_INET Rid:0 Vrf:4
Flags:Valid, Policy, Tunnel: None
Id:10 Type:Vrf_Translate Fmly: AF_INET Rid:0 Vrf:5
Flags:Valid, Policy, Tunnel: None
Id:11 Type:Vrf_Translate Fmly: AF_INET Rid:0 Vrf:6
Flags:Valid, Policy, Tunnel: None
Id:12 Type:Encap Fmly: AF_INET Rid:0 Vrf:1
Flags:Valid, Policy, Tunnel: None
Oif:2 Len:14
Encap Data: 02 01 02 03 04 05 00 00 5e 00 01 00 08 00
Id:13 Type:Encap Fmly: AF_INET Rid:0 Vrf:2
Flags:Valid, Policy, Tunnel: None
Oif:4 Len:14
Encap Data: 02 01 02 03 04 06 00 00 5e 00 01 00 08 00
Id:14 Type:Encap Fmly: AF_INET Rid:0 Vrf:3
Flags:Valid, Policy, Tunnel: None
Oif:6 Len:14
Encap Data: 00 00 5e 00 02 00 00 00 5e 00 01 00 08 00
Id:15 Type:Encap Fmly: AF_INET Rid:0 Vrf:6
Flags:Valid, Policy, Tunnel: None
Oif:10 Len:14
Encap Data: 02 01 02 03 04 09 00 00 5e 00 01 00 08 00
... [capture trimmed: first 60 of 3820 lines]

Cada entrada contiene un Type y el VRF al que pertenece. Ocho tipos aparecen en estos nodos, en estas proporciones — idénticas en los tres CEs cuando se cuentan:

Tunnel 558 Encap 27 NAT 22 Vrf 16 Receive 14 Composite 4 Drop 2 Resolve 2

Una ruta que resuelve a un siguiente salto Drop es un blackhole, y esa combinación vale la pena verificar siempre que un prefijo esté presente en rt pero el tráfico siga desapareciendo.

La tabla de interfaces virtuales: a qué se vincula el plano de datos, y contadores por interfaz.

Ventana de terminal
{"command":["vif","--list"]}
Vrouter Interface Table
Flags: P=Policy, X=Cross Connect, S=Service Chain, Mr=Receive Mirror
Mt=Transmit Mirror, Tc=Transmit Checksum Offload, L3=Layer 3, L2=Layer 2
D=DHCP, Vp=Vhost Physical, Pr=Promiscuous, Vnt=Native Vlan Tagged
Mnp=No MAC Proxy, Dpdk=DPDK PMD Interface, Rfl=Receive Filtering Offload, Mon=Interface is Monitored
Nf=Dont Fragment, Vof=VLAN insert/strip offload, Mq=MultiQ, L=MAC Learning Enabled
Proxy=MAC Requests Proxied Always, Fr=Force Recv, Mn=Mirror without Vlan Tag, TTL=TTL not modified
Mn=Mirror without Vlan Tag, Tun=Tunnel, NoArp=No ARP interface, RawIp=RAW IP interface(No L2 header)
Npers=Non-Persistent, NoRPF=No RPF Checks, SynC=Syn Cookies, Gro=GRO Enabled
NoIpfix=IPFIX disabled
evif0/1 Virtual: eth0 (Speed 10000, Duplex 1) Parent:vif0/-1
Type:Physical HWaddr:60:45:bd:eb:3f:f2 Driver: net_failsafe
CrossConnectIdx: 2 PartnerIdx: 14
Vrf:0 Mcast Vrf:0 VN:0x0 Flags:L3L2Vp Ref:7
MTU: 1500 EncMSS: 0 NH: 0
RX device packets:386252 bytes:355098338 errors:0
RX port packets:386252 errors:0
RX queue packets:385977 errors:0
RX queue errors to lcore 0 0 0 0 0 0 0 0 0 0 0 0 0 0
RX packets:386252 bytes:355098338 errors:0
TX packets:274826 bytes:132476854 errors:0
Drops:0
TX queue packets:27 errors:0
TX port packets:274826 errors:0
TX device packets:274826 bytes:132476854 errors:0
evif0/2 Virtual: vhost0 Parent:vif0/-1
Type:Host HWaddr:60:45:bd:eb:3f:f2 Driver: vr_dpdk_tap
CrossConnectIdx: 1 PartnerIdx: 15
Vrf:0 Mcast Vrf:0 VN:0x0 Flags:L3L2 Ref:6
MTU: 1500 EncMSS: 0 NH: 0
RX device packets:263582 bytes:122772389 errors:0
RX queue packets:263582 errors:0
RX queue errors to lcore 0 0 0 0 0 0 0 0 0 0 0 0 0 0
RX packets:263582 bytes:120136569 errors:0
TX packets:374276 bytes:343331787 errors:0
Drops:0
TX queue packets:370829 errors:3447
TX device packets:370820 bytes:341968151 errors:9
vif0/2 Ethernet: vethfrr0 Parent:vif0/-1
Type:Virtual HWaddr:0:0:5e:0:1:0 Driver: net_af_packet
Vrf:1 Mcast Vrf:1 VN:0x0 Flags:PL3Proxy Ref:10
MTU: 1500 EncMSS: 130 NH: 12
RX port packets:4919 errors:0
RX queue packets:4917 errors:0
RX queue errors to lcore 0 0 0 0 0 0 0 0 0 0 0 0 0 0
RX packets:907 bytes:153742 errors:0
TX packets:6 bytes:444 errors:0
Drops:905
TX queue packets:346 errors:0
TX port packets:3987 errors:0
Ingress ACL: 65 67
Egress ACL: 65 67
Service ACL: 65 67
vif0/4 Ethernet: vethbfd0 Parent:vif0/-1
Type:Virtual HWaddr:0:0:5e:0:1:0 Driver: net_af_packet
... [capture trimmed: first 60 of 378 lines]

La leyenda de indicadores en la parte superior vale la pena leerla una vez — Vp marca la interfaz física del vhost, Dpdk una gestionada por DPDK. Úsela para confirmar que el plano de datos ha reclamado la interfaz que espera, y para ver los contadores RX y TX que Linux no muestra porque el tráfico nunca llega al kernel.

Ventana de terminal
execcli mpls --help

La tabla MPLS de Argo. Accesible solo desde el equipompls no está en la API de depuración, por lo que a diferencia de rt, nh y vif anteriores, requiere SSH o la consola serie, a través de execcli.

No hay salida capturada aquí. En este despliegue el CE reenvía IPv4 con BGP y ECMP y no utiliza etiquetas MPLS, por lo que una captura mostraría una tabla vacía y no enseñaría nada. Su existencia y la forma de su argumento --help se verifican desde el menú de autocompletado propio del appliance; su salida con datos reales no se reproduce.