LINUX.ORG.RU
ФорумAdmin

Как узнать и настроить имя домена?

 , ,


0

1

Я хочу узнать, как клиентский компьютер находит контроллер домена («В Unix-подобных системах Samba 4.x может работать в качестве контроллера домена»).

RFC 2782 пишет, что

If ... LDAP client wants to discover a LDAP server ... for the domain example.com., it does a lookup of _ldap._tcp.example.com

Значит, перед тем, как обращаться к DNS-серверу, нужно узнать, какое у компьютера доменное имя, правильно?

$ domainname
bash: domainname: command not found
#include <unistd.h>

int getdomainname(char *name, size_t len);
int setdomainname(const char *name, size_t len);

POSIX не описывает эти вызовы

https://ru.manpages.org/setdomainname/2

в библиотеке glibc реализована функция getdomainname(), которая возвращает копию поля domainname, которую возвращает вызов uname(2).

$ uname --nodename
localhost
...
       -n, --nodename
              print the network node hostname

https://man7.org/linux/man-pages/man2/uname.2.html

#include <sys/utsname.h>
int uname(struct utsname *buf);
...
char nodename[];   /* Name within "some implementation-defined network" */
...
#ifdef _GNU_SOURCE
       char domainname[]; /* NIS or YP domain name */
#endif

$ uname --domainname
uname: unrecognized option '--domainname'
Что такое NIS? Что такое YP? NIS/YP - «LDAP came to replace it»

https://www.kernel.org/doc/html/latest/admin-guide/sysctl/kernel.html#domainn...

$ ls /proc/sys/kernel/domainname
/proc/sys/kernel/domainname
$ file /proc/sys/kernel/domainname
/proc/sys/kernel/domainname: empty
# echo "linux.org.ru" > /proc/sys/kernel/domainname
$ cat /proc/sys/kernel/domainname
linux.org.ru
После этого команда dnsdomainname всё равно ничего не показывает, наверное она для чего-то другого?

«DNS (Internet Domain Name Server) domainname, not to be confused with the NIS (Network Information Service) or YP (Yellow Pages) domainname. These two domain names are in general different. For a detailed discussion see the hostname(1) man page.»

https://linux.die.net/man/1/hostname The complete Fully Qualified Domain Name (FQDN) of the system is returned with «hostname --fqdn»

$ hostname --fqdn
localhost

В общем, предлагают прописывать hostname в файле /etc/hostname, а
FQDN прописывать в файле /etc/hosts после внешнего IP-адреса

Прописал, ничего не поменялось, что и логично.

Внутри файле /etc/hosts написано:

In the presence of the domain name service or NIS, this file may not be consulted at all; see /etc/host.conf for the resolution order.

Утилиты domainname в генте нет:

[ebuild   R    ] sys-apps/net-tools-2.10::gentoo  USE="arp hostname ipv6 nls -nis -plipconfig (-selinux) -slattach -static" 225 KiB
...
$ equery files sys-apps/net-tools | grep domainname
/bin/dnsdomainname
/usr/share/man/de_DE/man1/dnsdomainname.1
/usr/share/man/fr_FR/man1/dnsdomainname.1
/usr/share/man/man1/dnsdomainname.1
/usr/share/man/pt_BR/man1/dnsdomainname.1

Может быть всё проще, и можно настроить получение имени домена с DHCP-сервера? Ну нет, сначала надо понять, как это имя устанавливается и извлекается. А затем уже автоматизировать эти процессы применяя программу dhcp-клиент.

В systemd есть какая-то hostnamectl, однако имя хоста, это ведь не то же самое, что FQDN? Хотя там и предлагают использовать «sequence of ... labels separated by single dots that forms a valid DNS FQDN».

Ещё в systemd есть /etc/systemd/resolved.conf, где можно прописать два вида доменов, причём один из этих видов доменов нужен для «определения» FQDN.

