Problema
Desejo bloquear resoluções de DNS que retornam endereços IP de intervalo privado. O que descobri até agora é que, para fazer isso, você precisa configurar um servidor DNS de cache/recursivo. No entanto, como eu quero usá-lo dentro do docker, é aí que me deparo com dificuldades.
A maneira mais simples que encontrei é usar dnsmasq
(conforme explicado nesta outra resposta ). Por outro lado, só precisa executar um único processo para descobrir o supervisord
que resolve esse problema. Mesmo assim, criei uma imagem docker de exemplo e quando uso o servidor localhost dns( dnsmasq
) adicionando o sinalizador --dns 127.0.0.1
ou substituindo /etc/resolv.conf
de dentro do container recebo um erro ** server can't find google.com: REFUSED
, o que só faz sentido após o aviso que recebo na hora de executar o container:
WARNING: Localhost DNS setting (--dns=127.0.0.1) may fail in containers.
Meio Ambiente
Exemplo de imagem do docker:
FROM ubuntu:latest
RUN apt update &&\
apt upgrade -y
RUN apt install -y supervisor \
dnsmasq \
dnsutils \
iputils-ping \
nano
RUN echo "stop-dns-rebind" > /etc/dnsmasq.d/stop-rebinding
COPY supervisor.conf /etc/supervisor.conf
ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisor.conf"]
supervisor.conf:
[supervisord]
nodaemon=true
logfile=/dev/stdout
logfile_maxbytes=0
[program:dnsmasq]
command=dnsmasq --no-daemon
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
Construir:
sudo docker build . -t samplednsmasq
Corre:
sudo docker run -it --dns 127.0.0.1 --rm samplednsmasq:latest
É factível?
Gostaria de saber se existe alguma maneira de fazê-lo funcionar (sem usar multi-container como docker-compose) e dnsmasq, também estou aberto a outras alternativas que não envolvam um servidor de cache dns.
Solução: alterou supervisor.conf
para:
[supervisord]
nodaemon=true
logfile=/dev/stdout
logfile_maxbytes=0
[program:dnsmasq]
command=dnsmasq --no-daemon --interface=lo --stop-dns-rebind
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
Também atualizou o Dockerfile
FROM ubuntu:latest
RUN apt update &&\
apt upgrade -y
RUN apt install -y supervisor \
dnsmasq \
dnsutils \
iputils-ping \
nano \
net-tools
RUN echo "listen-address=127.0.0.1\nbind-interfaces\nstop-dns-rebind" > /etc/dnsmasq.d/stop-rebinding &&\
echo "\nserver=8.8.8.8\nserver=8.8.4.4\nno-resolv" >> /etc/dnsmasq.conf
COPY supervisor.conf /etc/supervisor.conf
ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisor.conf"]
server can't find google.com: REFUSED
significa que não há servidor DNS escutando no endereço especificado. Por padrãodnsmasq
, não ouvirá no127.0.0.1
endereço.