opengnsys-1.0.6 (#12) - Arranque remoto de clientes en varias subredes (#239) - Message List

Arranque remoto de clientes en varias subredes
 unsolved

Hola,

Al usar el comando "Arrancar" (modo Broadcast) compruebo que, como cabe esperar, se envía un Magic Packet a la IP "255.255.255.255:7". El servidor donde tengo OpenGnSys dispone de 3 interfaces de red:

  • eth0 <= con IP pública (interfaz asociada a la pasarela de salida)
  • eth1 <= con IP privada en una subred A (172.16.17.0/25)
  • eth2 <= con IP privada en una subred B (172.16.17.128/25)

Los clientes de OpenGnSys se encuentran en las subredes privadas A y B.

El problema es que al usar el comando "Arrancar", el Magic Packet con destino "255.255.255.255" se envía por la eth0 (ya que es la que está asociada a la pasarela default del servidor), no llegando el mensaje a los clientes que están en las subredes A y B.

Como solución he pensado en:

  • Hacer una regla DNAT de iptables, pero no sirve dado que sólo podría reenviar a la subred A o a la B, no a ambas.
  • Añadir en la tabla de encaminamiento una entrada para "255.255.255.255" para que se curse por eth1 o eth2, pero se tiene el mismo problema que antes (sólo podría reenviar a la subred A o a la B, no a ambas).
  • Usar el modo "Unicast" del comando "Arrancar", pero no funciona con los dispositivos de red que tengo.

El arranque manual de los equipos haciendo el envío del Magic Packet a la IP de difusión de la subred:

  • Subred A: wakeonlan -i 172.16.17.127 MAC_cliente
  • Subred B: wakeonlan -i 172.16.17.255 MAC_cliente

sí funciona correctamente. ¿Es posible hacer que el comando "Arrancar" use la IP de difusión de la subred del equipo cliente en lugar de la IP de difusión general 255.255.255.255?, ¿u otra solución posible al problema?

Gracias

Tree View Flat View (newer first) Flat View (older first)
  • Message #750

    Si, sí, claro, las máscaras de cada subred son muy diversas (de hecho, en las redes de ejemplo que ponía con las que trabajo, tengo máscaras de 25, tampoco de 24). Por eso digo que hay que pasar a la función la máscara, usándola para calcular la dirección de difusión de la subred:

    ip_broadcast = iph | ( ~ mask );

    Una aclaración más. La solución anterior funcionará bien en general, salvo en el caso particular de que el servidor de OpenGnSys esté conectado a varias subredes con el mismo tipo de direcciones (lo que es poco recomendable, pero puede suceder), e.g.:

    eth0: 10.0.0.1/25 eth1: 10.0.0.2/25

    En dicho caso, la única solución sería poder especificar la interfaz del servidor por la que se desea enviar el magic packet, como hace por ejemplo "ether-wake"

    etherwake -i eth0 -b MAC1 MAC2 ...

    Aunque sea poco probable, una buena solución al problema debe tener esto en cuenta.

    Como solución alternativa básica (mientras sea posible la solución anterior), puede crearse un procedimiento que ejecute un script que use ether-wake:

    MAC=$getMAC # ¿Hay algun script OpenGnSys que de la MAC del equipo cliente, similar a IP=$GetIpAddress?

    IFACE=ethX # Interfaz del servidor por la que enviar (por la que el cliente está accesible)

    # Envio del magic packet etherwake -i $IFACE -b $MAC

    Saludos

  • Message #747

    Buenas.

    Hay que tener en cuenta que no todas las redes tienen una máscara de 24 bits, por ejemplo nosotros usamos una de 22 bits (255.255.252.0), así que habría que comprobar cual es la máscara de la interfaz de red para obtener la dirección de difusión.

    Saludos.

  • Message #746

    La solución correcta, creo, sería modificar el fichero "/opt/opengnsys/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.cpp". Funciones:

    BOOLEAN Arrancar(SOCKET *socket_c, TRAMA* ptrTrama) {
           char *iph,*mac,*mar, msglog[LONSTD];
           BOOLEAN res;
           char modulo[] = "Arrancar()";
           iph = copiaParametro("iph",ptrTrama); // Toma dirección/es IP
           mac = copiaParametro("mac",ptrTrama); // Toma dirección/es MAC
           mar = copiaParametro("mar",ptrTrama); // Método de arranque (Broadcast o Unicast)
           res=Levanta(iph,mac,mar);
    	...
    }
    

    que usa:

    BOOLEAN Levanta(char* iph,char *mac, char* mar)
    

    y ésta a

    BOOLEAN WakeUp(SOCKET *s, char* iph,char *mac,char* mar)
    

    En esta última, se tiene:

    if(atoi(mar)==2)
      WakeUpCliente.sin_addr.s_addr = inet_addr(iph); //  Para hacerlo con IP
    else
      WakeUpCliente.sin_addr.s_addr = htonl(INADDR_BROADCAST); //  Para hacerlo con broadcast
    

    donde "INADDR_BROADCAST" es la dirección especial "255.255.255.255".

    La solución sería que en lugar de usar "INADDR_BROADCAST" (difusión genérica), se pusiese la dirección de difusión de la subred en la que está el equipo, calculada a partir de la IP del equipo "iph" y de su máscara "mask" (habría que pasarla como argumento a la función). Trabajandolas como enteros (binario), bastaría:

    ip_broadcast = iph | ( ~ mask );

    Saludos

  • Message #733

    Hola,

    La solución que tuve que darle es crearme un script (externo a OpenGnSys) en el servidor que mediante un menú arranca los equipos que necesito ejecutando comandos como:

    wakeonlan -i 192.168.1.255 01:02:03:04:05:06

    Lo ideal es que esto pudiese hacerse desde la interfaz de OpenGnSys. Si alguien supiese como hacerlo, me vendrí­a muy bien también.

    Un saludo

    Javier M

  • Message #693

    Hola Javier,

    tengo exactamente el mismo problema que tú, ¿conseguiste solucionarlo de alguna forma? Tal y como tú preguntabas: ¿Es posible hacer que el comando "Arrancar" use la IP de difusión de la subred del equipo cliente en lugar de la IP de difusión general 255.255.255.255?, ¿u otra solución posible al problema?

    Saludos

Tree View Flat View (newer first) Flat View (older first)

Attachments

No attachments created.