服务器内网 dns 如何搭建
照着做完,你能在一台 Linux 服务器上跑起一套只服务内网的 DNS,让 git.corp.local、nas.corp.local 这类域名在内网直接解析,不用再记 IP。下面以 Ubuntu 22.04 + BIND 9.18 为例,一步步做。
第一步:确定服务器和网段信息
先定下这台 DNS 服务器自己的固定 IP 和你要用的内网域名。本文假设:DNS 服务器 IP 是 192.168.10.10,内网网段 192.168.10.0/24,内网域名用 corp.local。把这两个值替换成你自己的,后面所有配置文件都跟着改。
注意:不要用
local、internal以外的真实公网域名做内网域,尤其别用你自己已注册的公网域名,否则内外解析会打架。推荐corp.local、home.lan这类。
第二步:安装 BIND9
这一步装好 DNS 服务端程序和排查工具,装完 named 进程就有了但还没启动成功配置。
sudo apt update
sudo apt install -y bind9 bind9-utils bind9-dnsutils
sudo systemctl status bind9
bind9 是服务本体,bind9-utils 提供 named-checkconf、named-checkzone 检查工具,bind9-dnsutils 提供 dig、nslookup。
第三步:改主配置,只对内网提供服务
编辑 /etc/bind/named.conf.options,把 options { ... } 整段替换成下面内容,目的是限定监听地址、只允许内网查询、并把外网域名转发给公共 DNS:
options {
directory "/var/cache/bind";
listen-on { 127.0.0.1; 192.168.10.10; };
listen-on-v6 { none; };
allow-query { localhost; 192.168.10.0/24; };
recursion yes;
forwarders { 223.5.5.5; 114.114.114.114; };
dnssec-validation no;
};
forwarders 让内网解析不了的外网域名(比如 www.baidu.com)自动转发出去,这样客户端只配一个 DNS 就够了。
第四步:声明两个区域
编辑 /etc/bind/named.conf.local,在文件末尾追加:
zone "corp.local" {
type master;
file "/etc/bind/db.corp.local";
};
zone "10.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.10";
};
第一个是正向区域(域名→IP),第二个是反向区域(IP→域名)。反向区域名要把网段倒着写:192.168.10.x 对应 10.168.192.in-addr.arpa。
第五步:写正向解析文件
新建 /etc/bind/db.corp.local,内容如下,这就是内网域名清单:
$TTL 604800
@ IN SOA ns1.corp.local. admin.corp.local. (
2024011501 ; 序列号,每次改完要 +1
3600
900
604800
86400 )
@ IN NS ns1.corp.local.
ns1 IN A 192.168.10.10
git IN A 192.168.10.21
db IN A 192.168.10.22
nas IN A 192.168.10.30
wifi IN CNAME nas.corp.local.
注意:
SOA行末尾的admin.corp.local.其实是邮箱admin@corp.local的写法,最后的点不能省;每一行域名后面的点也建议保留,否则会被自动拼上corp.local。
改完设权限,让 bind 用户能读:
sudo chown root:bind /etc/bind/db.corp.local
sudo chmod 644 /etc/bind/db.corp.local
第六步:写反向解析文件
新建 /etc/bind/db.192.168.10,只写 IP 最后一段加 PTR:
$TTL 604800
@ IN SOA ns1.corp.local. admin.corp.local. (
2024011501
3600
900
604800
86400 )
@ IN NS ns1.corp.local.
10 IN PTR ns1.corp.local.
21 IN PTR git.corp.local.
22 IN PTR db.corp.local.
30 IN PTR nas.corp.local.
第七步:检查语法并启动
先检查再重启,能避免服务起不来:
sudo named-checkconf
sudo named-checkzone corp.local /etc/bind/db.corp.local
sudo named-checkzone 10.168.192.in-addr.arpa /etc/bind/db.192.168.10
sudo systemctl restart bind9
sudo systemctl enable bind9
sudo ss -lunp | grep :53
三条检查命令都返回 OK 或没报错,ss 能看到 192.168.10.10:53 在监听,服务就算起来了。如果服务器开了 ufw,放行内网查询:
sudo ufw allow from 192.168.10.0/24 to any port 53 proto udp
sudo ufw allow from 192.168.10.0/24 to any port 53 proto tcp
本机自测:
dig @192.168.10.10 git.corp.local +short # 应返回 192.168.10.21
dig @192.168.10.10 -x 192.168.10.21 +short # 应返回 git.corp.local.
dig @192.168.10.10 www.baidu.com +short # 应返回百度 IP,说明转发正常
第八步:把客户端指过来
Linux 客户端(Ubuntu,走 netplan):编辑 /etc/netplan/00-installer-config.yaml,在对应网卡下加:
nameservers:
addresses: [192.168.10.10]
然后 sudo netplan apply。如果系统装了 systemd-resolved,它会接管 /etc/resolv.conf,直接改该文件无效,要改 /etc/systemd/resolved.conf 里的 DNS=192.168.10.10,再 sudo systemctl restart systemd-resolved。
Windows 客户端:右键任务栏网络图标 →「打开网络和 Internet 设置」→「以太网」→「编辑 IP 分配」旁的「DNS 服务器分配」→「编辑」→ 选「手动」→ 首选 DNS 填 192.168.10.10 → 保存。
改完在客户端执行 nslookup git.corp.local,返回 192.168.10.21 就成功了。
注意:以后每次增删域名,都要改区域文件并把
SOA里的序列号(示例中的2024011501)加 1,否则从服务器和缓存不会更新;改完执行sudo named-checkzone再sudo rndc reload。
小结
- 装
bind9+bind9-utils,配置分三处:named.conf.options(监听与转发)、named.conf.local(区域声明)、区域文件(解析记录)。 - 反向区域名要把网段倒写,如
10.168.192.in-addr.arpa。 - 改配置后必做:
named-checkconf/named-checkzone检查,再systemctl restart bind9。 forwarders指向公共 DNS,客户端只配内网 DNS 一台即可。- 每次改记录都要递增 SOA 序列号,否则不生效。
- 规模小于 50 台机器时,用
dnsmasq单文件配置会更省事,但 BIND 功能更全、更适合长期维护。
原文链接:https://www.gj0.com/thread-1235.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。