Ubuntu 16.04.3 DNS解析故障求助:自建DNS服务器无法外网访问
嘿,作为刚上手Ubuntu和DNS搭建的新手,遇到本地能正常解析但外部连不上的问题太正常了,咱们一步步揪出可能遗漏的配置:
先检查VPS系统防火墙的端口放行
DNS服务默认依赖UDP 53端口(区域传输等场景会用到TCP 53),如果你的防火墙只开放了本地访问,外部请求根本进不来。
要是用的是Ubuntu自带的ufw,先执行sudo ufw status看看当前规则,如果没看到53端口的允许项,赶紧补上:sudo ufw allow 53/udp sudo ufw allow 53/tcp sudo ufw reload要是用的是
iptables,记得添加对应的ACCEPT规则,别只给127.0.0.1开权限。别漏了VPS服务商的安全组/防火墙
很多VPS厂商都有自己的外层安全组,哪怕你系统里开了端口,服务商那边没放行的话,外部还是连不上。登录你的VPS管理后台,找到安全组配置页面,确保UDP 53和TCP 53端口对所有IP(或者你测试用的IP)开放。确认DNS服务的监听地址
你的DNS服务(比如Bind9)可能只监听了localhost(127.0.0.1),这样外部请求根本触达不到服务。打开Bind的主配置文件(一般是/etc/bind/named.conf.options),找到listen-on和listen-on-v6的配置项,改成监听公网IP或者所有地址:listen-on { any; }; listen-on-v6 { any; };改完重启服务:
sudo systemctl restart named,然后用ss -tulpn | grep named检查一下,确保服务在公网IP的53端口上监听着。必须配置Glue记录(胶水记录)
因为你的ns1.example.com和ns2.example.com都是example.com的子域名,而递归DNS服务器要找你的NS服务器,得先知道这两个子域名的IP——这就需要在域名注册商那边配置Glue记录,把ns1.example.com和ns2.example.com直接绑定到123.123.11.123。
要是没配置这个,外部DNS会陷入“要解析example.com得找ns1,但解析ns1又得找example的NS”的死循环,自然无法访问。登录域名注册商后台,找Glue Records或者“Nameserver IP关联”的选项,把这俩NS域名和IP绑定好。核对DNS区域文件的正确性
虽然本地dig正常,但还是要确认你的example.com区域文件(比如/etc/bind/db.example.com)里的配置:- 有没有正确的A记录指向网站的公网IP?
- NS记录是不是确实设置为ns1.example.com和ns2.example.com?
- SOA记录里的主服务器是不是ns1.example.com,邮箱格式有没有写错(比如应该是
admin.example.com,用点代替@)?
用外部DNS服务器测试解析
你可以在本地电脑上用dig命令指定公共DNS测试,比如:dig example.com @8.8.8.8 dig ns1.example.com @8.8.8.8如果返回
SERVFAIL或者NXDOMAIN,要么是你的DNS服务器没响应外部请求,要么是全球DNS缓存还没更新。给DNS缓存一点时间
刚修改域名的NS记录后,全球各地的递归DNS服务器需要时间更新缓存,这个周期由你设置的TTL决定(通常几个小时到一天)。可以用dig example.com +trace查看解析链路,确认是不是已经走到你的DNS服务器了。
内容的提问来源于stack exchange,提问作者Vimal

