问题
我想阻止返回私有范围 IP 地址的 DNS 解析。到目前为止,我发现要做这样的事情你需要设置一个缓存/递归 DNS 服务器。但是,由于我想在 docker 中使用它,所以我遇到了困难。
我发现最简单的方法是使用dnsmasq
(如其他答案中所述)。另一方面,只需要运行一个进程,以便找出supervisord
解决该问题的方法。尽管如此,创建了一个示例 docker 映像,当我dnsmasq
通过添加标志或从容器中--dns 127.0.0.1
替换来使用 localhost dns 服务器()时,我得到一个错误,这在我在运行容器时收到警告之后才有意义:/etc/resolv.conf
** server can't find google.com: REFUSED
WARNING: Localhost DNS setting (--dns=127.0.0.1) may fail in containers.
环境
示例泊坞窗图像:
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"]
server can't find google.com: REFUSED
表示没有 DNS 服务器监听指定的地址。默认情况下dnsmasq
不会监听127.0.0.1
地址。