Sto cercando di get dnsmasq per operare come server DHCP all'interno di un contenitore Docker, rilasciando indirizzi DHCP alle macchine sulla networking fisica dell'host. Sto utilizzando il contenitore Alpine Linux 6MB da https://hub.docker.com/r/andyshinn/dnsmasq/ .
Funziona bene come un server DNS sulla port 53 sulla macchina host, ma non c'è niente di ascolto sulla port 67 / udp, where è where mi aspetto che il DHCP sia. Io uso dhcping 192.168.2.2
, ma ricevo "nessuna risposta". telnet 192.168.2.2 67
restituisce "Connessione rifiutata".
Il mio file dnsmasq.conf nel contenitore sembra questo:
interface=eth0 user=root domain-needed bogus-priv no-resolv local=/mydomain.io/ no-poll server=8.8.8.8 server=8.8.4.4 no-hosts addn-hosts=/etc/dnsmasq_static_hosts.conf expand-hosts domain=mydomain.io dhcp-range=192.168.2.10,192.168.2.250,255.255.255.0,192.168.2.255,5m # Have windows machine release on shutdown dhcp-option=vendor:MSFT,2,1i # No default route dhcp-option=3
La macchina host ha un indirizzo statico di 192.168.2.2.
Inizio il contenitore come questo:
docker run -d --name dns -p 192.168.2.2:67:67/udp -p 192.168.2.2:53:53/udp sitapati/dns
Non esiste alcun firewall su questa macchina, che esegue Ubuntu 16.04.
Le cose che ho pensato / provato:
docker inspect
docker mi dice che è 172.17.0.2 sull'interface ponte) --net host
? Ho provato questo, e ancora non funzionava. Sì, il contenitore avrà le proprie interfacce su una substring virtuale (rhe docker0 bridge network). Quindi, cercherà di offrire indirizzi su quella substring.
Utilizzando l'host –net ha funzionato per me, ho ottenuto il server DHCP utilizzando qualcosa come il seguente command:
docker run --name dnsmasq2 -t -v /vagrant/dnsmasq.conf:/opt/dnsmasq.conf -p 67:67/udp --net host centos
–net host assicura che il contenitore sembra utilizzare lo stack di networking dell'host piuttosto che il proprio.
dnsmasq -q -d --conf-file=/opt/dnsmasq.conf --dhcp-broadcast
Inoltre ho dovuto aggiungere la bandiera di -dhcp-broadcast a dnsmasq all'interno del contenitore per farlo trasmettere in realtà i messaggi DHCPOFFER sulla networking. Per qualche ragione, dnsmasq stava cercando di unicast i messaggi DHCPOFFER e stava usando ARP per cercare di get un indirizzo che non era ancora stato assegnato.