Haga ping a una interfaz desde la otra, el mismo host

Haga ping a una interfaz desde la otra, el mismo host

Tengo una computadora (con Linux) con dos interfaces Ethernet. Quiero probarlos sin involucrar a otra PC.

La puesta en marcha:

  (192.168.1.5) eth1-------.
Linux PC/device            | loopback cable
  (192.168.1.6) eth2-------'

Corro

ping -I eth1 192.168.1.6

pero no llega respuesta.

No entiendo cuál es el problema. ¿Por qué Linux impide esta acción? ¿Como puedó resolver esté problema?

Respuesta1

¿Por qué?

No puedo explicarlo completamente.


¿Como puedó resolver esté problema?

GeneralmenteLinux alcanza internamente las direcciones IP asignadas localmentey simplemente funciona. Parece que el problema aparece cuando uno realmente necesita que los paquetes viajen hacia el exterior (por ejemplo, a través de un cable) y regresen, como en su caso.

Puede hacerlo funcionar utilizando espacios de nombres de red. me ajustéesta otra respuesta miaa tus necesidades.

Notas:

  • Probé en Debian 10.
  • ip …Probablemente necesitará dónde está el comando sudo ip …. Para facilitar la lectura, omito sudo. Trabaje en un shell elevado o defina (temporalmente) alias ip='sudo ip'para poder copiar y pegar cómodamente.
  • Supongo que no interfiere ninguna automatización, es decir, no hay ningún demonio que intente configurar las interfaces relevantes a su manera.
  • Para ejecutar un comando en un espacio de nombres de red no predeterminado, uso ip netns exec …. Es posible ejecutar un shell de esta manera; entonces todo lo que ejecute desde el shell utilizará el espacio de nombres de la red. Esta respuesta se utiliza ip netns exec …cada vez que necesitamos ejecutar algo en un espacio de nombres de red no predeterminado.

Proceda así:

  1. Definir variables útiles. Aquí ns1hay un nombre arbitrario para un espacio de nombres; eth1y eth2son los dispositivos que desea utilizar.

    netns=ns1
    dev1=eth1
    dev2=eth2
    
  2. Cree un nuevo espacio de nombres de red.

    ip netns add "$netns"
    
  3. Baje los dispositivos en el espacio de nombres predeterminado.

    ip link set dev "$dev1" down
    ip link set dev "$dev2" down
    
  4. Agregue uno de los dispositivos al nuevo espacio de nombres (desaparecerá del espacio de nombres predeterminado). Aquí elijo pasar $dev2al nuevo espacio de nombres.

    ip link set dev "$dev2" netns "$netns"
    
  5. Asignar direcciones IP.

                           ip address add 192.168.1.5/24 dev "$dev1"
    ip netns exec "$netns" ip address add 192.168.1.6/24 dev "$dev2"
    
  6. Confirme que los dos dispositivos estén donde deberían estar, con las direcciones IP correctas.

                           ip address show
    ip netns exec "$netns" ip address show
    # examine output
    
  7. Conecte físicamente las dos interfaces con un cable, si aún no lo ha hecho.

  8. Levante las interfaces. El espacio de nombres contiene su propio dispositivo de bucle invertido lo. Lo menciono por si acaso, porque en general los programas pueden querer confiar en él.

                           ip link set dev "$dev1" up
    ip netns exec "$netns" ip link set dev "$dev2" up
    ip netns exec "$netns" ip link set dev      lo up
    
  9. Consultar rutas. En mi Debian 10 rutas sanas aparecen automáticamente. Este comando

    ip route show
    

    impresiones (entre otras líneas)

    192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.5
    

    y este comando

    ip netns exec "$netns" ip route show
    

    huellas dactilares

    192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.6
    
  10. Haga ping de una forma u otra.

                           ping 192.168.1.6
    ip netns exec "$netns" ping 192.168.1.5
    

    Puedes usarlo -Ipero no es necesario. La dirección 192.168.1.6no está asignada a ninguna interfaz en el espacio de nombres de red predeterminado; y 192.168.1.5no está asignado en el espacio de nombres no predeterminado.

Y esto es todo. Deberia de funcionar. Mis pruebas indican que estos pingrealmente usan el cable. Puedo decirlo porque:

  • desconectar el cable hace que dejen de fluir; a modo de comparación: los pings "internos" (desde una interfaz cableada a su propia dirección IP) fluyen incluso sin cable;
  • iptraf-ngmonitorear la interfaz a la que se hace ping muestra solicitudes de eco ICMP y respuestas de eco ICMP; a modo de comparación: la herramienta no muestra pings "internos" para una interfaz cableada.

Limpieza básica: elimine el espacio de nombres de la red.

ip netns del "$netns"

Esto moverá el segundo dispositivo nuevamente al espacio de nombres de red predeterminado.

Ninguno de los comandos que utilizamos implementa un cambio permanente, por lo que en caso de cualquier problema simplemente reinicie.

información relacionada