Estou tentando diagnosticar um problema com interrupções de conectividade de rede entre meu host macOS e uma VM convidada UTM. A conexão cairá repentinamente, com o host incapaz de alcançar a VM mais. Atualmente, suspeito de um problema com a tabela de roteamento no macOS.
Ao analisar a saída de route
, não consegui encontrar uma explicação para algumas Gateway
entradas estranhas, que não se parecem com IPs v4 ou v6?
$ netstat -rn -f inet
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default 192.168.178.1 UGScg en0
default link#24 UCSIg bridge100 !
127 127.0.0.1 UCS lo0
127.0.0.1 127.0.0.1 UH lo0
169.254 link#15 UCS en0 !
169.254.169.254 link#15 UHLSW en0 !
192.168.64 link#24 UC bridge100 !
192.168.64.1 62.3e.5f.73.14.64 UHLWI lo0
192.168.64.2 8a.c3.94.a.86.e2 UHLWIi bridge100 1088
192.168.178 link#15 UCS en0 !
192.168.178.1/32 link#15 UCS en0 !
192.168.178.1 dc:15:c8:ef:b8:1d UHLWIir en0 1197
192.168.178.24 1c:1a:df:76:df:f8 UHLWI en0 !
192.168.178.52/32 link#15 UCS en0 !
224.0.0/4 link#15 UmCS en0 !
224.0.0.251 1:0:5e:0:0:fb UHmLWI en0
224.0.0.251 1:0:5e:0:0:fb UHmLWIg bridge100
255.255.255.255/32 link#15 UCS en0 !
A VM é 192.168.64.2
-- observe o Gateway
de 8a.c3.94.a.86.e2
. O que é isso? Nunca vi um endereço IP formatado dessa forma, ou isso é algum outro tipo de identificador de destino?
Esses são provavelmente os endereços MAC resolvidos – o macOS usa uma única tabela como tabela de roteamento e como cache ARP.
Fundamentalmente, o propósito do campo 'Gateway' é definir um destino na camada MAC, não na camada de rede. Normalmente, fazemos isso indiretamente, especificando um endereço IP do gateway (ou uma interface) e deixando o sistema operacional usar o ARP para resolvê-lo para o endereço MAC real.
Por exemplo,
Gateway: 192.168.178.1
não significa "Enviar para 192.168.178.1", significa "Fazer uma pesquisa ARP de 192.168.178.1 e enviar para esse endereço MAC".Da mesma forma, o
link#24
campo não significa "Enviar via interface #24" – isso não é suficiente para Ethernet – na verdade significa "Fazer uma pesquisa ARP do IP de destino, obter o endereço MAC e enviar para esse MAC via interface #24".O resultado dessa pesquisa ARP geralmente é armazenado em cache em uma tabela separada (o cache ARP) em outros sistemas operacionais, mas isso significa que você tem duas tabelas que fazem mais ou menos a mesma coisa (mapear um IP para algum tipo de MAC), então parece que o macOS (e acredito que também o FreeBSD) escolheu usar a mesma tabela para ambos.
Então, se você tiver 192.168.64.2 como destino, depois que a
192.168.64 -> link#24
pesquisa for feita e uma consulta ARP for feita, o SO adicionará uma192.168.64.2 -> 8a.c3.94.a.86.e2
entrada direta para evitar ter que repetir a consulta ARP para pacotes futuros. (Observe oL
sinalizador "link-layer" e a presença de umExpire
campo para esta entrada.)Quanto ao motivo pelo qual os endereços são formatados de forma diferente, ao dar uma olhada no netstat do FreeBSD, parece que as interfaces "bridge" têm um tipo diferente de "ethernet" (IFT_BRIDGE vs IFT_ETHER) e suspeito que o netstat do macOS acabou usando duas funções diferentes para formatar o endereço em texto...