
Я пытаюсь настроить удаленный рабочий стол в дистрибутиве 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
Но когда я перезапускаю систему Debian, я вижу следующий вывод в netstat:
udp6 0 0 :::177 :::* 11059/gdm3
То есть используется udp6, а не udp4.
Я попробовал отключить 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 слушать UDP v4, а не udp6?? Заранее спасибо.
Я делаю это, чтобы выяснить, какие настройки нужны для другой машины с тем же дистрибутивом 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 и операция привязки завершилась корректно, сокет будет прослушивать только UDP6, а не UDP4.
Решением должно быть пересборка пакета без поддержки 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:* -