dnsmasq, обслуживать разные IP-адреса в зависимости от используемого интерфейса - PullRequest
26 голосов
/ 17 февраля 2012

В основном моя проблема заключается в том, что я использую виртуальную машину для разработки веб-сайтов на.

У хост-компьютера есть dns, указывающий на Vm, на котором выполняется dnsmasq, который разрешает адреса различных сайтов разработчиков, т.е.test.mysite.vm и т. д.

Проблема заключается в том, что при переходе из рабочей сети в домашнюю сеть происходит сбой, так как изменяется IP-адрес виртуальной машины.Можно ли обслуживать разные IP-адреса в зависимости от того, с какого интерфейса поступил запрос?Или я должен попытаться решить эту проблему совершенно по-другому?

Спасибо за вашу помощь!


Оказалось, что к этому подходу было гораздо прощев конце концов ...

Теперь я настроил 2 интерфейса на виртуальной машине, и мне не нужно использовать dnsmasq.

Первый - это просто мостовой / общий интерфейс, которыйпозволяет виртуальной машине использовать любое доступное подключение к Интернету для хоста при перезапуске сети каждый раз, когда я перехожу в офис.

2-е - это частное подключение к моей виртуальной машине, которое имеет статический IP-адрес.Это интерфейс, который я использую для подключения и привязки любых сервисов, таких как nginx, mysql и т. Д.

Ответы [ 4 ]

29 голосов
/ 08 ноября 2012

Вы можете запустить два экземпляра dnsmasq, каждый с различным интерфейсом, который он слушает. Для этого вы можете использовать опции --interface=X и --bind-interfaces. По умолчанию оно также связывает петлевое устройство lo и завершится ошибкой, если два процесса попытаются связать его. Используйте --except-interface=lo, чтобы избежать этого.

dnsmasq --interface=eth0 --except-interface=lo --bind-interfaces --dhcp-range=192.168.0.2,192.168.0.10,12h
dnsmasq --interface=eth1 --except-interface=lo --bind-interfaces --dhcp-range=10.0.0.2,10.0.0.10,12h

Убедитесь, что ваш файл конфигурации пуст, когда вы проверяете это, поскольку он всегда переопределяет командную строку. Вы также можете использовать --conf-file=/dev/null.

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

23 голосов
/ 17 ноября 2014

Добавление интерфейса в начале каждого параметра прекрасно работает для меня.Пример (в dnsmasq.conf):

dhcp-host=eth0,00:22:43:4b:18:43,192.168.0.7
dhcp-host=eth1,00:22:43:4b:18:43,192.168.1.7

Я использую релиз:

$ dnsmasq --version
Version de Dnsmasq 2.68  Copyright (c) 2000-2013 Simon Kelley
19 голосов
/ 30 мая 2014

Хотя ответ @ kichik вполне может сработать, более элегантный способ добиться этого может заключаться в использовании директивы localise-queries и отдельного экземпляра dnsmasq сервера.

Я предполагаю, что вы уже настроили диапазоны DHCP для различных интерфейсов и привязали dnsmasq к ним.

Добавьте (частично документированный) параметр localise-queries в файл dnsmasq.conf.

# /etc/dnsmasq.conf
localise-queries

Затем убедитесь, что один из файлов, который dnsmasq читает для ваших хостов (например, /etc/hosts), содержит записи с IP-адресами для обеих сетей, например:

# /etc/hosts
127.0.0.1      dev-vm
192.168.1.1    dev-vm
10.0.0.1       dev-vm

Альтернативой изменению файла /etc/hosts является указание адресов в файле dnsmasq.conf:

# /etc/dnsmasq.conf
localise-queries
host-record=dev-vm,127.0.0.1
host-record=dev-vm,192.168.1.1
host-record=dev-vm,10.0.0.1

В результате в обоих случаях dnsmasq будет обслуживать только IP-адрес, который соответствует IP-адресу интерфейса и сетевой маске для запросов, полученных на этом конкретном интерфейсе.

Согласно справочной странице , это делает следующее:

-y, --localise-query

Возвращает ответы на DNS-запросы из / etc / hosts, которые зависят от интерфейса, через который был получен запрос. Если имя в / etc / hosts имеет более одного адреса, связанного с ним, и хотя бы один из этих адресов находится в той же подсети, что и интерфейс, на который был отправлен запрос, вернуть только те адреса в этой подсети , Это позволяет серверу иметь несколько адресов в / etc / hosts, соответствующих каждому из его интерфейсов, и хосты получат правильный адрес в зависимости от того, к какой сети они подключены. В настоящее время этот объект ограничен IPv4.

7 голосов
/ 11 ноября 2016

В качестве альтернативы вы также можете создать несколько файлов конфигурации в /etc/dnsmasq.d/, по одному для каждого интерфейса, который вы хотите обслуживать dhcp.

Например, если у вас есть два беспроводных интерфейса с именем wlan0и wlan1, и вы хотите обслуживать dhcp на них благодаря dnsmasq, вы можете создать два файла в /etc/dnsmasq.d/ для настройки каждого интерфейса:

/etc/dnsmasq.d/dnsmasq-wlan0.conf:

interface=wlan0         # Use interface wlan0
listen-address=10.0.0.1 # Explicitly specify the address to listen on
bind-interfaces         # Bind to the interface to make sure we aren't sending things elsewhere
server=8.8.8.8          # Forward DNS requests to Google DNS
domain-needed           # Don't forward short names
bogus-priv              # Never forward addresses in the non-routed address spaces.
dhcp-range=10.0.0.50,10.0.0.150,12h # Assign IP addresses between 10.0.0.50 and 10.0.0.150 with a 12 hour lease time

/etc/dnsmasq.d/dnsmasq-wlan1.conf:

interface=wlan1         # Use interface wlan0
listen-address=20.0.0.1 # Explicitly specify the address to listen on
bind-interfaces         # Bind to the interface to make sure we aren't sending things elsewhere
server=8.8.8.8          # Forward DNS requests to Google DNS
domain-needed           # Don't forward short names
bogus-priv              # Never forward addresses in the non-routed address spaces.
dhcp-range=20.0.0.50,20.0.0.150,12h # Assign IP addresses between 20.0.0.50 and 20.0.0.150 with a 12 hour lease time

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

...