我正在尝试使用 Docker 容器作为本地 DNS 服务器来重写私有网络内现有域的 IP。
我的设置是,我有一个私有网络,里面有一些机器和一个路由器,路由器有一个可访问互联网的公共 IP。其中一台机器通过从路由器路由到公共 IP 的端口,在指向公共 IP 的域(例如 example.com)下向互联网提供一些内容。问题是私有网络中的其他机器也需要访问该服务器。然而,路由器会阻止来自内部的数据包访问公共 IP。所以我想我会使用这个容器作为本地 DNS 服务器,用本地 IP 覆盖该公共 IP。
总的来说,网络如下:
- IP 为 192.168.1.6 的 Ubuntu 机器 ~> docker 主机
- IP 为 192.168.1.4 的 Ubuntu 机器 ~> 内容主机为 example.com
- IP 范围为 192.168.1.0/8 的其他机器
- 所有机器的DNS服务器设置为192.168.1.6
现在使用这个撰写文件设置 BIND:
version: '2'
services:
bind:
image: sameersbn/bind:latest
restart: always
dns: 8.8.8.8
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
environment:
- ROOT_PASSWORD=somepass
ports:
- 10000:10000
- 53:53/udp
volumes:
- ./data:/data
并具有以下配置:
acl localclients {
192.168.0.0/16;
172.17.0.0/16;
172.23.0.0/16;
localhost;
localnets;
};
options {
directory "/var/cache/bind";
dnssec-validation auto;
auth-nxdomain no;
listen-on-v6 { any; };
listen-on {
any;
};
recursion yes;
allow-query { any; };
allow-recursion {
localclients;
};
allow-query-cache { localclients; };
}
当前在 docker 的主机(IP 为 192.168.1.6)以及同一网络上的其他机器(IP 为 192.168.1.x)上查找域名的工作方式符合预期:
$ nslookup example.com
Server: 192.168.1.6
Address: 192.168.1.6#53
Name: example.com
Address: 192.168.1.4
但我不能在另一个容器中使用它:
$ docker run --rm busybox nslookup example.com
Server: 192.168.1.6
Address 1: 192.168.1.6 servername
Name: example.com
Address 1: 188.15.221.88
当我强制仅使用本地 DNS 服务器时,我得到以下输出
$ docker run --rm --dns 192.168.1.6 busybox nslookup example.com
nslookup: can't resolve 'example.com'
Server: 192.168.1.6
Address 1: 192.168.1.6
我不确定这是docker问题还是绑定配置问题。
答案1
嗯,这不是答案,而是我发现的一种解决方法,所以我不会将其标记为答案。
我找不到任何解决方案,也许这是一个 docker 错误,也许是一个(奇怪的)所需功能。然而,由于我真的需要找到一个解决方案,我使用--add-host
运行命令和extra-hosts
编写文件来解决这个问题。
答案2
基于“--net=host”的解决方案
一种选择是使用 运行第二个docker --net=host
。然后 应该--dns 192.168.1.6
可以工作,因为第二个docker具有与主机相同的网络堆栈。
基于“自定义桥接网络”的解决方案
创建一个具有固定子网的自定义 docker 网络
bridge
(这使得为容器设置静态 IP):docker network create --subnet=172.18.0.0/24 dns-network
启动“dns docker 容器”,公开 DNS 端口 53 并将其连接到 docker 网络:
docker run --publish 53:53 --net=dns-network --ip 172.18.0.53 sameersbn/bind:latest
启动另一个docker容器并配置
172.18.0.53
为DNS服务器:docker run --dns=172.18.0.53 --net=dns-network busybox nslookup example.com