1

开始 - 我仍在现场寻找答案,看起来它们可能让我找到解决问题的方法,在这里发布绝对不是我找到解决方案的第一站,我今天一直在尝试一段时间。另外-感谢您的阅读。我正在为类分配任务,其中对象是运行 bind9 docker 容器作为 DNS 负载平衡器,以使用循环方法平衡两个 Web 服务器之间的请求。所以基本上,如果我向 Web 服务器的域名发出请求,它将转到一个 Web 服务器的 IP 地址,然后下一个请求将转到下一个 Web 服务器的 IP 地址。如果我的术语有点偏离,我深表歉意,我仍在学习这些东西,但希望我已经明白了这一点。我一直在尝试为此使用 2 个 Ubuntu 16.04 虚拟机,一种运行着 httpd 容器,另一种运行着 httpd 容器和 bind9 容器。我能够让 Web 服务器运行,我能够使用主机 IP 连接到它们,并且我还能够让 bind9 容器运行。如果我在浏览器中输入域名,我真正遇到问题的部分实际上是让 bind9 DNS 容器将我带到 Web 服务器。

这是我用来启动 bind9 容器的命令: docker run -d --name=bind --dns=127.0.0.1 --publish=192.168.0.45:53:53/udp --publish=192.168.0.45:10000 :10000 --volume=/srv/docker/bind:/data --env='ROOT_PASSWORD=SecretPassword'sameersbn/bind:latest

Web 服务器非常简单,我只需将包含我的 index.html 文件的目录绑定到 /usr/local/apache2/htdocs 并将其从容器的 80 端口发布到主机的 80 端口。

所有这一切都必须是我本地网络上的一个非常简单的设置,所以我不需要注册域名,我不需要邮件服务器或任何东西,我需要做的就是能够使用“挖掘”向 DNS 服务器查询负载平衡的主机名,并将其解析为 Web 服务器的两个不同 IP 地址。感谢您对此的任何指导,我非常感谢您的帮助,我查看了大量资源,但我只是不知道出了什么问题。

启动 DNS 服务器(bind9 容器)后,我可以使用命令 'host google.com 172.xxx' 并返回正确的信息,我猜 172.xxx 是 docker 容器的 IP,因为我的本地网络是192.168.0.1/24。当我尝试使用 docker 主机的 IP 执行相同的命令时,它显示 REFUSED。我尝试编辑 ACL,使用 webmin 添加区域和地址记录,但我无法让它工作。我现在将停止写作,希望我已经提供了足够的信息,感谢您的阅读。

4

1 回答 1

0

您没有描述 172.xxx 的全部内容。目前还不清楚为什么它会是相关的。请发布dig输出。该host命令已经足够好,但查看更多详细信息将有助于您的调试工作。

您正在拍摄类似于以下内容的输出:

$  dig +nottl a yahoo.com @8.8.8.8

; <<>> DiG 9.10.6 <<>> +nottl a yahoo.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50455
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;yahoo.com.     IN  A

;; ANSWER SECTION:
yahoo.com.      IN  A   74.6.143.25
yahoo.com.      IN  A   74.6.231.20
yahoo.com.      IN  A   74.6.231.21
yahoo.com.      IN  A   98.137.11.163
yahoo.com.      IN  A   98.137.11.164
yahoo.com.      IN  A   74.6.143.26

;; Query time: 62 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)

您希望看到两件事起作用。

(1.) Shell 进入容器并进行本地挖掘查询以从本地 BIND 服务器获得答案。我们想验证我们可以在“简单”的情况下得到一个好的答案。弄乱守护进程的配置,直到答案看起来合理。

此外,使用netstat -an和/或lsof -i:53 验证守护程序为 0.0.0.0 或类似的适当地址发出了 bind()。

(2.) 从感兴趣的客户发送挖掘查询@192.168.0.45。如果这失败了,那就是网络路由问题。当您使用它时,请验证curl(或telnet)是否可以访问 TCP 端口 10000。您会发现它使用起来很方便,curl -i 因此您会看到网络服务器发回的标头。


这里有一点不错。您配置了 UDP 53,这已经足够了。但这肯定是不正确的。DNS 也需要 TCP 端口 53 上的连接。有时,DNS 答案太大而无法容纳在单个(未分段)UDP 数据包中。尤其是在签名的 DNSSEC 区域内。发生这种情况时,名称服务器会发送一个标记为“截断”的响应,并且客户端会在 TCP 端口 53 上重试。您可能会发现这telnet 192.168.0.45 53是一种验证连接性的便捷方式。

于 2021-09-08T03:38:22.410 回答