Mi equipo se ha encontrado con el siguiente problema. Hemos descubierto una solución operacionalmente aceptable que presentaré como respuesta a esta pregunta, pero esperamos una solución mejor, o al menos una mejor explicación de lo que está pasando.
Estamos intentando llevar algunos productos de Apple a nuestro laboratorio de pruebas para definir configuraciones para nuestro cliente. Los ejemplos y las pruebas se realizaron en un Macbook Air, pero se confirmó que el problema existe en algunos modelos antiguos de iPhone e iPads. Lo hemos puesto en una de las redes Ethernet inalámbricas del laboratorio, donde recibe la configuración DHCP de un Cisco 5921 ESR (router de software) como se esperaba, incluyendo la IP, la máscara de red y la ruta por defecto. El MacBook está en la red 192.168.1.0/24, y en los siguientes casos de prueba, la red remota es 192.168.2.0/24.
Los resultados completos de ifconfig y netstat -nr del MacBook están al final de esta pregunta.
El problema es que mientras puede comunicarse con otros dispositivos en su subred local, cualquier comunicación no local que debería ir a la pasarela está fallando. Todo tipo de tráfico de red a destinos no locales falla (ping, web, ssh). Y el wireshark que se ejecuta en el MacBook muestra que el tráfico ARP e IP esperado se produce cuando se comunica con los nodos locales, incluso con el propio router. Pero no se genera absolutamente ningún tráfico cuando se intenta conectar con tráfico no local, ni siquiera una petición ARP. Sin embargo, la tabla de enrutamiento parece especificar la interfaz correcta y la dirección de la puerta de enlace para la entrada por defecto.
Ejecución de route get
produce lo siguiente, primero para local (que funciona) y para no local (que no funciona):
MacBook-Air:~ user1$ route get 192.168.1.1
route to: 192.168.1.1
destination: 192.168.1.1
interface: en0
flags: <UP,HOST,DONE,LLINFO,WASCLONED,IFSCOPE,IFREF,ROUTER>
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 1500 1175
MacBook-Air:~ user1$ route get 192.168.2.80
route: writing to routing socket: not in table
Y ping
primero para los locales y luego para los no locales
MacBook-Air:~ user1$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: icmp_seq=0 ttl=255 time=2.904 ms
64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=3.963 ms
^C
--- 192.168.1.1 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 2.904/3.433/3.963/0.529 ms
MacBook-Air:~ user1$ ping 192.168.2.80
PING 192.168.2.80 (192.168.2.80): 56 data bytes
ping: sendto: No route to host
ping: sendto: No route to host
Request timeout for icmp_seq 0
ping: sendto: No route to host
Request timeout for icmp_seq 1
ping: sendto: No route to host
Request timeout for icmp_seq 2
^C
--- 192.168.2.80 ping statistics ---
4 packets transmitted, 0 packets received, 100.0% packet loss
Después de comprobar lo básico (máscara de red, rutas por defecto, cortafuegos), investigamos un poco más que nos llevó a esto pregunta
En él, el problema era que la ruta por defecto está etiquetada con la letra I. En mi sistema, este es también el caso, como se ve en esta salida parcial de netstat -nr:
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.1.1 UGScI 4 0 en0
Según la pregunta anterior, la letra I significa
I RTF_IFSCOPE Route is associated with an interface scope
Puedo confirmar esto ejecutando ping con la bandera -b, y ejecutando route get con la bandera -ifscope (notar esto es lo que nos llevó a buscar RTF_IFSCOPE que llevó al post de stackexchange anterior). Cuando se utilizan estas banderas, ambos comandos funcionan como se espera. Sin sus respectivas banderas, ambos comandos fallan.
MacBook-Air:~ user1$ route get -ifscope en0 192.168.2.80
route to: 192.168.2.80
destination: 192.168.2.80
gateway: 192.168.1.1
interface: en0
flags: <UP,GATEWAY,HOST,DONE,WASCLONED,IFSCOPE,IFREF>
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 1500 0
MacBook-Air:~ user1$ ping -b en0 192.168.2.80
PING 192.168.2.80 (192.168.2.80): 56 data bytes
64 bytes from 192.168.2.80: icmp_seq=0 ttl=61 time=3.206 ms
64 bytes from 192.168.2.80: icmp_seq=1 ttl=61 time=2.713 ms
64 bytes from 192.168.2.80: icmp_seq=2 ttl=61 time=3.246 ms
64 bytes from 192.168.2.80: icmp_seq=3 ttl=61 time=3.001 ms
64 bytes from 192.168.2.80: icmp_seq=4 ttl=61 time=2.444 ms
64 bytes from 192.168.2.80: icmp_seq=5 ttl=61 time=2.426 ms
64 bytes from 192.168.2.80: icmp_seq=6 ttl=61 time=2.205 ms
64 bytes from 192.168.2.80: icmp_seq=7 ttl=61 time=4.701 ms
64 bytes from 192.168.2.80: icmp_seq=8 ttl=61 time=4.964 ms
64 bytes from 192.168.2.80: icmp_seq=9 ttl=61 time=2.674 ms
^C
--- 192.168.2.80 ping statistics ---
10 packets transmitted, 10 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 2.205/3.158/4.964/0.898 ms
Así, RTF_IFSCOPE parece la versión BSD de Linux Network Namespaces o Cisco IOS VRFs (me doy cuenta de que puede ser anterior a estos). Pero en mi caso, la ruta por defecto está configurada por DHCP, así que no está claro cómo o por qué esto llegó a ser, ni cómo cambiarlo al ámbito por defecto (o, alternativamente, hacer que todas las aplicaciones utilicen el ámbito especial).
Como prueba, he añadido manualmente una segunda ruta por defecto:
sudo route -r add default 192.168.1.1
La ruta resultante no tiene una bandera I asociada:
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.1.1 UGSc 4 0 en0
default 192.168.1.1 UGScI 4 0 en0
Esto soluciona el problema, permitiendo ahora que toda la comunicación de red no local funcione. No consideramos que sea una solución operativa aceptable, especialmente para iPhone y iPad, ya que, por lo que sabemos, sería necesario añadir aplicaciones a los dispositivos para poder añadir rutas manuales.
Sospechamos que algo en nuestro entorno de red está causando este comportamiento. Pero no estamos seguros de qué es.
Los siguientes resultados de ifconfig y netstat -nr son del Macbook Air:
MacBook-Air:~ user1$ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
OHC4: flags=0<> mtu 0
EHC36: flags=0<> mtu 0
OHC6: flags=0<> mtu 0
EHC38: flags=0<> mtu 0
en0: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
ether 04:0c:ce:cf:be:ac
inet 192.168.1.52 netmask 0xffffff00 broadcast 192.168.1.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
p2p0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2304
ether 06:0c:ce:cf:be:ac
media: autoselect
status: inactive
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 2000
inet6 fe80::d380:8cb1:83eb:3753%utun0 prefixlen 64 scopeid 0xa
nd6 options=201<PERFORMNUD,DAD>
MacBook-Air:~ user1$ netstat -nr
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 192.168.1.1 UGScI 4 0 en0
127 127.0.0.1 UCS 0 0 lo0
127.0.0.1 127.0.0.1 UH 1 130 lo0
169.254 link#8 UCS 0 0 en0
192.168.1 link#8 UCS 3 0 en0
192.168.1.1/32 link#8 UCS 1 0 en0
192.168.1.1 0:1b:ac:1:79:9a UHLWIir 3 60 en0
192.168.1.52/32 link#8 UCS 0 0 en0
192.168.1.53 2c:be:8:aa:47:98 UHLWI 0 2 en0 472
192.168.1.54 88:1f:a1:7a:6d:5a UHLWI 0 0 en0 1200
192.168.1.56 2c:be:8:9d:ff:78 UHLWI 0 10 en0 817
224.0.0/4 link#8 UmCS 1 0 en0
224.0.0.251 1:0:5e:0:0:fb UHmLWI 0 0 en0
255.255.255.255/32 link#8 UCS 0 0 en0
Internet6:
Destination Gateway Flags Netif Expire
default fe80::%utun0 UGcI utun0
::1 ::1 UHL lo0
fe80::%lo0/64 fe80::1%lo0 UcI lo0
fe80::1%lo0 link#1 UHLI lo0
fe80::%utun0/64 fe80::d380:8cb1:83eb:3753%utun0 UcI utun0
fe80::d380:8cb1:83eb:3753%utun0 link#10 UHLI lo0
ff01::%lo0/32 ::1 UmCI lo0
ff01::%utun0/32 fe80::d380:8cb1:83eb:3753%utun0 UmCI utun0
ff02::%lo0/32 ::1 UmCI lo0
ff02::%utun0/32 fe80::d380:8cb1:83eb:3753%utun0 UmCI utun0