원격 데스크톱에 xdmcp udp v4 강제 적용

원격 데스크톱에 xdmcp udp v4 강제 적용

Debian Stretch 배포판에 원격 데스크톱을 설정하려고 하는데 파일을 설정했습니다 /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

하지만 데비안 시스템을 다시 시작하면 netstat에 다음과 같은 출력이 표시됩니다.

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

udp4 대신 udp6을 사용하고 있습니다.

다음 줄을 사용하여 시스템에서 inet6을 비활성화해 보았습니다 /etc/sysctl.conf.

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

새로 고침 설정을 사용하고 sysctl -p서비스를 다시 시작했지만 sudo init 3; sudo unit 5아무 것도 변경되지 않았습니다. 가상 머신을 다시 시작해도 여전히 동일합니다.

xdcmp가 udp6 대신 UDP v4를 수신하도록 강제하는 방법을 아시나요? 미리 감사드립니다.

나는 데스크톱에 대한 원격 액세스를 설정하려는 동일한 Linux 배포판을 사용하는 다른 컴퓨터에 어떤 설정이 필요한지 파악하기 위해 이 작업을 수행하고 있습니다. 따라서 동일한 문제가 발생합니다. 실제로 다른 호스트로 실행되는 xvnc를 사용하여 접속할 수 있는데 xdmcp를 설정하여 원격 접속 로그인을 요청하고 싶습니다.

내가 실행 중인 정확한 시스템은 다음과 같습니다.

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

답변1

내 질문에 대한 답을 찾은 것 같아요. gdm3의 소스 코드를 다운로드하고 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;
}

여기서 볼 수 있듯이 패키지가 IP6을 지원하도록 빌드되고 바인딩 작업이 올바르게 완료되면 소켓은 UDP4가 아닌 UDP6만 수신합니다.

해결 방법은 IP6 지원 없이 패키지를 다시 빌드하거나 파일에서 IP6을 활성화/비활성화하는 새 매개변수를 포함하도록 소스 코드를 수정하는 것입니다 /etc/gdm3/daemon.conf.


의견의 추가 정보로 업데이트되었습니다.

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

proc 파일 시스템에서 다음을 볼 수 있습니다.

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

따라서 이중 바인딩이 발생하지 않는 것 같습니다. IPV6_V6ONLY가 정의되어 있기 때문입니다.


IP6 지원 없이 패키지를 다시 빌드한 후:

udp        0      0 0.0.0.0:177             0.0.0.0:*                           - 

관련 정보