Запрос DNS хоста и получение разных IP в зависимости от WiFi или LAN?

Вопрос или проблема

Вот моя дилемма: на моей сети есть клиенты в двух разных подсетях 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 может автоматически определять различные устройства в вашей сети и разрешать их имена в зависимости от доступности соединения.

Заключение

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

Если вам необходима более детальная информация или помощь с реализацией указанных решений, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...