Docker 无法解析 BIND 服务器的 DNS

Docker 无法解析 BIND 服务器的 DNS

我正在尝试使用 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具有与主机相同的网络堆栈。

基于“自定义桥接网络”的解决方案

  1. 创建一个具有固定子网的自定义 docker 网络bridge(这使得为容器设置静态 IP):

    docker network create --subnet=172.18.0.0/24 dns-network
    
  2. 启动“dns docker 容器”,公开 DNS 端口 53 并将其连接到 docker 网络:

    docker run --publish 53:53 --net=dns-network --ip 172.18.0.53 sameersbn/bind:latest
    
  3. 启动另一个docker容器并配置172.18.0.53为DNS服务器:

    docker run --dns=172.18.0.53  --net=dns-network busybox nslookup example.com
    

相关内容