2012-02-17 6 views
18

Fondamentalmente il mio problema è che sto utilizzando una macchina virtuale per lo sviluppo di siti web.dnsmasq, servono diversi indirizzi IP in base all'interfaccia utilizzata

La macchina host ha i suoi DNS che puntano al Vm che è in esecuzione dnsmasq che risolve gli indirizzi dei vari siti dev, cioè test.mysite.vm ecc

Il problema è quando vado dalla mia rete di lavoro per la mia rete domestica si rompe perché l'IP del vm cambia. È possibile servire indirizzi IP diversi in base all'interfaccia dalla quale proviene la richiesta? O dovrei provare ad affrontare questo in un modo completamente diverso?

Grazie per il vostro aiuto!

+0

Dove entrano in gioco le diverse interfacce? Stai usando due interfacce diverse per la rete domestica e la rete di lavoro? Perché l'IP della VM cambia? – kichik

+0

Sì, erano 2 interfacce diverse per la casa (192.168.0. *) E funzionano (10.0.0. *). Il cambiamento è tra l'IP del lavoro e l'IP di casa. –

risposta

23

È possibile eseguire due istanze di dnsmasq, ciascuna con un'interfaccia diversa su cui è in ascolto. È possibile utilizzare le opzioni --interface=X e --bind-interfaces per quello. Per impostazione predefinita, associa anche il dispositivo di loopback lo e fallirà se due processi tentano di collegarlo. Utilizzare --except-interface=lo per evitare ciò.

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 

Assicurarsi che il file di configurazione sia vuoto quando si esegue il test poiché sostituisce sempre la riga di comando. Puoi anche usare --conf-file=/dev/null.

Come ho menzionato nel commento, non sono molto sicuro di come questo possa aiutare la situazione, ma potrebbe aiutare chiunque altro cerchi di ottenere due diversi intervalli di indirizzi su due interfacce diverse.

+0

Non c'è davvero alcun modo per avere 2 reti senza eseguire più istanze? Questo complica davvero le cose – TheLQ

+3

Puoi effettivamente usare '--dhcp-range =' più volte nello stesso comando per farlo funzionare su due reti. Potrebbe funzionare anche per la domanda originale. Probabilmente dedurrà l'intervallo IP corretto da servire in base all'indirizzo IP dell'interfaccia. – kichik

+0

assicurati che l'opzione di configurazione 'listen-address = 0.0.0.0' sia commentata nel file di configurazione. per esempio. '# listen-address = 0.0.0.0' –

13

Mentre la risposta di @kichik potrebbe funzionare, un modo più elegante per ottenere lo stesso potrebbe essere quello di utilizzare la direttiva localise-queries e una singola istanza del server dnsmasq.

Suppongo che abbia già configurato gli intervalli DHCP per le diverse interfacce e che abbia associato dnsmasq a quelli.

Aggiungere l'opzione (parzialmente documentata) localise-queries al file dnsmasq.conf.

# /etc/dnsmasq.conf 
localise-queries 

Quindi, fare in modo che uno dei file che dnsmasq legge per i padroni di casa (come /etc/hosts) contiene voci con gli indirizzi IP per entrambe le reti, come questo:

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

Un'alternativa modificando il file /etc/hosts è quello di specificare gli indirizzi nel file dnsmasq.conf invece:

# /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 

di conseguenza in b altri casi, dnsmasq servirà solo l'IP che corrisponde all'IP e alla maschera di rete dell'interfaccia per le query ricevute su quella particolare interfaccia.

Secondo il man page, questo fa le seguenti:

-y, --localise-query

risposte ritorno alle query DNS da/etc/hosts che dipendono l'interfaccia su cui il la query è stata ricevuta.Se un nome in/etc/hosts ha più di un indirizzo ad esso associato, e almeno uno di questi indirizzi si trova nella stessa subnet dell'interfaccia a cui è stata inviata la query, restituisce solo gli indirizzi su quella sottorete . Ciò consente a un server di disporre di più indirizzi in/etc/hosts corrispondenti a ciascuna delle sue interfacce e gli host riceveranno l'indirizzo corretto in base alla rete a cui sono collegati. Attualmente questa funzione è limitata a IPv4.

16

L'aggiunta dell'interfaccia all'inizio di ciascun parametro funziona correttamente. Esempio (in 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 

Sto usando il rilascio:

$ dnsmasq --version 
Version de Dnsmasq 2.68 Copyright (c) 2000-2013 Simon Kelley 
+1

Funziona anche per me quando uso 'dhcp-range' invece di' dhcp-host'. Questa dovrebbe essere la soluzione accettata per le attuali versioni di dnsmasq. – Dyna

+0

@Dyna Funziona, ma non è documentato o mi è mancato qualcosa? – Murmel

+1

@ user1885518 Ero alle prese con la stessa domanda, fino a quando ho trovato questo in [la pagina man] (http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html): "Il tag" bootp "è impostato per le richieste BOOTP e viene impostato anche un tag il cui nome è il nome dell'interfaccia su cui è arrivata la richiesta. Quindi c'è sempre un tag che prende il nome dall'interfaccia in cui è arrivata la richiesta. Molto utile per multi-vlan dhcp. – GnP

4

In alternativa è anche possibile creare più file di configurazione sotto /etc/dnsmasq.d/, una per ogni interfaccia si vuole servire DHCP.

Per esempio se si dispone di due interfacce wireless di nome wlan0 e wlan1, e si vuole servire DHCP su di loro grazie a dnsmasq, è possibile creare due file sotto /etc/dnsmasq.d/ per configurare ogni interfaccia:

/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 

Per me t hat è un modo molto pulito per configurare il sistema e mantenere la configurazione tra riavvii.

+0

Puoi aiutarmi con uno scenario simile? Non sono in grado di risolvere una soluzione. http://serverfault.com/questions/825601/dnsmasq-config-for-captive-portal – 55597

+0

non funzionerà, dato che dnsmasq legge solo i file in modo sequenziale e tutti i file in /etc/dnsmasq.d/ sono considerati configurazione singola . – Dingo

+0

@MariusMatutiae ha accettato, un'ottima risposta – KGCybeX