UDP v4를 강제하는 원격 데스크톱용 xdmcp 설정

UDP v4를 강제하는 원격 데스크톱용 xdmcp 설정

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아무 것도 변경되지 않습니다. VM을 재부팅했는데도 여전히 동일합니다.

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:*                           - 

관련 정보