我有一个从 GoDaddy 购买的域名betasquirrel.com
和一个装有 Ubuntu 16.04 的 VPS。我使用 BIND9 成功托管了该域名,如下所示:
在 Apache 中创建虚拟主机betasquirrel.com
并放置文件。接下来在 GoDaddy 中创建两个主机ns1.betasquirrel.com
并ns2.betasquirrel.com
指向 VPS IP 地址。
接下来配置BIND9,
/etc/bind/zones/master/db.betasquirrel.com
;
; BIND data file for betasquirrel.com
;
$TTL 3h
@ IN SOA ns1.betasquirrel.com. admin.betasquirrel.com. (
1 ; Serial
3h ; Refresh after 3 hours
1h ; Retry after 1 hour
1w ; Expire after 1 week
1h ) ; Negative caching TTL of 1 day
;
@ IN NS ns1.betasquirrel.com.
@ IN NS ns2.betasquirrel.com.
betasquirrel.com. IN MX 10 mail.betasquirrel.com.
betasquirrel.com. IN A 144.217.163.139
ns1 IN A 144.217.163.139
ns2 IN A 144.217.163.139
www IN CNAME betasquirrel.com.
mail IN A 144.217.163.139
ftp IN CNAME betasquirrel.com.
/etc/bind/zones/master/db.144.217.163
;
; BIND reverse data file for 163.217.144.in-addr.arpa
;
$TTL 604800
163.217.144.in-addr.arpa. IN SOA ns1.betasquirrel.com. admin.betasquirrel.com. (
1 ; Serial
3h ; Refresh after 3 hours
1h ; Retry after 1 hour
1w ; Expire after 1 week
1h ) ; Negative caching TTL of 1 day
;
163.217.144.in-addr.arpa. IN NS ns1.betasquirrel.com.
163.217.144.in-addr.arpa. IN NS ns2.betasquirrel.com.
139.163.217.144.in-addr.arpa. IN PTR betasquirrel.com.
/etc/bind/named.conf.local
zone "betasquirrel.com" {
type master;
file "/etc/bind/zones/master/db.betasquirrel.com";
};
zone "163.217.144.in-addr.arpa" {
type master;
file "/etc/bind/zones/master/db.144.217.163";
};
在named.conf.options
forwarders {
213.186.33.99;
};
/etc/init.d/bind9 restart
接下来在 GoDaddy 中添加名称服务器ns1.betasquirrel.com
,ns2.betasquirrel.com
网站便开始运行。
现在我该如何托管像这样的子域名demo.betasquirrel.com
。我刚刚创建了虚拟主机,但它不起作用。
/etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
search demo.betasquirrel.com
search betasquirrel.com
nameserver 213.186.33.99
search local
/etc/apache2/sites-available/betasquirrel.com.conf
<VirtualHost *:80>
ServerName betasquirrel.com
ServerAlias www.betasquirrel.com
DocumentRoot /var/www/html/betasquirrel.com/htdocs
DirectoryIndex index.php index.html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
/etc/apache2/sites-available/demo.betasquirrel.com.conf
<VirtualHost *:80>
ServerName demo.betasquirrel.com
ServerAlias www.demo.betasquirrel.com
DocumentRoot /var/www/html/demo.betasquirrel.com/htdocs
DirectoryIndex index.php index.html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
答案1
根据之前的故障排除,您的域区域根本没有从 BIND 提供服务,即使服务器本身正在运行,并且委派是正确的。
根据您的评论,你已经删除了demo
条目,并且您域的其余部分已重新开始工作,这导致我们发现实际被删除的条目,这些条目加在一起都是错误的:
-demo.betasquirrel.com. IN A 144.217.163.139
-demo IN A 144.217.163.139
-demo IN CNAME demo.betasquirrel.com.
首先,前两个条目是相同的——扩展后,两者的左侧和右侧都是相同的,这可能会导致错误,因为相同的条目实际上出现了两次。
然而,最成问题的问题来自于同时存在
A
和记录——记录意味着这个名称指的是不同的主机;因此,名称不能同时包含任何其他记录,因为它只是一个别名。CNAME
CNAME
用文件系统术语来说,
A
记录就像文件中的一行,可以与几乎任何其他记录(同一文件中的行)共存。然而,记录CNAME
就像象征性的link
——如果给定文件是符号链接,它本身也不能包含任何其他随机行。此外,仔细查看您的 CNAME,它实际上是从其自身到其自身的链接(扩展后),这本身也是完全错误的。
解决方案:
要么添加一条CNAME
记录,要么添加一条A
记录;区别在于语义,这里没有“正确”或“错误”的解决方案。但是,您不能同时添加两者。此外,如果添加 CNAME 记录,它必须指向包含所需 A 记录的现有记录,并且绝对不能简单地指向自身。
选项 0:
+demo IN A 144.217.163.139
选项 1a:
+demo IN CNAME @
选项 1b:
+demo IN CNAME betasquirrel.com.
选项 2a:
+demo IN CNAME www
选项 2b:
+demo IN CNAME www.betasquirrel.com.
您无法同时选择所有选项!
不,真的不行!这根本行不通。别怪我们。
请注意,选项a
和b
是相同的 - 唯一的区别在于您在配置文件中使用的语法,但是当服务器将其加载到代表 DNS 协议的结构中时,两种符号之间不应该有任何区别。
另外请注意,+
示例前面的符号表示您必须添加的行,它不应该是文件的实际部分。
答案2
您的问题似乎在于您的 BIND 似乎没有正确配置,因此,您的区域内没有主机似乎可以解析,至少在外部没有。
您的粘合记录已在您的注册商处正确配置,因此无需进行任何更改:
% dig @a.gtld-servers.net. ns1.BETASQUIRREL.COM. | egrep "^[[:alnum:]]"
BETASQUIRREL.COM. 172800 IN NS ns2.BETASQUIRREL.COM.
BETASQUIRREL.COM. 172800 IN NS ns1.BETASQUIRREL.COM.
ns2.BETASQUIRREL.COM. 172800 IN A 144.217.163.139
ns1.BETASQUIRREL.COM. 172800 IN A 144.217.163.139
您的服务器确实似乎在线,因此这不是防火墙问题:
% dig @144.217.163.139 version.bind txt chaos +short
"9.10.3-P4-Ubuntu"
但是,您的 BIND 似乎并未充当您的域区域的权威服务器:
% dig @144.217.163.139 ns1.BETASQUIRREL.COM. a +short
%
与名称配置正确时发生的情况进行比较:
% dig @216.218.131.2 ns2.he.net a +short
216.218.131.2
%
请注意,您的域名内似乎没有一个主机可以工作;如果有些主机可以工作,那么可能与某些主机工作时的早期条目的缓存有关。
此外,请注意,配置反向区域,163.217.144.in-addr.arpa.
仅当您在单个 /24 中购买了至少 256 个 IPv4 地址,并已收到该区域的完整委派时才适用。有时提供商还支持“无类别”委派,例如,根据https://www.rfc-editor.org/rfc/rfc2317然而,对于 OVH 这样的价值和云提供商来说,最常见的可能是简单地使用他们的界面在他们自己的服务器上设置反向记录,而无需在您的终端运行任何额外的区域。
请注意,forwarders { 8.8.4.4; };
仅当您打算运行本地递归DNS 服务器;它独立于运行权威性DNS 服务器,就像您最初尝试的那样。由于潜在的缓存中毒问题,将两者作为同一守护进程的一部分运行通常不是一个好主意。
此外,8.8.4.4
由于这个答案的原因太长,使用是一个坏主意,并且您已经在中使用213.186.33.99
(cdns.ovh.net.
)/etc/resolv.conf
,它必须是您的提供商的递归服务器,并且可能是该设置的最佳选择。
建议的解决方案:看起来您正在尝试解决多个相互冲突的独立问题。您可能应该forwarders
从 BIND 中删除该设置;确定它为何不充当您的权威服务器(查看其日志以了解可能发生了什么),如果做不到这一点,只需将运行名称服务器的工作委托给第三方即可。
大多数托管服务提供商已经以极低的费用或免费支持权威 DNS 服务器(如果您是客户),并且拥有可以配置内容的 Web 界面。此外,还有许多免费提供商;最常见的是http://dns.he.net/——它是免费的,而且速度非常快,还允许您在线编辑您的设置。
或者,我也可以建议你放弃 BIND 和 Apache 设置,并尝试使用 NSD3 和nginx。
答案3
如果您想开始用作demo
子域名,则需要向您的区域文件添加 A 或 CNAME 记录,就像您对ns1
、ns2
和所做的那样mail
。
因此你的区域文件应如下所示:
;
; BIND data file for betasquirrel.com
;
$TTL 3h
@ IN SOA ns1.betasquirrel.com. admin.betasquirrel.com. (
2 ; Serial
3h ; Refresh after 3 hours
1h ; Retry after 1 hour
1w ; Expire after 1 week
1h ) ; Negative caching TTL of 1 hour
@ IN NS ns1
@ IN NS ns2
@ IN MX 10 mail
@ IN A 144.217.163.139
ns1 IN A 144.217.163.139
ns2 IN A 144.217.163.139
www IN A 144.217.163.139
mail IN A 144.217.163.139
ftp IN CNAME www
demo IN CNAME www
注意最后一行的添加。现在您的 DNS 服务器知道当您请求 demo.betasquirrel.com 时如何响应。
当您进行更改时,也不要忘记增加序列号。
顺便说一句,我不会在子域上使用 CNAME 来循环回顶级域...所以我也改变了这一点。并且@
是当前来源(即域名)的快捷方式。