Вопрос или проблема
Вот моя дилемма: на моей сети есть клиенты в двух разных подсетях 192.168.X.X. Одна для WiFi, другая для проводного Ethernet. Если машина может подключиться к другой по проводному соединению, это имеет приоритет, как определено в метриках сетевой конфигурации каждой машины. У меня есть DNS-сервер на маршрутизаторе, работающий на dnsmasq. У меня есть ручные записи для узлов во внутренней сети, некоторые из которых подключены и к проводным, и к WiFi подсетям на разных интерфейсах:
#/etc/hosts:
192.168.2.10 somebox
192.168.3.10 somebox
Моя проблема в том, что при запросе с помощью dig, dnsmasq возвращает только WiFi IP запрашиваемой машины, несмотря на наличие обеих подсетевых IP записей в конфигурации dnsmasq. Что я хочу, так это чтобы, если машины могут подключаться через Ethernet, DNS-запрос возвращал IP проводной сети, а не WiFi. Как лучше всего подойти к этой проблеме?
Ответ или решение
Чтобы решить вашу проблему с DNS запросами в зависимости от типа подключения (WiFi или Ethernet), вам необходимо изменить подход к конфигурации dnsmasq так, чтобы он мог учитывать приоритет соединений. К сожалению, dnsmasq по умолчанию не имеет встроенной логики для оценки доступности интерфейсов при возвращении IP-адресов. Тем не менее, вы можете использовать несколько методов для достижения вашей цели.
Подход 1: Использование разных доменов или поддоменов
Одним из решений может быть использование разных доменов для каждого типа подключения. Например, вы можете настроить разные поддомены для WiFi и Ethernet. Например, somebox.wifi.local
будет указывать на WiFi IP, а somebox.lan.local
будет указывать на Ethernet IP.
Пример конфигурации:
#/etc/hosts:
192.168.2.10 somebox.wifi.local
192.168.3.10 somebox.lan.local
Таким образом, если ваше устройство подключено к Ethernet, оно должно запрашивать somebox.lan.local
, что вернет соответствующий IP.
Подход 2: Условная логика с использованием скриптов
Если вам нужно использовать одно и то же имя, можно создать простое решение с помощью скриптов, которые динамически обновляют DNS записи в зависимости от типа подключения каждого устройства. Вы можете написать скрипт на Bash или Python, который будет проверять доступные интерфейсы и обновлять записи в dnsmasq в соответствии с этим.
Пример скрипта:
#!/bin/bash
# Получаем статусы интерфейсов
WIFI_IP=$(hostname -I | awk '{print $1}') # Предполагаем, что WiFi всегда первый
LAN_IP=$(ifconfig eth0 | grep 'inet ' | awk '{print $2}') # Убедитесь, что eth0 соответствует вашему интерфейсу
# Обновляем /etc/hosts или конфигурацию dnsmasq
if [ -n "$LAN_IP" ]; then
echo "$LAN_IP somebox" > /etc/hosts
else
echo "$WIFI_IP somebox" > /etc/hosts
fi
# Перезагружаем dnsmasq
systemctl restart dnsmasq
Этой команды достаточно для проверки активного соединения, и если Ethernet доступен, он обновляет запись DNS соответственно.
Подход 3: Настройка службы Avahi
Вы также можете рассмотреть вариант использования службы Avahi, которая предоставляет поддержку Zeroconf. Avahi может автоматически определять различные устройства в вашей сети и разрешать их имена в зависимости от доступности соединения.
Заключение
Каждый из вышеперечисленных подходов имеет свои преимущества и недостатки, и решение, которое вы выберете, будет зависеть от специфики вашей сети и требований к удобству использования. Вам также следует учитывать дополнительные программные компоненты и их влияние на производительность сети.
Если вам необходима более детальная информация или помощь с реализацией указанных решений, дайте знать!