Avahi mdns dns sd stack что это
У меня есть HTPC / Media Server на базе Ubuntu 16.04 , работающий 24/7 . Насколько я помню, используя официальный дистрибутив Ubuntu, у меня всегда были проблемы с avahi-daemon . Проблема довольно часто обсуждается в Интернете. Некоторые люди решают просто удалить демона, однако мне это действительно нужно, так как я использую сервер CUPS и использую Kodi в качестве приемника AirPlay.
Проблема
Симптомы просты - примерно через 2-4 дня бездействия сетевое соединение обрывается, и это регистрируется
Сеть будет идти обратно без проблем , если вы физически подключиться к Ethernet разъема, или если вы подключите программное обеспечение на сторону.
Возможные решения
1.) Отредактируйте /etc/nsswitch.conf из
2.) Изменить /etc/avahi/avahi-daemon.conf
3.) «Попросить администратора переместить зону .local» (как сказано в вики)
Что я сделал
Первое решение не явился на работу для меня - демон по- прежнему работает, однако, сеть будет идти вниз точно так же , как и раньше (чтобы быть справедливым, на вики это действительно говорит , « У нашего M ileage M ау V ичных»)
Второе решение приводит к тому , демон, казалось бы функционировать должным образом (ничего плохого , если вы посмотрите на журналы) , но устройства IOS не «видеть» машину в качестве принтера или AirPlay (ресивера, а также ITunes на моей машине Windows)
Третье решение сложно, потому что я не очень хорошо разбираются в «тонкостях» о том , как функционирует сеть; и я не уверен, что я действительно попробовал это. Вот что я имею в виду: на моем маршрутизаторе Asus под управлением Asuswrt-Merlin я вошел в подкатегорию настроек / LAN / DHCP Server / Basic Config. Там я установил « Доменное имя RT-AC68U » как «lan» (доменное имя, которое я посоветовал в Интернете, потому что оно не конфликтует ни с чем, в отличие от «локального»). Насколько я понимаю, это то, что означает « перемещение локальной зоны ». Если это на самом деле правильно, то это решение не работает и для меня.
Заключение
Так что я должен делать? Я борюсь с этой проблемой уже более 4 месяцев, и каждый ответ в Интернете сводится к тем, которые я уже пробовал; честно говоря, я полностью потерян. Заранее спасибо!
Уже давно являюсь пользователем продукции Apple. Старенький макбук полностью справляется с теми задачами, что на него возлагаются. В основном конечно развлекательные. Но в последнее время стало не хватать места на 40 гиговом жестком диске. И вот наконец у меня зачесались руки настроить свой домашний сервер, как хранилище. Некоторое время работал по ftp, но это было не удобно. Было принято решение настроить наконец Appletalk, не зря же он есть и заодно приручить к нему TimeMachine:-)
Настройка всего этого можно разделить на несколько этапов:
1. Установка Appletalk
2. Настройка AppleTalk
3. Установка Avahi
4. Настройка Avahi
5. Настройка TimeMachine
Ну что ж, приступим.
1. Установка AppleTalk
Пакет Netatalk — opensource реализация сервиса Appletalk (AFP сервер). Mac OS X требует поддержки шифрования, но стандартная сборка этого пакета не поддерживает шифрование. Поэтому необходимо пересобрать этот пакет.
Тут можно скачать уже правильно собранный пакет, и перейти к пункту 2.
Но лучше собрать самому выполнив эти команды:
Скачиваем сырцы:
cd /tmp
sudo apt-get build-dep netatalk
sudo apt-get source netatalk
cd netatalk-2*
Устанавливаем то, что нужно для сборки:
sudo apt-get install cracklib2-dev fakeroot libssl-dev
Собираем:
sudo DEB_BUILD_OPTIONS=ssl
sudo export DEB_BUILD_OPTIONS
sudo dpkg-buildpackage -rfakeroot
И, если все в порядке, устанавливаем:
sudo dpkg -i ../netatalk_2*.deb
Все не так страшно как казалось. Чтобы при обновлении системы правильный пакет не заменился более новым но не правильным ставим блок на пакет netatalk:
echo "netatalk hold" | sudo dpkg --set-selections
Всё, теперь перейдем к настройке.
2. Настройка AppleTalk
Сперва нужно отключить те сервисы, которые для решения текущей задачи не нужны. Приведем секцию в фаиле /etc/default/netatalk до такого вида:
ATALKD_RUN=no
PAPD_RUN=no
CNID_METAD_RUN=yes
AFPD_RUN=yes
TIMELORD_RUN=no
A2BOOT_RUN=no
Теперь пришло время главного конфигурационного файла /etc/netatalk/afpd.conf и внизу добавим эту строчку:
- -transall -uamlist uams_randnum.so,uams_dhx2.so,uams_guest.so -nosavepassword -advertise_ssh
Теперь перейдем к настройке ресурсов, которые будут рассшарены по afp. Это настраивается в файле /etc/netatalk/AppleVolumes.default
Строка:
/home/torrent/downloads "Torrent-Downloads" allow:username,nobody rolist:nobody cnidscheme:cdb options:usedots
рассшаривает папку /home/torrent/downloads под именем Torrent-Downloads для пользователя username и для гостевого пользователя. Причем Гость может только читать из этой папки.
Строка:
/home/username/TimeMachine "TimeMachine" allow:username1,username2 cnidscheme:cdb options:usedots,upriv
рассшаривает ресурс для TimeMachine.
После редактирования конфигов, стоит перезапустить netatalk:
sudo /etc/init.d/netatalk restart
Установка Avahi
После проделанных выше шагов можно, с помощью Finder, зайти на рассшаренные ресурсы. Но каждый раз использовать для этого меню не удобно, нужно сделать так, чтобы сервер afp был виден в меню ресурсов Finder.
Для этого нам и понадобился Avahi. Avahi — демон предоставляющий в сети сервисы на подобии Bonjour.
Установка avahi проста:
sudo apt-get install avahi-daemon
sudo apt-get install libnss-mdns
Использование строковых имен для узлов и портов приводит к необходимости отображать «человеческие» имена в «протокольные» числа и обратно, что возложено на службу имен (паше 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.
Служба имен и ее модули
$ grep services /etc/nsswitch.conf
/lib/libnss_mdns4_minimal. so. 2
Файловые таблицы имен /etc/hosts и /etc/services имеют тривиальный формат, сопоставляющий имена узлов и сервисов — их IP-адресам и портам протоколов TCP и UDP, что проиллюстрировано в листинге ниже. Утилита службы имен getent, позволяющая выбирать указанную сущность по ее типу и имени, используется в качестве диагностики коммутатора службы имен и его модулей.
Файловые таблицы имен
127.0.0.1 localhost
127.0.1.1 ubuntu
::1 ip6-localhost ip6-loopback
fe00::0 lp6-localnet
ff00::0 ip6-ncastprefix
ff02::1 ip6-allnodes
ff02:;2 ip6-allrouters
$ getent hosts ubuntu
$ getent hosts ubuntu
$ getent services 53/udp
Соответствия IP-адресов именам «серверных» узлов, например публичных Web-, почтовых и прочих серверов, обычно регистрируются их администраторами в «таблицах» на ответственных (authoritative) серверах службы DNS. Для доступа к ним соответствующий модуль службы имен использует стандартный DNS-клиент (resolver, DNS-резолвер), которому указываются (в конфигурационном файле resolv.conf) IP-адреса ближайших кэширующих DNS-серверов, например серверов провайдера услуг Интернета.
В примере из листинга ниже показано, что в качестве кэширующего сервера выступает простейший DNS-сервер dnsmasq, который автоматически настраивается на «вышестоящие» кэширующие DNS-серверы и (перезапускается менеджером сетевых подключений при каждой активации нового соединении.
Для диагностики DNS-модуля службы имен (равно как и любого другого ее модуля) используется команда getent, а для непосредственной диагностики DNS-серверов — команда host.
DNS-клиент
$ sudo ss -4autpn sport = :domain
Сетевые устройства (принтеры, камеры, видеорегистраторы и пр.) и «клиентские» узлы локальных сетей, динамически получающие случайные 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-клиент
$ sudo ss -4autpn sport = :mdns
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
eth0 IPv4 NVR(SMB) Microsoft Windows Network local
= etho IPv4 NVR(NFS) Network File System local
NVR.local 192.168.17.90
NPI4C6BF5.local 192.168.17.68
axis-00408c81d401.local 192.168.17.142
$ getent hosts NVR.local NP14C6BF5.local axis-00408c81d401.local
192.168.17.68 NPI4C6BF5.local
192.168.17.142 axis-00408c81d401.local
Для диагностики mDNS-модуля службы имен неизменно используется команда getent, а для непосредственной диагностики mDNS>-сервера avahi-daemon — специальная команда avahi-resoIve.
Это перевод статьи Марка Э. Хааса, впервые опубликованной в блоге Hyperion Gray. Перевела Алёна Георгиева.
Что такое mDNS?
Официальные сайты Multicast DNS и DNS Service Discovery способны скорее запутать, чем пролить свет на суть этих технологий. Поэтому — прежде чем погружаться в вопросы безопасности mDNS и DNS-SD — мы обсудим, почему вообще эти протоколы существуют и чем они на самом деле занимаются.
Оба протокола являются частью Zeroconf — пакета технологий, который помогает сетевым устройствам находить друг друга автоматически. Когда ты отправляешь документ на печать, а твой компьютер сам предлагает на выбор ближайшие принтеры, скорее всего, он использует именно Zeroconf. Протоколы связаны с DNS, так что здесь нужно хотя бы на базовом уровне понимать, как устроена система DNS.
Обычно DNS работает «одноадресно» (unicast) — это значит, что каждый запрос отправляется на конкретный IP-адрес. Слово multicast (то есть «многоадресность») в mDNS означает, что запрос веерно рассылается всем девайсам широковещательного домена (broadcast domain). Сам по себе термин «широковещательный домен» означает, грубо говоря, все сообщающиеся устройства второго уровня — например, компьютеры, соединенные сетевыми коммутаторами. Это важный момент, ведь запросы mDNS не проходят через роутеры — потому что роутеры уже устройства третьего уровня.
Разберемся на примере. Мой MacBook Pro имеет в системе mDNS имя MehBook.local . Выяснить это можно во вкладке «Общий доступ» (Sharing) системных настроек.
Чтобы вычислить IP макбука, мы можем использовать инструмент DNS-запросов вроде dig :
$ dig @224.0.0.251 -p 5353 +short MehBook.local
10.105.0.203
Обрати внимание, что имя заканчивается на .local — это домен верхнего уровня, зарезервированный специально под mDNS. Если ты видишь подобное имя — то, вероятно, сможешь вычислить айпишник, используя mDNS. Такие доменные имена называются именами локальной связи (link-local names), потому что увидеть их можно только внутри локальной сети.
Имей в виду: некоторые сисадмины некорректно используют местный домен верхнего уровня вместе с одноадресным DNS. Следи за собой, будь осторожен!
Вместо того чтобы посылать запрос DNS-серверу на порт 53, мы используем порт 5353 и специальный адрес 224.0.0.251 — собственно, мультикастомный. Этот конкретный адрес зарезервирован специально для mDNS. Когда на адрес 224.0.0.251 приходит запрос, все устройства сети получают копию этого запроса и могут на него ответить. В нашем примере мой макбук увидел запрос и вернул по нему свой собственный айпишник — 10.105.0.203 .
IP моего макбука динамический, через какое-то время он поменяется — а вот mDNS-имя останется прежним! Так что мы можем взаимодействовать с доменными именами без запуска DNS-сервера. Сам понимаешь, чем это полезно в домашних и небольших офисных сетях.
Что такое DNS-SD?
В примере с mDNS мы выясняли айпишник устройства с уже известным именем. Но что, если ты хочешь связаться с девайсом, имя которого не знаешь, — например, с принтером? Эту проблему как раз и решает протокол обнаружения сервисов (Service Discovery). Он позволяет устройствам заявлять о конкретных сервисах, которые они предлагают, — так, чтобы можно было обнаружить их без централизованной настройки.
Начнем с вычисления принтеров:
Тут нам помогут те же мультикастомный DNS-адрес и порт, но на сей раз мы запрашиваем PTR-записи и используем специальное доменное имя _printer._tcp.local — оно как раз предназначено для распознавания принтеров. В ответ на этот запрос мой принтер Brother вернул свое локальное доменное имя.
Если ты хочешь запросить устройства с другими сервисами, то стоит свериться с их официальным реестром. Например, там есть любопытная служба RAOP — она же протокол Apple, известный как AirTunes. Давай-ка его вычислим:
Запрос показывает устройство в моей сети, предлагающее сервис RAOP, — это Apple TV под названием «Гостиная» (Living Room). На самом деле в моей сети два Apple TV, но dig выводит только первый полученный ответ. К счастью, есть инструменты и получше. На macOS это команда dns-sd в программном модуле Rendezvous (Bonjour), эппловской реализации Zeroconf.
Эта команда разошлет запрос и отобразит все полученные ответы (чтобы избавиться от них, нужно будет нажать Ctrl-C). Теперь мы видим оба моих Apple TV.
На Linux тот же набор инструментов предлагает пакет Avahi (на Debian/Ubuntu он называется avahi-utils ).
$ avahi-browse _raop._tcp
+ IPv6 D0D2B0XXXXXX@Bedroom AirTunes Remote Audio local
+ IPv6 C8D083XXXXXX@Living Room AirTunes Remote Audio local
+ IPv4 D0D2B0XXXXXX@Bedroom AirTunes Remote Audio local
+ IPv4 C8D083XXXXXX@Living Room AirTunes Remote Audio local
^C
Avahi умеет переводить имена служб типа _raop._tcp.local в более понятные — AirTunes Remote Audio local , например. Также Avahi может вычислить айпишник с помощью mDNS, так что dig здесь вообще не нужен:
Обрати внимание, что при mDNS-запросе мы не вставляем значения типа _raop._tcp — потому что это название службы, а не устройства. Также мы ничего не пишем слева от символа @ .
Вычисляем устройства
Теперь ты видишь, чем пакет Zeroconf интересен пентестерам: благодаря ему можно быстро найти целый список доступных устройств буквально за пару запросов. А Avahi еще и позволяет автоматизировать этот процесс. Например, вполне реально упаковать обнаружение сервисов и пробивание IP через mDNS в один шаг.
$ avahi-browse --resolve _printer._tcp
+ enp4s0 IPv4 Brother DCP-L2540DW series UNIX Printer local
= enp4s0 IPv4 Brother DCP-L2540DW series UNIX Printer local
hostname = [brotherB85F3190.local]
address = [10.105.0.3]
port = [515]
txt = ["UUID=e3248000-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
"TBCP=F" "Transparent=T" "Binary=T" "PaperCustom=T"
"Scan=T" "Fax=F" "Duplex=T" "Copies=T" "Color=F" …]
^C
В результате мы получаем локальное имя хоста, IP-адрес и порт ( tcp/515 — дефолтный порт для Line Printer Daemon). Плюс много информации о возможностях принтера в поле txt .
Использованная здесь команда — отличный способ пересчитать все устройства конкретного типа, однако Avahi способен на большее! Следующая команда вычисляет вообще все типы сервисов сразу.
$ avahi-browse --all
+ IPv6 8FB20F14F5966F78620XXXX iPod Touch Music Library local
+ IPv6 276A1455BC533567B08XXXX iPod Touch Music Library local
+ IPv4 8FB20F14F5966F78620XXXX iPod Touch Music Library local
+ IPv4 276A1455BC533567B08XXXX iPod Touch Music Library local
+ IPv6 8FB20F14F5966F78620XXXX _appletv-v2._tcp local
+ IPv6 276A1455BC533567B08XXXX _appletv-v2._tcp local
+ IPv4 8FB20F14F5966F78620XXXX _appletv-v2._tcp local
+ IPv4 276A1455BC533567B08XXXX _appletv-v2._tcp local
^C
Наконец, Avahi может слушать запросы по протоколам Zeroconf от других устройств, что позволяет вычислять девайсы фоново.
$ avahi-browse -a
+ IPv6 MehBook _companion-link._tcp local
+ IPv6 Bedroom _companion-link._tcp local
+ IPv6 Living Room _companion-link._tcp local
+ IPv4 MehBook _companion-link._tcp local
^C
Обе эти команды можно сочетать с --resolve , чтобы получить информацию об айпишниках и портах каждого девайса. Все устройства сети как на ладони!
И конечно, нельзя не упомянуть, что Nmap поддерживает вычисление устройств Zeroconf с помощью скрипта broadcast-dns-service-discovery.
Этот скрипт не включен в категорию default — его можно найти только в safe .
Немного об ограничениях
- Это работает только внутри локальной сети, так что нужно иметь к ней доступ.
- Большие корпоративные сети обычно сегментированы, поэтому потребуется опорная точка именно внутри интересующего тебя сегмента.
- Есть много важных служб, которые не заявляют о себе через DNS-SD, — такие устройства в большинстве случаев придется вычислять как-то иначе.
- Из-за того, что это широковещательные протоколы, нужно хорошенько подумать — позволяют ли твоя тактика и стратегия их использовать?
Эксплуатация
Окей, вычисление устройств — это прикольно и все такое, но есть ли здесь что поэксплуатировать? Мы нашли связку принтеров и Apple TV — и.
Во-первых, держи в уме, что продукты для домашней и небольшой офисной сети, использующие Zeroconf, с высокой вероятностью имеют неправильные настройки и уязвимости. Один простой пример: если принтер аутентифицируется через LDAP-сервер, а у того стоит дефолтный пароль производителя, ты можешь захватить контроль над сервером, заставить принтер к нему обратиться и таким образом украсть LDAP-аттестат принтера. Этим способом можно довольно быстро угнать доменный аккаунт!
Продолжение доступно только участникам
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Читайте также: