Как жить в локальной сети без dns для локальных ресурсов
08 Apr 2016
Или сказ о том, как перестать бояться и начать раздавать динамические адреса в локальной сети.
Задача:
- необходимо автоматизировать распределение имен различным устройствам в сети.
Проблемы
- доисторический (ископаемый) роутер, который не умеет dd-wrt/openwrt и иже. А вместе с этим он не умеет статические адреса или локальный dns.
- много iot-желаза в локальной сети к которому хочется получать доступ по имени (доменному конечно же).
- Очень много железа, которое появляется в сети лишь на короткое время, а доступ к нему по сети нужен (ну не прописывать же ему постоянно статику?)
- большое количество скриптов автоматизации, которым надо откуда-то брать именя устройств.
Проблему можно решить несколькими путями:
- Поставить слабую железку, поставить на нее bind, поднять локальную доменную зону и убрать с роутера роль dhcp и dns-сервера. Минус в том, что слабой железки может и не быть.
- Поменять роутер на менее доисторический. Минус в том, что роутера может не быть под рукой.
- Воспользоваться протоколом zeroconf. Минусы тоже есть - возможный конфликт имен устройств.
Если с первыми двума вариантами все более-менее понятно, то на третьем стоит остановиться подробно. Так как он решает проблему наименее затратным способом.
Протокол описывает:
- назначение адресов устройствам в сети (диапазон 169.254.*)
- разрешение имен
- обнаружение сервисов
Поскольку адреса у устройств уже есть (dhcp же), то нас будет интересовать только та часть протокола, где рассказывается про обнаружение сервисов и разрешение имен. Это mDNS+DNSSD.
В nix\bsd за эту часть протокола отвечает сервис avahi
В ряде дистрибутивов он включен и нормально настроен сразу.
На примере федоры посмотрим как его поставить и настроить.
```shell
$ sudo dnf install avahi-daemon avahi-utils
$ sudo systemctl enable avahi-daemon
$ sudo systemctl start avahi-daemon
```
Если у вас в сети уже есть устройства, где активирован avahi, то можно посмотреть на то, найдет ли оно какие-либо устройства
```shell
$ avahi-browse -alr
+ eth0 IPv4 workstation Remote Disk Management local
= eth0 IPv4 workstation Remote Disk Management local
hostname = [workstation.local]
address = [192.168.1.10]
port = [22]
txt = []
```
Как видим что-то нашло.
Мы можем попробовать его попинговать.
```shell
$ ping workstation.local
ping: unknown host workstation.local
```
Если вы увидели такую картину, то это означает лишь одно - mdns для получения имен доменов у вас не подключен.
Чтобы его включить требуется отредактировать /etc/nsswitch.conf.
В строчку hosts нужно добавить mdns_minimal [NOTFOUND=return] перед dns.
``` hosts: files mdns_minimal [NOTFOUND=return] dns myhostname mymachines ```
После перезагрузки или перезапуска соотвествующего сервиса пингуем снова.
```shell
$ ping -c 4 workstation.local
PING workstation.local (192.168.1.10) 56(84) bytes of data.
64 bytes from workstation.local (192.168.1.10): icmp_req=1 ttl=64 time=0.449 ms
64 bytes from workstation.local (192.168.1.10): icmp_req=2 ttl=64 time=0.469 ms
64 bytes from workstation.local (192.168.1.10): icmp_req=3 ttl=64 time=0.467 ms
64 bytes from workstation.local (192.168.1.10): icmp_req=4 ttl=64 time=0.393 ms
--- workstation.local ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3004ms rtt min/avg/max/mdev = 0.393/0.444/0.469/0.037 ms ``` Если у вас очень медленно резолвятся локальные домены, то стоит попробовать использовать модуль mdns4\_minimal. Задача раздачи локальных имен полностью решена. В данном случае я не затрагиваю dnssd поскольку цель была лишь обеспечить доступность хостов по имени. При желании поднять zeroconf можно как на ардуине, так и на модулях esp8266. Вы можете столнуться с проблемами из-за того, что некоторые продукты используют зону local для своих целей. Например торренты часто используют [retracker.local](https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D1%82%D1%80%D0%B5%D0%BA%D0%B5%D1%80) для обозначения внутрисетевого трекера.