Служба имен и DNS/mDNS-резолверы Linux

Основными идентификаторами сетевого взаимодействия в стеке протоколов TCP/IP являются числа —- IP-адреса узлов и номера портов TCP/UDP, «человеческое» использование которых достаточно неудобно (если с 32-битным IPv4-адресом еще можно было совладать, то 128-битный адрес IPv4 не оставляет человеку практически никаких шансов).

Использование строковых имен для узлов и портов приводит к необходимости отображать «человеческие» имена в «протокольные» числа и обратно, что возложено на службу имен (паше service). Как указывалось ранее, служба имен вообще предназначается для организации доступа приложений к свойствам каталогизируемых сущностей по их имени: к UID пользователя по имени его учетной записи, к IP-адресу по имени узла, к номеру порта TCP/UDP по имени сетевой службы, использующей его, и т. д.

Отображение имен сущностей на их свойства зачастую выполняется разными способами в разных каталогах, что определяется конфигурацией коммутатора службы имен nsswitch.conf (name service switch configuration) и наличием ее соответствующих модулей libnss_*.so.?.

В листинге ниже иллюстрируется такая конфигурация отображения имен узлов hosts, которая использует сначала файловую таблицу /etc/hosts, а затем — службы W:[mDNS]  и W:[DNS].
Аналогично, номера портов сетевых служб services отображаются сначала с использованием файла индексированной базы данных (соответствующий модуль libnss_db.so.2 оказался не установлен), а затем с использованием файловой таблицы /etc/services.

Служба имен и ее модули

lunpy@ubuntu:~$ grep hosts /etc/nsswitch.conf
hosts:                         files mdns4_minimal [NOTFOUND=return] dns mdns4
lunpy@ubuntu:~$ grep services /etc/nsswitch.conf

services: db files
lunpy@ubuntu:~$ find /lib -name ‘libnss*’

/lib/i386-linux-gnu/libnss_dns.so.2

/lib/i386-linux-gnu/libnss_files.so.2
/lib/libnss_mdns4.so.2

/lib/libnss_mdns4_minimal. so. 2

Файловые таблицы имен /etc/hosts и /etc/services имеют тривиальный формат, сопоставляющий имена узлов и сервисов — их IP-адресам и портам протоколов TCP и UDP, что проиллюстрировано в листинге ниже. Утилита службы имен getent, позволяющая выбирать указанную сущность по ее типу и имени, используется в качестве диагностики коммутатора службы имен и его модулей.

Файловые таблицы имен

lunpy@ubuntu:~$ cat /etc/hosts

127.0.0.1 localhost
127.0.1.1 ubuntu

# The following lines are desirable for IPv6 capable hosts

::1 ip6-localhost ip6-loopback
fe00::0 lp6-localnet
ff00::0 ip6-ncastprefix
ff02::1 ip6-allnodes
ff02:;2 ip6-allrouters

lunpy@ubuntu:~$ grep http /etc/services
# Updated from http://www.iana.org/assignrtents/port-numbers and other
# sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
http                      80/tcp                                 www                 # WorldWideWeb HTTP
http                      80/udp                                                          # HyperText Transfer Protocol
https                    443/tcp                                                         # http protocol over TLS/SSL
https                     443/udp
http-alt               8080/tcp webcache # WWW caching service
http-alt               8080/udp

lumpy@ubuntu:~$ getent hosts ubuntu

127.6.1.1 ubuntu

lumpy@ubuntu:~$ getent hosts ubuntu

127.6.1.1 ubuntu
lunpy@ubuntu:~$ getent services 53/udp

domain 53/tcp

Соответствия IP-адресов именам «серверных» узлов, например публичных Web-, почтовых и прочих серверов, обычно регистрируются их администраторами в «таблицах» на ответственных (authoritative) серверах службы DNS. Для доступа к ним соответствующий модуль службы имен  использует стандартный DNS-клиент (resolver, DNS-резолвер), которому указываются (в конфигурационном файле resolv.conf) IP-адреса ближайших кэширующих DNS-серверов, например серверов провайдера услуг Интернета.

