我正在尝试使用macvlan
来创建一个容器,它是我局域网上的头等公民。
我使用的是静态IP (虽然我理解使用一些“技巧”-使用DHCP也是可能 )。
我理解用host
网络来实现它的可能性,但是我计划运行两个独立的DNS容器,我希望每个容器都有不同的IP,所以host
不是我想要的解决方案。
有关我的网络和主机设置的详细信息:
192.168.1.254
192.168.1.0/24
br-lan
)接收的。我使用[adguard-home][2]
作为测试容器的映像,下面是docker输出:
version: '3.7'
networks:
br-lan:
driver: macvlan
driver_opts:
parent: br-lan
ipam:
config:
- gateway: 192.168.1.254
subnet: 192.168.1.0/24
driver: default
services:
adguard:
dns: # adguards default upstream DNS servers
- 9.9.9.10
- 149.112.112.10
- 2620:fe::10
- 2620:fe::fe:10
image: adguard/adguardhome
mac_address: '00:01:02:03:04:05:06:07' # Some randomized MAC address
mem_limit: 500mb
networks:
br-lan:
ipv4_address: 192.168.1.53
restart: unless-stopped
volumes:
- /etc/localtime:/etc/localtime:ro
- /srv/adguard/data/conf:/opt/adguardhome/conf:rw
- /srv/adguard/data/work:/opt/adguardhome/work:rw
这实际上适用于TCP,我可以访问WebUI (端口3000和80),只要在TCP上完成DNS查询,它就能工作(tcp端口53)。
容器本身可以访问web,反过来,主机和局域网上的机器也可以访问容器。
UDP DNS查询失败。
在网络中的Windows 10机器上,我运行以下PowerShell命令:
# Default (UDP) DNS Query - Fails
❯ Resolve-DnsName -DnsOnly -Server 192.168.1.53 -Name stackoverflow.com # Test regular UDP DNS Query
<# The Error output is
Resolve-DnsName : stackoverflow.com : DNS name does not exist
At line:1 char:1
+ Resolve-DnsName -DnsOnly -Server 192.168.1.53 -Name stackoverflow.c ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ResourceUnavailable: (stackoverflow.com:String) [Resolve-DnsName], Win32Exception
+ FullyQualifiedErrorId : DNS_ERROR_RCODE_NAME_ERROR,Microsoft.DnsClient.Commands.ResolveDnsName
#>
# TCP DNS Query - works
❯ Resolve-DnsName -DnsOnly -Server 192.168.1.53 -Name stackoverflow.com -TcpOnly
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
stackoverflow.com A 2507 Answer 151.101.65.69
stackoverflow.com A 2507 Answer 151.101.129.69
stackoverflow.com A 2507 Answer 151.101.193.69
stackoverflow.com A 2507 Answer 151.101.1.69
我不明白为什么在TCP工作时UDP会失败。我对UDP和macvlan
的搜索并没有取得什么成果,我希望这里的人能够指导我如何解决这个问题,这样我就可以识别我的设计中的缺陷,或者解释我能做些什么来解决这个问题。
发布于 2021-07-11 14:42:03
看来这个问题和我的网络设置有关。
重新启动后,UDP通信开始工作。
注意(与问题无关,但可能感兴趣),默认情况下,容器和主机之间的通信在默认情况下被阻塞。
只是更多的细节:我最终使用了ipvlan,这样做效果更好。为了连接到主机( ipvlan和macvlan块),我添加了一个桥并使用本地ip (本地机器上的主机文件解决了这个问题)。
原来的问题没有得到正确的描述,所以我稍后将删除这个答案。
发布于 2021-07-11 15:18:28
重新启动并不能解决问题。
我想您的问题在重新启动后得到了解决,因为防火墙服务的自动启动是不启用的,而现在您的防火墙还没有启动。
在ubuntu 20中,您可以使用ufw管理防火墙,并且必须在防火墙中添加端口53。
sudo systemctl start ufw # start firewall service
sudo systemctl enabled ufw # enable automatically start firewall service
sudo ufw allow 53 # open tcp/udp dns port
sudo ufw reload # apply firewall rule
https://serverfault.com/questions/1068807
复制相似问题