2016-08-07 6 views
-1

Я пытаюсь заставить dnsmasq работать как DHCP-сервер внутри контейнера Docker, выдавая адреса DHCP машинам в физической сети хоста. Я использую контейнер Alpine Linux 6MB от https://hub.docker.com/r/andyshinn/dnsmasq/.Запустите dnsmasq как DHCP-сервер из контейнера Docker

Он отлично работает как DNS-сервер на порту 53 на хост-компьютере, однако на порту 67/udp ничего не слышно, и именно там я ожидаю, что DHCP будет. Я использую dhcping 192.168.2.2, но получить «нет ответа». telnet 192.168.2.2 67 возвращает «Соединение отказано».

Мой файл dnsmasq.conf в контейнере выглядит следующим образом:

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 

Хост машина имеет статический адрес 192.168.2.2.

Я начинаю контейнер, как это:

docker run -d --name dns -p 192.168.2.2:67:67/udp -p 192.168.2.2:53:53/udp sitapati/dns

Там нет брандмауэра на этом компьютере, который работает под управлением Ubuntu 16.04.

Вещи я думал о/пробовал:

  • это потому, что eth0 в контейнере имеет адрес на совершенно другой подсети? (docker inspect говорит мне, что это 172.17.0.2 на мостовом интерфейсе)
  • Нужно ли использовать --net host? Я пробовал это, и он все еще не работал.
+1

В конечном итоге я использовал isc-dhcpd. Это работает. Все еще не уверен, почему dnsmasq не работает. Вот рабочий DHCP-сервер внутри контейнера Docker: https://github.com/jwulf/docker-dhcpd –

+1

Почему этот вопрос был проголосован? – igal

ответ

5

Да, у контейнера будут свои интерфейсы в виртуальной подсети (сеть моста докере0). Таким образом, он будет пытаться предлагать адреса в этой подсети.

Использование --net хозяин работал для меня, я сервер DHCP работает, используя что-то вроде следующей команды:

docker run --name dnsmasq2 -t -v /vagrant/dnsmasq.conf:/opt/dnsmasq.conf -p 67:67/udp --net host centos 

--net хост гарантирует, что контейнер, как представляется, используя сетевой стек хоста, а не свой.

dnsmasq -q -d --conf-file=/opt/dnsmasq.conf --dhcp-broadcast 

Я также необходимо добавить флаг --dhcp-широковещательный Dnsmasq внутри контейнера, чтобы он на самом деле транслировать сообщения DHCPOFFER в сети. По какой-то причине dnsmasq пытался одноадресным образом отправлять сообщения DHCPOFFER и использовал ARP, чтобы попытаться получить адрес, который еще не был назначен.