Сервер Ubuntu LINUX NIS не поддерживает поиск DNS для имен хостов
Я настроил сервер NIS на моем компьютере с Linux Ubuntu 16.04, для поиска DNS, который я сделал ниже, отредактируйте в Makefile NIS:
# Set the following variable to "-b" to have NIS servers use the domain
# name resolver for hosts not in the current domain. This is only needed,
# if you have SunOS slave YP server, which gets here maps from this
# server. The NYS YP server will ignore the YP_INTERDOMAIN key.
B=-b
#B=
После внесения вышеуказанных изменений я сделал римейк файлов NIS dbm и перезапустил сервер NIS, теперь я мог видеть ключ YP_INTERDOMAIN в моем файле DBM хоста:
root@satyam-host:/var/yp# /usr/lib/yp/makedbm -u sat.nis/hosts.byname
YP_INTERDOMAIN
...
Также я обновил свой файл /etc/nsswitch.conf так, что NIS используется для поиска хоста:
hosts: nis files mdns4_minimal [NOTFOUND=return] dns
Теперь, когда я выполняю команду getent hosts под strace (с той же машины, на которой NIS-сервер работает для тестирования):
strace -f getent hosts www.google.com
Я мог видеть, что запрос поиска имени хоста сначала идет к серверу NIS, но поскольку хост не присутствовал в хостах NIS. Имя NIS просто возвращается без дальнейших запросов к DNS, а затем в соответствии с файлом nsswitch.conf, утилита getent сама запрашивает DNS и выбирает результат.
Процесс ypserv:
root@satyam-host:/home/satyam# lsof -i :750
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ypserv 21350 root 4u IPv4 454903 0t0 UDP *:kerberos4
фрагмент журнала регистрации:
Запрос отправлен на порт 750, который в настоящее время прослушивает ypserv, но не получил сопоставление имени хоста из процесса ypserv:
sendto(4, "Uv\323\251\0\0\0\0\0\0\0\2\0\1\206\244\0\0\0\2\0\0\0\3\0\0\0\0\0\0\0\0"..., 88, 0, {sa_family=AF_INET, sin_port=htons(750), sin_addr=inet_addr("10.31.210.184")}, 16) = 88
poll([{fd=4, events=POLLIN}], 1, 5000) = 1 ([{fd=4, revents=POLLIN}])
recvfrom(4, "Uv\323\251\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\375\0\0\0\0", 8800, MSG_DONTWAIT, {sa_family=AF_INET, sin_port=htons(750), sin_addr=inet_addr("10.31.210.184")}, [16]) = 32
close(4)
Позже хосты getent отправили запрос DNS-серверу (работающему на порту 53 по умолчанию) самостоятельно, чтобы получить сопоставление:
connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.1.1")}, 16) = 0
poll([{fd=3, events=POLLOUT}], 1, 0) = 1 ([{fd=3, revents=POLLOUT}])
sendto(3, "\3771\1\0\0\1\0\0\0\0\0\0\3www\6google\3com\0\0\34\0\1", 32, MSG_NOSIGNAL, NULL, 0) = 32
poll([{fd=3, events=POLLIN}], 1, 5000) = 1 ([{fd=3, revents=POLLIN}])
ioctl(3, FIONREAD, [60]) = 0
recvfrom(3, "\3771\201\200\0\1\0\1\0\0\0\0\3www\6google\3com\0\0\34\0\1"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.1.1")}, [16]) = 60
close(3) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 9), ...}) = 0
write(1, "2607:f8b0:4000:801::2004 www.goo"..., 402607:f8b0:4000:801::2004 www.google.com
) = 40
Также, когда я сравнил страницы руководства ypserv для LINUX и Solaris, я обнаружил различное значение флага -d:
На странице руководства LINUX ypserv написано:
Флаг -d говорит, что сервер работает в режиме отладки.
С другой стороны,
Страница руководства Solaris ypserv гласит:
Флаг -d говорит, что служба NIS должна обращаться к DNS для получения дополнительной информации о хосте.
Я хотел, чтобы сам сервер NIS выполнял поиск DNS, а не клиентское приложение, например, хосты getent в этом примере, поэтому эта функция поиска DNS в NIS поддерживается только в среде Solaris, а не в Ubuntu Linux, или я допустил какую-либо ошибку при его настройке.