问题
我想阻止返回私有范围 IP 地址的 DNS 解析。到目前为止,我发现要做到这一点,您需要设置缓存/递归 DNS 服务器。但是,由于我想在 docker 中使用它,所以我遇到了困难。
我发现最简单的方法是使用dnsmasq
(如另一个回答)。另一方面,只需要运行一个进程,这样就可以找到supervisord
解决该问题的方法。尽管如此,还是创建了一个示例 docker 镜像,当我dnsmasq
通过添加标志--dns 127.0.0.1
或/etc/resolv.conf
在容器内替换来使用 localhost dns 服务器()时,我收到一个错误** server can't find google.com: REFUSED
,这在运行容器时收到警告后才有意义:
WARNING: Localhost DNS setting (--dns=127.0.0.1) may fail in containers.
环境
示例 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"]
主管.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
建造:
sudo docker build . -t samplednsmasq
跑步:
sudo docker run -it --dns 127.0.0.1 --rm samplednsmasq:latest
这可行吗?
我想知道是否有任何方法可以使其工作(不使用像 docker-compose 这样的多容器)和 dnsmasq,我也愿意接受其他不涉及 dns 缓存服务器的替代方案。
解决方案:更改supervisor.conf
为:
[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
还更新了 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"]
答案1
server can't find google.com: REFUSED
表示没有 DNS 服务器监听指定地址。默认情况下dnsmasq
不会监听该127.0.0.1
地址。