Configure o xdmcp para o desktop remoto forçando o udp v4

0

Eu estou tentando configurar o desktop remoto em uma distribuição de extensão do Debian, eu configurei o arquivo /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

Mas quando eu reinicio o sistema debian, vejo a seguinte saída no netstat:

udp6       0      0 :::177                  :::*                                11059/gdm3    

Isso é usando o udp6 e não o udp4.

Eu tentei desativar o inet6 no sistema com as seguintes linhas em /etc/sysctl.conf :

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Atualizo as configurações com sysctl -p e reinicio os serviços com sudo init 3; sudo unit 5 , mas nada muda. Eu reiniciei a VM mesmo, e ainda é o mesmo.

Alguma idéia de como eu posso forçar o xdcmp a estar escutando no UDP v4 e não no udp6? Agradecemos antecipadamente.

Eu estou fazendo isso para descobrir as configurações necessárias em outra máquina com a mesma distribuição Linux onde eu quero configurar o acesso remoto à área de trabalho (assim, eu vou pegar o mesmo problema). Na verdade eu posso acessar com xvnc correndo para o outro host, mas eu quero configurar o xdmcp para solicitar o login no acesso remoto.

O sistema exato em execução:

$ 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
. . .
    
por Alejandro Visiedo 02.06.2018 / 15:39

1 resposta

1

Acho que encontrei a resposta para minha pergunta. Eu fiz o download do código-fonte do gdm3 e localizei onde o soquete está configurado para o 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;
}

Aqui pode ser visto que, se o pacote foi construído para suportar o IP6 e a operação de ligação terminar corretamente, o socket estará escutando apenas o UDP6, e não o UDP4.

A solução deve ser reconstruir o pacote sem o suporte IP6 ou modificar o código-fonte para que um novo parâmetro seja incluído para ativar / desativar o IP6 do arquivo /etc/gdm3/daemon.conf .

Atualizou mais informações dos comentários.

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;
}

E podemos ver o seguinte no sistema de arquivos proc:

$ cat /proc/sys/net/ipv6/bindv6only 
0

Então, parece que não há ligação dupla. Deve ser porque IPV6_V6ONLY está definido.

Após reconstruir o pacote sem suporte a ip6:

udp        0      0 0.0.0.0:177             0.0.0.0:*                           - 
    
por 02.06.2018 / 16:22