Если я правильно понял, то надо:
1) имя домена прописать в файл /etc/systemd/resolved.conf
2) что-то сделать с systemd, чтобы она обновила конфигурацию, вроде

$ sudo systemctl restart systemd-resolved
$

Сделал, перезапустил, ничего не поменялось (hostname --fqdn показывает короткое имя).

Gentoo wiki [как обычно] демонстрирует низкое качество документации и обходит стороной этот вопрос.

$ sudo hostnamectl hostname shushundr.linux.org.ru
$ hostname
shushundr.linux.org.ru
$ dnsdomainname
linux.org.ru

Мне не нравится всё. Во-первых, я не понимаю, где эти настройки сохраняются и как это сделать перманентным. Во-вторых, мне не ясно, для чего нужна команда dnsdomainname и чем она отличается от domainname. Почему в gentoo нет команды domainname?

# echo "test" >/proc/sys/kernel/domainname
# hostnamectl hostname shushundr.linux.org.ru
# cat /proc/sys/kernel/domainname
test
#

данунафиг...

UPD: я выяснил (спасибо firkax), что всё ломает systemd. Поэтому вопрос - а как systemd должна работать?

Проблеме минимум 10 лет: «since switching to systemd my machine no longer has a domain name»

★★★★

Последнее исправление: Shushundr (всего исправлений: 4)

Мда зачем ты такую простыню настрочил?

dnsdomainname пытается по айпи-адресу компа узнать его доменное имя (обычно - из /etc/hosts, но есть разные варианты), и вернуть его часть начиная с первой точки.

