Назад | Перейти на главную страницу

Как мне получить имя машины с IP-адреса через Multicast DNS?

У меня есть список IP-адресов в сети, и большинство из них поддерживает многоадресный DNS. Я хотел бы иметь возможность разрешать имя сервера, а не просто IP-адрес.

ping computer.local
64 bytes from 192.168.0.52: icmp_seq=1 ttl=64 time=5.510 ms
64 bytes from 192.168.0.52: icmp_seq=2 ttl=64 time=5.396 ms
64 bytes from 192.168.0.52: icmp_seq=3 ttl=64 time=5.273 ms

Работает, но я бы хотел определить это имя по IP. Кроме того, устройства не обязательно транслируют какие-либо службы, но определенно поддерживают широковещательную передачу mDNS. Так что просматривать сервисы не получится.

Поскольку вы уже знаете IP-адреса, вы можете найти обратную запись для каждого IP-адреса, чтобы получить связанный прямой адрес:

$ dig -x 10.0.0.200 @224.0.0.251 -p 5353

; <<>> DiG 9.6.0-APPLE-P2 <<>> -x 10.0.0.200 @224.0.0.251 -p 5353
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54300
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;200.0.0.10.in-addr.arpa.   IN  PTR

;; ANSWER SECTION:
200.0.0.10.in-addr.arpa. 10 IN  PTR atj-mbp.local.

;; ADDITIONAL SECTION:
atj-mbp._device-info._tcp.local. 10 IN  TXT "model=MacBookPro3,1"

;; Query time: 2 msec
;; SERVER: 10.0.0.200#5353(224.0.0.251)
;; WHEN: Sat Jun 26 07:53:44 2010
;; MSG SIZE  rcvd: 126

Для более удобного вывода сценария оболочки используйте '+ short':

$ dig +short -x 10.0.0.200 @224.0.0.251 -p 5353
atj-mbp.local.

В зависимости от предполагаемого варианта использования может быть более подходящий метод выполнения запроса. Не стесняйтесь обращаться ко мне, если вам понадобится дополнительная информация.

В Linux вы можете использовать команду getent из библиотеки libc:

getent hosts 192.168.0.52

Или установите avahi-utils и запустите

avahi-resolve-address 192.168.0.52

Кажется, это работает:

dig -x 192.0.2.42 -p 5353 @224.0.0.251

Из Удовольствие от многоадресного DNS

Что ж, я провел немного больше исследований по этому поводу, и, просмотрев mDNDS и протокол, похоже, что это на самом деле невозможно. В протоколе есть запрос поиска для получения имени, поэтому, когда вы запрашиваете имя, соответствующий клиент ответит, но нет запроса поиска для IP. Нет и центрального хранилища адресов.

Надеюсь, это поможет кому-то другому, так как я потратил слишком много времени на отслеживание этого.

Если у кого-то есть другие идеи по этому поводу, я с удовольствием их выслушаю.