Основными идентификаторами сетевого взаимодействия в стеке протоколов 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.