firkax ★★★★★
()
Ответ на: комментарий от firkax
# ifconfig -a
...
qemu0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.45.140  netmask 255.255.255.0  broadcast 192.168.45.255
        inet6 fe80::4ca0:7bff:faf4:d604  prefixlen 64  scopeid 0x20<link>
        ether 41:b0:7c:f4:a8:04  txqueuelen 1000  (Ethernet)
        RX packets 12026874  bytes 11169324884 (10.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7374974  bytes 1349644119 (1.2 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# grep "192.168.45.140" /etc/hosts
192.168.45.140	shushundr2.linux.org.ru localhost
# cat /etc/nsswtich.conf
cat: /etc/nsswtich.conf: No such file or directory

# grep -vE "(^#)|($^)" /etc/nsswitch.conf 
aliases:    files
ethers:     files
group:      files [SUCCESS=merge] systemd
gshadow:    files systemd
hosts:      mymachines resolve [!UNAVAIL=return] files myhostname dns
netgroup:   files
networks:   files dns
passwd:     files systemd
protocols:  files
publickey:  files
rpc:        files
shadow:     files [UNAVAIL=return] systemd
services:   files
# uname -n
shushundr.linux.org.ru

Имя /etc/reslv.conf ты написал с ошибкой, да и неважен этот файл для этой задачи.

# cat /etc/resolv.conf
# Generated by resolvconf
...
Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 7)
Ответ на: комментарий от Shushundr

Поставь hostname = какое_то_имя (припиши в /etc/hostname чтобы после ребута ставилось)

В hosts пропиши

192.168.45.140 имя.домен какое_то_имя

какое_то_имя может отличаться от имени в домене, но наверно лучше так не делать (путаница).

Может быть, если в /etc/hostname прописано имя уже с точками, то можно обойтись и без записи в /etc/hosts, но я не проверял.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Да, так работает.

# grep hosts /etc/nsswitch.conf 
hosts: files dns

shushundr /home/user # cat /etc/hostname
shushundr4

shushundr /home/user # hostname
shushundr4

# hostname --domain
linux.org.ru

# hostname --long
shushundr4.linux.org.ru

Но это не настройка по-умолчанию! Поэтому надо разобраться почему по-умолчанию - не работает...

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от Shushundr

Наверно, надо выяснить, что скрывается за вот этим списком

hosts:      mymachines resolve [!UNAVAIL=return] files myhostname dns

(кроме уже известных files и dns) и научить давать правильный ответ.

А если в /etc/hostname прописать сразу с точками имя - не работает? Ну и в /etc/hosts его на всякий случай.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Я уже проверил практически, убирая из этого списка по одному слову. Кроме того, выше я привёл две ссылки на документацию по nss-модулям resolve и myhostname.

Если убрать их оба, то доменное имя показывается. Если хоть один (любой) оставить - доменное имя пропадает. Ещё я читал документацию на systemd-resolved (он вроде как демон, а эти nss-модули обращаются к нему за советом, по крайней мере первый модуль).

Ну так вот, в документации по этому поводу ничего хорошего не сказано. На форумах говорят - а ты прописывай FQDN при помощи hostnamectl. Но я уже в стартовом посте писал, что это не очень красиво работает.

Shushundr ★★★★
() автор топика
Ответ на: комментарий от firkax

Если в файле /etc/nssswitch.conf написано «hosts: files», то hostname --long выводит длинное имя.
Если в файле /etc/nssswitch.conf написано «hosts: files myhostname», то hostname --long выводит короткое имя.

Я не понимаю, почему так происходит, и это пугает меня.

Не нашёл где ты это писал

Пример про то, как после выполнения команды hostnamectl не изменяется содержимое вывода команды

# sysctl kernel.domainname
kernel.domainname = test

оно, кстати, не изменилось несмотря ни на что, в том числе на прописывание /etc/hosts (без перезагрузки пока).

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от Shushundr

Оно и не изменится ни от каких редактирований файлов. Это ядерная переменная. Изменяется только если её специально кто-то перезапишет (вероятно, это делают какие-то скрипты старта системы). Хотя у меня она вообще пустая.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

/etc/sysctl.conf

Но это никак не отвечает на мой вопрос про то почему добавление nss-модуля В КОНЕЦ строки изменяет результат вывода.

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от firkax

Во-первых, не могу. Во-вторых, мне нужны гарантии (то есть, прописанное в документации поведение), а не особенности конкретной реализации, которые могут поменяться когда разработчики не с той ноги встанут.

Shushundr ★★★★
() автор топика

У меня есть ощущение, что я уже задавал этот вопрос на LOR раньше, с таким же эффектом (посоветовали настроить /etc/hosts и изменить строчку hosts в /etc/nsswitch.conf). Это не то, что нужно, потому что нужно понимание, почему творится лютая необъяснимая дичь, когда модуль который стоит в строке hosts позже может переопределить то, что было сделано раньше.

«hosts - Host names and numbers, used by gethostbyname(3) and related functions.»

The order of the services on the line determines the order in which those services will be queried, in turn, until a result is found.

Мне не нравится, что описание деталей синтаксиса этого файла надо искать на сторонних ресурсах.

Даже если я вписываю "[SUCCESS=return]" после files, это всё равно не останавливает поиск в нужном месте.

https://developers.redhat.com/blog/2018/11/26/etc-nsswitch-conf-non-complexity

«If none of the modules return useful answers, the only thing glibc would then need to do is to aggregate the answers, and return NSS_STATUS_UNAVAIL/EAGAIN if at least one module returned that, and NSS_STATUS_NOTFOUND/ENOENT otherwise.»

Сделал вот так:

$ grep "^hosts" /etc/nsswitch.conf
hosts:      files [NOTFOUND=return] mymachines resolve [!UNAVAIL=return] myhostname dns
и так оно работает. Работает, это значит, что команда hostname --long выводит FQDN. А если [NOTFOUND=return] стереть, то hostname --long выводит короткое имя. Можете ли объяснить - почему?

Проблема не решена.

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 4)

Я бы изменил /etc/resolv.conf, но не знаю как, потому что этот файл управляется пакетом systemd.

domain - Local domain name, пишет man 5 resolv.conf «Most queries for names within this domain can use short names relative to the local domain. If set to '.', the root domain is considered. If no domain entry is present, the domain is determined from the local hostname returned by gethostname(2); the domain part is taken to be everything after the first '.'»

