Linux, dhclient: cómo averiguar si mi configuración de DHCP es válida (sin interrupciones de red)


1

Trabajo en un sistema Linux con configuración de red "clásica", es decir, no hay ningún demonio de configuración con todas las funciones que se ejecute como NetworkManager. La mayor parte de la configuración la realiza dhclient.

Necesito detectar situaciones en las que tengo que volver a ejecutar dhclient. (subred diferente debido a cambios en la configuración del cable o la red). Quiero ejecutar la verificación cada 10 minutos sin cortar las conexiones existentes.

Lo que básicamente necesito es una respuesta a preguntas como ¿Es válida mi dirección IP y mi puerta de enlace para la red a la que estoy conectado? o Si renovara mi contrato de arrendamiento de DHCP, ¿obtendré la misma IP nuevamente? . Para responder a la primera pregunta, uno podría hacer ping a alguna IP pública como 8.8.8.8, pero necesito una solución que también funcione en grandes redes privadas de las que no tengo conocimiento. Incluso la puerta de enlace predeterminada no siempre puede ser pingable.

Si supiera que mi ip no es válida, haría "dhclient -r eth0; dhclient eth0" para renovar el contrato de arrendamiento. Sin embargo, esto me desconecta de Internet por un corto tiempo, si ya estoy conectado correctamente.

Descubrí que dhcping es una buena herramienta para preguntar al servidor DHCP sin usar el resultado. Sin embargo, obtengo resultados extraños, que incluso pueden calificar para otra pregunta. Parece que dhcping solo funciona bien si conozco la ip de los servidores de antemano, por lo que falta una herramienta para el DESCUBRIMIENTO DHCP. (y el uso de direcciones de servidor de difusión no es confiable)

Sé que puedo hacer hdcp discover con nmap, sin embargo, instalar nmap no es una buena idea por razones de seguridad.

Preguntas que me gustaría hacer:

  • ¿Hay alguna forma de validar mi ip configurada en el contexto de la red conectada?
  • ¿Existe la posibilidad de renovar el contrato de arrendamiento de dhclient a pedido?
  • ¿Hay herramientas que realizan una transmisión de descubrimiento de dhcp e imprimen el resultado?

Anexo :

A diferencia de los resultados de mi primera prueba, simplemente llamar a dhclient -v no resuelve mi problema. Para aclarar esto, mi problema inicial es que dhclient se ejecuta en modo de fondo (sin renovar el contrato de arrendamiento todo el tiempo). Llamar a dhclient da como resultado:

dhclient (30887) ya se está ejecutando, saliendo.

Sin embargo, esto no es completamente repoducible. A veces tiene éxito. (Es por eso que primero pensé que la opción -v marcaría la diferencia, no lo hace)

Entonces mi pregunta es: si tengo este problema que ya se está ejecutando, aunque dclient actualmente no está haciendo nada, ¿cómo desencadenar una renovación para el proceso en segundo plano?

(La razón detrás de esto es que un cliente DHCP debe vincularse al puerto 68. Cuando este puerto está vinculado por el demonio de fondo dhclient, no se puede ejecutar otra instancia en primer plano)

Respuestas:


2

La respuesta a las dos primeras preguntas es la misma: usar

dhclient -v eth0

( -v significa detallado, no todas las distribuciones de Linux lo tienen), en lugar de dhclient -r eth0; dhclient eth0 . Este formulario más corto primero solicita una reasignación de la dirección IP actual, y luego comienza una negociación con el enrutador solo si esto no puede asignar la dirección IP solicitada, ya sea porque ya está tomada o porque está fuera del rango DHCP de la puerta de enlace.

Le sugiero que use la bandera -v para que pueda ver este intercambio, es bastante explícito.

En cuanto a su tercer punto, AFAIK no tiene una opción de ejecución en seco para ningún cliente dhcp. Sin embargo, si realmente insiste en eso, puede hacer lo siguiente: configurar una interfaz macvlan e iniciar una instancia de dhcp para esta nueva interfaz:

ip addr flush dev eth0
ip link add link eth0 mac0 mode macvlan
dhclient -v mac0

En este punto, puede ver la configuración proporcionada por el servidor DHCP local, la red, la máscara de red, la puerta de enlace y los servidores DNS en la nueva interfaz virtual. Cuando acabes,

ip link del dev mac0
dhclient -v eth0

restaurará exactamente la configuración que tenía antes, si el servidor DHCP puede distribuir su antigua dirección IP. De lo contrario, estás atrapado con uno nuevo ;-). Todo esto es trivial para el guión, de verdad.

Y, por cierto, si su problema es la persistencia de las conexiones ssh , le sugiero que compruebe mosh en su lugar.


¡Gracias por esta gran y completa respuesta! Es un poco confuso que dhclient cambie el comportamiento simplemente agregando el indicador -v, pero esto es exactamente lo que necesito. Y por cierto, no se trata de ssh, pero me alegra que hayas mencionado a mosh. Este parece ser un proyecto interesante.
philipp

@philipp Perdón por llevarte al error: dhclient cambia el comportamiento cuando sueltas el distintivo -r ; la bandera -v solo muestra la negociación. Cuando haces dhclient -r eth0 ,; dhclient eth0 la segunda invocación no puede solicitar un arrendamiento de su antigua dirección IP, porque acaba de renunciar a ella.
MariusMatutiae

Gracias: de hecho, no hay diferencia, y esta todavía no es la solución para mi problema. Todavía recibo el mensaje "ya ejecutándose" la mayoría de las veces, que es mi problema raíz. Agregué esto a mi pregunta
philipp

0

La mejor solución que encontré hasta ahora es usar una implementación de descubrimiento de dhcp en python:

https://code.activestate.com/recipes/577649-dhcp-query/

Lo cual es bastante bueno, ya que ya uso Python. Pero tal vez todavía me falta una solución simple y todo esto es demasiado complicado.

editar: esto realmente no ayudó. Mi principal problema es que un proceso en segundo plano de dhclient está ocupando el puerto 68, lo que impide que cualquier otro proceso realice el descubrimiento de DHCP, y no conozco ninguna forma de liberarlo sin abandonar la configuración de red.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.