Evitar que un programa (vmet-natd) reciba eventos de que la red ha cambiado de estado en Linux

Evitar que un programa (vmet-natd) reciba eventos de que la red ha cambiado de estado en Linux

Nuestro punto de acceso Wi-Fi está configurado con un tiempo de concesión de DHCP muy agresivo de 10 minutos. No es un problema en sí mismo, ya que la dirección IP sigue siendo la misma cuando se renueva el contrato de arrendamiento. Pero ejecuto VMware Workstation y un intervalo tan corto provoca frecuentes interrupciones de la red dentro de las máquinas virtuales. La raíz del problema está en el demonio vmet-natd. Detecta que hubo ALGÚN evento de red y asume que fue una reconexión. La consecuencia es que el adaptador de red virtual en la VM se desconecta de la red "física" y luego se vuelve a conectar inmediatamente. Y todas mis sesiones TCP se eliminan en la VM.

Actualmente estoy ejecutando VMware Workstation 15.1.0 en un host Xubuntu 18.04.

Estos son los eventos de syslog cuando esto ocurre.

Jun 25 15:23:18 laptop wpa_supplicant[1039]: wlp2s0: WPA: Group rekeying completed with 6c:3b:6b:XX:XX:XX [GTK=CCMP]
Jun 25 15:26:06 laptop dhclient[6554]: DHCPREQUEST of 192.168.XXX.XXX on wlp2s0 to 192.168.XXX.XXX port 67 (xid=0x6f72XXXX)
Jun 25 15:26:06 laptop dhclient[6554]: DHCPACK of 192.168.XX.XX from 192.168.XX.XX
Jun 25 15:26:06 laptop NetworkManager[1038]: <info>  [1561465566.1687] dhcp4 (wlp2s0):   address 192.168.XX.XX
Jun 25 15:26:06 laptop NetworkManager[1038]: <info>  [1561465566.1687] dhcp4 (wlp2s0):   plen 24 (255.255.255.0)
Jun 25 15:26:06 laptop NetworkManager[1038]: <info>  [1561465566.1687] dhcp4 (wlp2s0):   gateway 192.168.XX.XX
Jun 25 15:26:06 laptop vmnet-natd: RTM_NEWADDR: index:4, addr:192.168.XXX.XXX
Jun 25 15:26:06 laptop NetworkManager[1038]: <info>  [1561465566.1688] dhcp4 (wlp2s0):   lease time 600
Jun 25 15:26:06 laptop NetworkManager[1038]: <info>  [1561465566.1688] dhcp4 (wlp2s0):   nameserver '192.168.XXX.XXX'
Jun 25 15:26:06 laptop NetworkManager[1038]: <info>  [1561465566.1688] dhcp4 (wlp2s0):   nameserver 'XXX.XXX.XXX.XXX'
Jun 25 15:26:06 laptop NetworkManager[1038]: <info>  [1561465566.1688] dhcp4 (wlp2s0):   nameserver 'XXX.XXX.XXX.XXX'
Jun 25 15:26:06 laptop NetworkManager[1038]: <info>  [1561465566.1688] dhcp4 (wlp2s0): state changed bound -> bound
Jun 25 15:26:06 laptop dbus-daemon[1020]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service' requested by ':1.11' (uid=0 pid=1038 comm="/usr/sbin/NetworkManager --no-daemon " label="unconfined")
Jun 25 15:26:06 laptop systemd[1]: Starting Network Manager Script Dispatcher Service...
Jun 25 15:26:06 laptop dhclient[6554]: bound to 192.168.XXX.XXX -- renewal in 267 seconds.
Jun 25 15:26:06 laptop dbus-daemon[1020]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Jun 25 15:26:06 laptop systemd[1]: Started Network Manager Script Dispatcher Service.
Jun 25 15:26:06 laptop nm-dispatcher: req:1 'dhcp4-change' [wlp2s0]: new request (1 scripts)
Jun 25 15:26:06 laptop nm-dispatcher: req:1 'dhcp4-change' [wlp2s0]: start running ordered scripts...
Jun 25 15:26:06 laptop kernel: [10747.491441] userif-2: sent link down event.
Jun 25 15:26:06 laptop kernel: [10747.491445] userif-2: sent link up event.

