情况:
我有一台支持端口转发和 ddns 的路由器,以及一台位于路由器后面并托管网站的服务器。我注册了一个 ddns ( example.ddns.com
),并让路由器将端口 80 转发到网站。到目前为止一切正常。
目标:
我想为网站设置一个子域名(subdomain.example.ddns.com
)。
我所做的:
我设置了一个 DNS 服务器(使用 bind9),它也位于路由器后面。我让路由器将端口 53 转发到此 DNS 服务器。
DNS 服务器的设置如下:
> named.conf.options
listen-on-v6 { none; };
listen-on port 53 {
127.0.0.0/24;
192.168.1.0/24;
8.8.8.8;
};
allow-query {
127.0.0.0/24;
192.168.1.0/24;
8.8.8.8;
};
allow-recursion {
127.0.0.1;
};
allow-transfer { none; };
> named.conf.local
zone "example.ddns.com" {
type master;
file "/etc/bind/db.example.ddns.com"
};
> db.example.ddns.com
@ IN SOA example.ddns.com. hostmaster.example.ddns.com. (
[Serial, Refresh, etc....]
;
@ IN NS ns.example.ddns.com.
@ IN A 127.0.0.1
@ IN AAAA ::1
ns IN A 127.0.0.1
subdomain IN A 127.0.0.1
我在网络服务器上还有一个虚拟主机来提供服务subdomain.example.ddns.com
。
问题:
但是无论我从内网还是外网在浏览器上nslookup/dig/request都subdomain.example.ddns.com
没有记录。是不是服务器和路由器设置有问题?还是根本就没办法?
答案1
从技术上讲这是可行的,但只有当 DDNS 运营商创建NS 记录在“example.ddns.com”处。基本 A 记录(允许解析示例域本身的记录)不会自行创建子域委派。
其次,如果你这样做,你需要删除限制,allow-query
因为查询将来自全部各种解析器。(使用 DNS 解析器不是双向关系 - 只是因为您将自己的查询发送到 8.8.8.8,并不意味着其他人的查询都将来自 8.8.8.8。)
(即使您确实尝试通过 8.8.8.8 查询您的域名,它在将查询转发到您的名称服务器时实际上会使用不同的地址。)
除此之外,listen-on { 8.8.8.8 }
这是毫无意义的,因为您的计算机并不拥有该地址;它永远不会接收发送给它的数据包。只有直接分配给操作系统的地址(即那些出现在其 中的地址ip addr
)才可以用作绑定/侦听地址。(其余的侦听规范也是如此。)最简单的方法是指定,仅any
此而已。
最后,您还需要在 DNS 区域中放入一些更有用的内容。仅列出本地主机地址(::1 和 127.0.0.1)效果不佳,因为每个客户端都会被告知要连接到他们的“localhost”。您的 DNS 区域需要指向服务器的真实 IP 地址。(由于涉及端口转发,有时您可能需要为内部和外部客户端定义不同的“视图”。)