2016-08-07 99 views
-1

我試圖讓dnsmasq作爲Docker容器內的DHCP服務器運行,向主機的物理網絡上的計算機發出DHCP地址。我使用https://hub.docker.com/r/andyshinn/dnsmasq/的Alpine Linux 6MB容器。從Docker容器中將dnsmasq作爲DHCP服務器運行

它可以在主機上的端口53上作爲DNS服務器正常工作,但沒有任何監聽端口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不起作用。 以下是Docker容器內的可用DHCP服務器: https://github.com/jwulf/docker-dhcpd –

+1

爲什麼這個問題被低估? – igal

回答

5

是的,該容器將有一個虛擬子網上的自己的接口(rhe docker0橋網絡)。因此,它將嘗試提供該子網上的地址。

使用--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嘗試獲取尚未分配的地址。

相關問題