Hay unhilo en foros de vmwaresobre esto sin solución.

¿Cómo evito esto? Mi google-fu no fue lo suficientemente bueno para encontrar la solución.

Podría haber varias formas de solucionar este problema.

  1. Corrija vmnet-natd para realizar un manejo especial para tales eventos. (El soporte de VMware no es útil).
  2. Configure vmnet-natd para ignorar completamente los eventos de red, pero parece que no existe esa opción.
  3. No genere eventos de cambio de red si nada cambió en la nueva clave de asociación de Wi-Fi o en la extensión de concesión de DHCP al parchear/configurar la pila de red de Linux del kernel/espacio de usuario.
  4. Parchear/configurar la pila de red de Linux del kernel/espacio de usuario para no enviar eventos de red (o algún subconjunto de ellos) a vmnet-natd.

¿Alguien puede indicarme el camino de menor resistencia para resolver esta molestia?

Actualización 1:El adaptador de red en la VM está configurado en modo NAT, no puedo ejecutarlo en ningún otro modo ya que no puedo exponer ninguna de mis VM directamente en la red de la oficina. El servidor DHCP para el host es el punto de acceso en sí y permanece igual todo el tiempo. La red se gestiona con Network Manager.

Respuesta1

El artículo Reparar VMWare Player en Linux cuando se usan direcciones DHCP describe el problema y ofrece una solución.

Este problema, introducido con VMwarePlayer v8+, se describe como:

Cada vez que se renueva la dirección DHCP de cualquiera de los adaptadores de red de la máquina host, todas las máquinas virtuales reciben una desconexión y conexión de la red, lo que deja la red inutilizable durante aproximadamente 20 segundos con cada renovación.

Esto es particularmente destructivo para redes que tienen un tiempo de concesión de DHCP corto como la suya, donde aproximadamente cada 5 minutos todas las máquinas virtuales perderían su conectividad de red por un corto tiempo.

Este comportamiento se puede ver claramente en su /var/log/messages:

Jun 25 15:26:06 laptop kernel: [10747.491441] userif-2: sent link down event.
Jun 25 15:26:06 laptop kernel: [10747.491445] userif-2: sent link up event.

El autor del artículo encontró la cadena userif-3en el archivo userif.c, incluido en el código tar del archivo /usr/lib/vmware/modules/source/vmnet-only.tar que se incluye con cada instalación de VMWarePlayer.

El código que encontró se veía así:

965 int
966 VNetUserIfSetUplinkState(VNetPort *port, uint8 linkUp)
967 {
...
1010    LOG(0, (KERN_NOTICE "userif-%d: sent link %s event.\n",
1011         userIf->port.id, linkUp ? "up" : "down"));
1012 
1013    return retval;
1014 }

Luego creó un archivo de parche y aplicó el código de la siguiente manera:

cd /tmp
tar xf /usr/lib/vmware/modules/source/vmnet.tar
patch -p0 < vmware-vmnet-only.patch
tar cf vmnet.tar vmnet-only
cp /tmp/vmnet.tar /usr/lib/vmware/modules/source/vmnet.tar
/usr/bin/vmware-modconfig --console --install-all
systemctl restart vmware    ## or 'service vmware restart'

Enumero su parche a continuación:

-- vmnet-only/userif.c  2017-12-21 17:02:28.555820933 +0100
+++ vmnet-only.jjk/userif.c 2017-12-15 13:22:13.257724953 +0100
@@ -973,6 +973,9 @@
    userIf = (VNetUserIF *)port->jack.private;
    hubJack = port->jack.peer;

+   /* never send link down events */
+   if (!linkUp) return 0;
+
    if (port->jack.state == FALSE || hubJack == NULL) {
       return -EINVAL;
    }

información relacionada