Richten Sie xdmcp für Remote-Desktop ein und erzwingen Sie UDP v4

Richten Sie xdmcp für Remote-Desktop ein und erzwingen Sie UDP v4

Ich versuche, Remotedesktop in einer Debian-Stretch-Distribution einzurichten. Ich habe die Datei eingerichtet /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

Aber wenn ich das Debian-System neu starte, sehe ich die folgende Ausgabe auf netstat:

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

Dabei wird UDP6 und nicht UDP4 verwendet.

Ich habe versucht, inet6 im System mit den folgenden Zeilen zu deaktivieren /etc/sysctl.conf:

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

Ich aktualisiere die Einstellungen mit sysctl -pund starte die Dienste mit neu sudo init 3; sudo unit 5, aber es ändert sich nichts. Ich habe sogar die VM neu gestartet, aber immer noch dasselbe.

Irgendeine Idee, wie ich xdcmp zwingen kann, auf UDP v4 und nicht auf UDP6 zu lauschen?? Vielen Dank im Voraus.

Ich mache das, um die erforderlichen Einstellungen für einen anderen Rechner mit derselben Linux-Distribution herauszufinden, auf dem ich den Fernzugriff auf den Desktop einrichten möchte (also werde ich das gleiche Problem haben). Eigentlich kann ich mit xvnc auf den anderen Host zugreifen, aber ich möchte xdmcp so einrichten, dass die Anmeldung beim Fernzugriff angefordert wird.

Das genaue System, das ich verwende:

$ 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
. . .

Antwort1

Ich glaube, ich habe die Antwort auf meine Frage gefunden. Ich habe den Quellcode für gdm3 heruntergeladen und herausgefunden, wo der Socket für xdmcp eingerichtet ist.

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

Hier ist zu sehen, dass der Socket nur auf UDP6 und nicht auf UDP4 lauscht, wenn das Paket zur Unterstützung von IP6 erstellt wurde und der Bindevorgang ordnungsgemäß abgeschlossen wird.

Die Lösung sollte darin bestehen, das Paket ohne IP6-Unterstützung neu zu erstellen oder den Quellcode so zu ändern, dass ein neuer Parameter zum Aktivieren/Deaktivieren von IP6 aus der Datei enthalten ist /etc/gdm3/daemon.conf.


Weitere Informationen aus den Kommentaren aktualisiert.

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

Und wir können Folgendes im Proc-Dateisystem sehen:

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

Es sieht also so aus, als ob kein Dual Bind hergestellt wird. Dies sollte der Fall sein, da IPV6_V6ONLY definiert ist.


Nach dem Neuaufbau des Pakets ohne IP6-Unterstützung:

udp        0      0 0.0.0.0:177             0.0.0.0:*                           - 

verwandte Informationen