Estou tentando usar macvlan
para criar um container que seja um cidadão de primeira classe na minha lan .
Estou usando um IP estático (embora eu entenda que usando alguns 'truques' é possível usar DHCP também).
Eu entendo que é possível fazer isso com a host
rede , mas estou planejando executar 2 contêineres DNS separados e quero que cada um deles tenha um IP diferente, então host
não é a solução que estou procurando.
Minha configuração
Detalhes sobre minha configuração de rede e host:
- Roteador Unifi UGS, IP interno:
192.168.1.254
- Máscara de rede:
192.168.1.0/24
- SO do host: Ubuntu 20.04 LTS (Focal Fossa)
- Versão do Docker 20.10.2, compilação 20.10.2-0ubuntu1~20.04.2
- versão do docker-compose 1.28.5, compilação c4eb3a1f
- O IP do host é recebido por uma interface de ponte (chamada
br-lan
) que está conectada à minha porta ethernet.
Estou usando [adguard-home][2]
como imagem do contêiner de teste, abaixo está a saída de configuração do docker-compose:
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
O que funciona
Isso realmente funciona para TCP, posso acessar a WebUI (portas 3000 e 80) e, desde que as consultas DNS sejam feitas sobre TCP, funciona (porta tcp 53).
O próprio contêiner pode acessar a web e, por sua vez, o contêiner pode ser acessado pelo host, bem como pelas máquinas na LAN.
O que não funciona
As consultas DNS UDP falham.
Como estou testando?
Em uma máquina Windows 10 na rede, estou executando o seguinte comando do 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
Qual é a minha dúvida e porque estou postando aqui?
Não consigo descobrir por que o UDP falha enquanto o TCP funciona. Minhas pesquisas sobre UDP macvlan
não foram frutíferas, e eu esperava que alguém aqui pudesse me orientar sobre como solucionar isso para que eu possa identificar a falha no meu design ou explicar o que posso fazer para corrigir isso.
Parece que o problema tinha algo a ver com a configuração da minha rede.
Após uma reinicialização, a comunicação UDP começou a funcionar.
Observe (não relacionado à pergunta, mas pode ser de interesse), que por padrão a comunicação entre o contêiner e o host é bloqueada por padrão.
Apenas mais alguns detalhes: acabei usando o ipvlan, que funcionou melhor. Para conectar ao host (que ipvlan e macvlan bloqueiam), adicionei uma bridge e usei um ip local (arquivo hosts na máquina local resolveu esse problema).
O problema original não está descrito corretamente e, portanto, excluirei esta resposta mais tarde.
reiniciar não é solução.
Eu acho que seu problema foi resolvido após a reinicialização porque o início automático do serviço de firewall não está ativado e agora seu firewall não foi iniciado.
no Ubuntu 20 você pode gerenciar o firewall com o ufw e você deve adicionar a porta 53 ao firewall