В примере из листинга ниже показано, что в качестве кэширующего сервера выступает простейший DNS-сервер dnsmasq, который автоматически настраивается на «вышестоящие» кэширующие DNS-серверы и (перезапускается менеджером сетевых подключений при каждой активации нового соединении.

Для диагностики DNS-модуля службы имен (равно как и любого другого ее модуля) используется команда getent, а для непосредственной диагностики DNS-серверов — команда host.

DNS-клиент

lumpy@ubuntu:~$ cat /etc/resolv.conf
# Dynamic resolv.conf file for gltbc resolver generated by resolvconf
#        DO NOT EDIT THIS FILE BY HAND — — YOUR CHANGES WILL BE OVERWRITTEN

nameserver 127.0.0.1
lumpy@ubuntu:~$ sudo ss -4autpn sport = :domain

Netid      State        Recv-Q     Send-Q    Local Address:Port       Peer Address:Port
udp        UNCONN 0               0                127.0.0.1:53                     *:* users:((«dnsmasq»,5999,4))
tcp LISTEN              0              5                127.0.0.1:53                     *:* users:((«dnsmasq»,5999,5))
lumpy@ubuntu:~$ getent hosts bhv.ru
85.249.46.2 bhv.ru
lumpy@ubuntu:~$ host bhv.ru
bhv.ru has address 85.249.46.2
bhv.ru mail is handled by 50 relay2.peterllnk.ru.
bhv.ru mail is handled by 30 relayl.peterllnk.ru.
lumpy@ubuntu:~$ host 8.8.8.8
8.8.8.8.in-addr.arpa domain name pointer google-public-dns-a.google.com.

Сетевые устройства (принтеры, камеры, видеорегистраторы и пр.) и «клиентские» узлы локальных сетей, динамически получающие случайные IP-адреса при помощи DHCP, на ответственных серверах DNS почти никогда не регистрируются, а использование их имен в локальной сети (в «домене» .local) становится возможным благодаря службе mDNS.

Серверы mDNS запускаются на каждом «клиентском» узле и регистрируют у себя соответствия собственных IP-адресов своему имени, а затем используют многоадресную (multicast) рассылку стандартных запросов DNS для получения информации друг у друга.

Сервером mDNS, как показано в примере из листинга ниже, является avahi-daemon, реализующий еще и службу DNS-SD (DNS service discoveiy), которая позволяет узлам локальной сети обнаруживать (discovery) услуги (service), предоставляемые другими узлами. При помощи avahi-browse проиллюстрирован список всех (-a, all) имен и типов услуг, объявленных узлами сети и сохраненных в локальном кэше (-с, cache), а также результаты (-r, resolve) запросов на получение информации об услугах.

mDNS/DNS-SD-клиент

lunpy@ubuntu:~$ sudo ss -4autpn sport = :mdns
Netid      State        Recv-Q     Send-Q    Local Address:Port       Peer Address:Port

udp       UNCONN  0               0               *:S353                               *:* users:((«avahi-daemon, 15094,13))

lumpy@ubuntu:~$ avahi-browse -arcl
+ eth0 IPv4 HP LaserJet 700 M712 [4C6BF5] ‘- UNIX Printer                            local
+ eth0 IPv4 AXIS 211M — 00488C81D401 RTSP Realtime Streaming Server   local
+ eth0 IPv4 NWR(SMB) ‘ Microsoft Windows Network                                        local
+ eth0 IPv4 NVR(NFS) Network File System                                                           local
= eth0 IPv4 HP LaserJet 700 M712 [4C6BF5] UNIX Printer                               local
hostname = [NPI4C6BF5. local] address * [192.168.17.68] port * [515]
txt % [«Scan=F» «UUI0=56ff35dd-1065-4e5e-9385-3c26b8946b79» «Color=F» «Duplex=T» «Binary^» «Transparent^» «note=» «adminurl=http://NPI4C6BF5.local.» «prlority=40» «usb_MDL=HP LaserJet 700 M712» «usb_MFG=Hewlett — Packard ” «product=(HP LaserJet 700 М712)» «ty=HP LaserJet 700 M712» HURM/l.l,CP99JRS600/MTl-2-3-5-12,W8,PQ4,IS20-21-22-23,DMl,OBlH «pdl=application/postscriptH «rps=8INPS» «cjtotal=4» «txtvers=l»]
: ethe IPv4 AXIS 211M — 00408C81D401 RTSP Realtime Streaming Server local
hostname = [axis-00408c81d401.local] address * [192.168.17.142] port «m [S54]

txt * [«path*mpeg4/1/media.amp»]

eth0 IPv4 NVR(SMB)                                                     Microsoft Windows Network        local

hostname = [NVR.local]

address [192.168.17.90]

port — [445]

txt = []txt * [«path*mpeg4/1/media.amp»]

= etho IPv4 NVR(NFS)                                                  Network File System                          local

hostname = [NVR.local]

address = [192.168.17.90]

port = [2049] txt = []

lumpy@ubuntu:~$ avahi-resolve —name NVR.local NPI4C6BF5.local axis-00408c81d401.local

NVR.local                                    192.168.17.90
NPI4C6BF5.local                       192.168.17.68
axis-00408c81d401.local        192.168.17.142

lumpy@jbuntu:~$ getent hosts NVR.local NP14C6BF5.local  axis-00408c81d401.local     

192.168.17.90             NVR.local

192.168.17.68             NPI4C6BF5.local
192.168.17.142           axis-00408c81d401.local

Для диагностики mDNS-модуля службы имен неизменно используется команда getent, а для непосредственной диагностики mDNS>-сервера avahi-daemon — специальная команда avahi-resoIve.

 

Добавить комментарий