
Estoy intentando configurar un escritorio remoto en una distribución extensible de Debian, configuré el archivo /etc/gdm3/daemon.conf
.
[daemon]
WaylandEnable = false
[security]
DisallowTCP = false
[xdmcp]
Enable = true
Port = 177
[chooser]
[debug]
# Uncomment the line below to turn on debugging
# More verbose logs
# Additionally lets the X server dump core if it crashes
Enable = true
Pero cuando reinicio el sistema Debian, veo el siguiente resultado en netstat:
udp6 0 0 :::177 :::* 11059/gdm3
Eso es usar udp6 y no udp4.
Intenté deshabilitar inet6 en el sistema con las siguientes líneas en /etc/sysctl.conf
:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Actualizo la configuración con sysctl -p
y reinicio los servicios con sudo init 3; sudo unit 5
, pero nada cambia. Incluso reinicié la VM y sigue igual.
¿Alguna idea de cómo puedo forzar a xdcmp a escuchar en UDP v4 y no en udp6? Gracias de antemano.
Estoy haciendo esto para determinar la configuración necesaria en otra máquina con la misma distribución de Linux donde quiero configurar el acceso remoto al escritorio (por lo tanto, tendré el mismo problema). En realidad, puedo acceder con xvnc ejecutándose en el otro host, pero quiero configurar xdmcp para solicitar el inicio de sesión en acceso remoto.
El sistema exacto que estoy ejecutando:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 9.4 (stretch)
Release: 9.4
Codename: stretch
$ apt-cache show gdm3
Package: gdm3
Version: 3.22.3-3+deb9u1
. . .
Respuesta1
Creo que he encontrado la respuesta a mi pregunta. Descargué el código fuente de gdm3 y localicé dónde está configurado el socket para xdmcp.
static gboolean
open_port (GdmXdmcpDisplayFactory *factory)
{
struct sockaddr_storage serv_sa = { 0 };
g_debug ("GdmXdmcpDisplayFactory: Start up on host %s, port %d",
factory->priv->hostname ? factory->priv->hostname : "(null)",
factory->priv->port);
/* Open socket for communications */
#ifdef ENABLE_IPV6
factory->priv->socket_fd = do_bind (factory->priv->port, AF_INET6, &serv_sa);
if (factory->priv->socket_fd < 0)
#endif
factory->priv->socket_fd = do_bind (factory->priv->port, AF_INET, &serv_sa);
if G_UNLIKELY (factory->priv->socket_fd < 0) {
g_warning (_("Could not create socket!"));
return FALSE;
}
fd_set_close_on_exec (factory->priv->socket_fd);
if (factory->priv->use_multicast) {
setup_multicast (factory);
}
return TRUE;
}
Aquí se puede ver que si el paquete se creó para admitir IP6 y la operación de vinculación finaliza correctamente, el socket escuchará solo UDP6 y no UDP4.
La solución debería ser reconstruir el paquete sin soporte IP6, o modificar el código fuente para que se incluya un nuevo parámetro para habilitar/deshabilitar IP6 desde el archivo /etc/gdm3/daemon.conf
.
Se actualizó más información de los comentarios.
static int
create_socket (struct addrinfo *ai)
{
int sock;
sock = socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol);
if (sock < 0) {
g_warning ("socket: %s", g_strerror (errno));
return sock;
}
#if defined(ENABLE_IPV6) && defined(IPV6_V6ONLY)
if (ai->ai_family == AF_INET6) {
int zero = 0;
if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) < 0)
g_warning("setsockopt(IPV6_V6ONLY): %s", g_strerror(errno));
}
#endif
if (bind (sock, ai->ai_addr, ai->ai_addrlen) < 0) {
g_warning ("bind: %s", g_strerror (errno));
close (sock);
return -1;
}
return sock;
}
Y podemos ver lo siguiente en el sistema de archivos proc:
$ cat /proc/sys/net/ipv6/bindv6only
0
Entonces, parece que no se produce ningún doble vínculo. Debería ser porque IPV6_V6ONLY está definido.
Después de reconstruir el paquete sin soporte para ip6:
udp 0 0 0.0.0.0:177 0.0.0.0:* -