Заметьте, что тут говорится про превращение имён в адреса, а не про узнавание домена по-умолчанию (а ведь это разные задачи/алгоритмы).

Я думаю, что в строке hosts при nss-модуле «files» информация о хосте оказывается не найдена (почему так происходит, я не знаю). И после этого FQDN-имя либо отдаётся при помощи systemd, либо срабатывает какой-то fallback-алгоритм, возможно тот, который описан в этом сообщении про man resolv.conf.

Значит должно быть три выхода:
1) настроить systemd таким образом, чтобы в файле resolv.conf появлялась строка domain. Но неясно, поможет ли это вообще. И недостаточно документации по systemd.
UPD: проверил, не поможет. Переделал симлинк в файл, вписал туда строку domain mydomain, но hostname --long всё равно выводит короткую строку, имя без домена.
2) написать свой nss-модуль, который будет возвращать имя домена более правильно, чем systemd. Но тут непонятно, что именно запрашивается.
3) разобраться как это работает полностью, перепроектировать и сделать как надо (это очень долго и муторно).

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 2)

Про настройку sysctl kernel.domainname мне непонятно, почему домен у машины должен быть ровно один. Машина ведь многопользовательская? Разве не могут работать разные пользователи с разными доменами?

Shushundr ★★★★
() автор топика
Ответ на: комментарий от Shushundr

Даже более того, разве не может один пользователь работать с несколькими разными доменами. Да я в интернете это постоянно делаю, значит и с организациями тоже так может быть. Бывает же работа по совместительству…

Даже удивительно, как в таких условиях работает Single Sign On.

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 3)
Ответ на: комментарий от Shushundr

Тот домен, про который написано в стартовом посте Контроллер домена, это реалм Kerberos. В принципе каждый пользователь на хосте может сначала залогиниться на хост используя локальный логин-пароль (/etc/passwd, /etc/shadow), а затем получить TGT (ticket grant ticket) с KDC (key distribution center) с помощью kinit.

kinit использует krb5.conf чтобы понять какие Kerberos реалмы есть и какие у них KDC. По умолчанию это /etc/krb5.conf. Но каждый пользователь может прописать свой krb5.conf в переменной окружения KRB5_CONFIG.

Я работал на предприятии с AD-инфраструктурой и входил таким образом со своего линукса хоста в AD-домен (domain logon). После этого у меня работал прозрачный вход на CIFS шары и intranet web-ресурсы (outlook web access, и т.п.).

Если же ты хочешь, чтобы пользователи домена могли входить на твой линукс хост, то надо сделать этот хост частью домена (join domain). Я такого не делал, но слышал, что это возможно разными способами (winbind, realmd, freeipa, likewise, etc.).

iliyap ★★★★★
()

Я думаю, что библиотека NSS реализована неправильно. Она использует файл nsswitch.conf, а вместо этого должна была использовать директорию nsswitch.conf, в этой директории должны были размещаться файлы конфигурации для каждого из nss-модулей, а управляться всё это должно менеджером пакетов (а не устанавливаться пакетом systemd).

Shushundr ★★★★
() автор топика
Ответ на: комментарий от anc

Переписать, это 3% всего дела. Вот убедить потом весь мир, что мой подход правильный - вот это проблема!

С точки зрения управления рисками начинать надо с устранения самых крупных рисков. То есть в этом случае - с убеждения мира в том, что это нужно и так как я предлагаю будет правильнее.

Shushundr ★★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от anc

Чтобы переложить на них задачу поддержки изменения и последующего развития пакета.

Иначе придётся вести свой форк этого проекта, обеспечивать к нему всю инфраструктуру и делать свой дистрибутив Linux, чтобы этот проект распространять. Причём надо будет выиграть конкуренцию по всем прочим параметрам, чтобы вытеснить исходный проект.

Если исходный проект не будет вытеснен, то мои изменения окажутся ненужными и пропадут со временем.

Shushundr ★★★★
() автор топика