Linux下DNS服务器搭建

内网里那台文件服务器,你还在敲 192.168.1.50 访问?给同事发个 fileserver.example.local 它不香吗。本文就带你在一台 Linux 上把 BIND9 搭起来,从零让全公司都能用域名访问内网资源。

内网域名是什么

一句话:只在内部网络生效的域名,公网 DNS 查不到它,由你自己架的 DNS 服务器负责解析。好处很直接------内部系统、打印机、文件服务器都用可读的名字访问,换 IP 不用挨台机器改配置,访问路径也收口在自己手里。

整体思路

搭一套能用的内网域名解析,本质是四步串起来的链路:

  1. 规划域名结构 ------ 定好顶级域和子域命名
  2. 架设 DNS 服务器 ------ 写区域文件,让域名能查到 IP
  3. 配置 DHCP ------ 让客户端自动拿到 DNS 服务器地址
  4. 客户端测试验证 ------ dig/nslookup 确认解析成功

下面逐步展开,重点放在第 2 步的 Linux BIND9 实操上。

第一步:规划内网域名结构

先决定用什么后缀。常见选择是 .local.lan 这类保留域,比如拿 example.local 当顶级域,下属资源按用途命名:

  • fileserver.example.local ------ 文件服务器
  • printer.example.local ------ 打印机
  • nas.example.local ------ NAS

💡要点:.local 严格来说被 mDNS(Avahi/Bonjour)占用,小型内网用没问题;如果环境里有 macOS 设备或跑着 Avahi,建议换 .lan.internal 避免解析打架。

第二步:安装并配置 DNS 服务器

Windows Server 走图形界面即可:在"添加角色和功能"里装 DNS 服务器角色,用 DNS 管理器创建正向查找区域(如 example.local),再逐条添加主机 A 记录。这里不展开。

Linux 阵营两个主流选择:BIND9 (功能全、最主流)和 dnsmasq(轻量、适合小网)。本文以 BIND9 为主线。

安装 BIND9

Ubuntu/Debian:

bash 复制代码
# 更新包索引
sudo apt update
# 安装 BIND9
sudo apt install bind9 bind9utils -y

⚠️坑:安装过程可能自动放行防火墙规则,但别指望它配得完美,后面务必手动检查 53 端口状态。

核心配置文件

主配置在 /etc/bind/named.conf.local(新版本习惯把自定义区域放这里,而不是直接改 named.conf)。加一个正向区域:

text 复制代码
zone "example.local" {
    type master;
    file "/etc/bind/db.example.local";
};

三个关键参数记住就行:

参数 作用 建议
directory 区域文件存储路径 默认 /etc/bind 即可
listen-on 监听哪些网卡 IP 只填内网 IP,别暴露到公网口
allow-query 谁能来查询 收紧到内网网段

然后是区域文件本身 /etc/bind/db.example.local,必填三类记录:

  • SOA 记录:声明主服务器和管理员邮箱
  • NS 记录:指定名称服务器
  • A 记录:域名 → IP 映射

最小可用示例:

text 复制代码
$TTL 604800
@       IN      SOA     ns1.example.local. admin.example.local. (
                        2025032101   ; 序列号,每次改完区域文件要 +1
                        3600         ; 从服务器刷新间隔
                        1800         ; 重试间隔
                        604800       ; 过期时间
                        600 )        ; 否定应答缓存 TTL
@       IN      NS      ns1.example.local.
ns1     IN      A       192.168.1.10
fileserver IN  A       192.168.1.50
printer IN      A       192.168.1.60

✅说明:末尾的点(ns1.example.local.)表示绝对域名,漏了点会被拼成 ns1.example.local.example.local.,这是新手最高频的报错来源。

反向解析(可选但推荐)

正向是"域名查 IP",反向是"IP 查域名",安全审计、日志排查时很好使。给 192.168.1.0/24 段配反解,先在 named.conf.local 加区域:

text 复制代码
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/db.192.168.1";
};

再创建 /etc/bind/db.192.168.1

text 复制代码
$TTL 604800
@       IN      SOA     ns1.example.local. admin.example.local. (
                        2025032102   ; 新序列号
                        3600
                        1800
                        604800
                        600 )
@       IN      NS      ns1.example.local.
10      IN      PTR     ns1.example.local.
50      IN      PTR     fileserver.example.local.
60      IN      PTR     printer.example.local.

数字前缀对应 IP 末段:10 就是 192.168.1.10

启动服务与测试

改完配置,按这个顺序验证,别直接重启了才发现语法错:

bash 复制代码
# 1. 检查主配置语法
sudo named-checkconf

# 2. 检查区域文件语法(无输出即正确)
sudo named-checkzone example.local /etc/bind/db.example.local

# 3. 重启服务加载新配置
sudo systemctl restart bind9

# 4. 本机测试解析
dig @127.0.0.1 fileserver.example.local
# 预期输出: status: NOERROR, ANSWER 段显示 192.168.1.50

# 或者用 nslookup
nslookup fileserver.example.local 127.0.0.1

💡要点:named-checkzone 输出里看到 OK 才算区域文件合格;如果报 could not load zone,九成是文件权限问题------确保 bind 用户可读。

第三步:配置 DHCP 下发 DNS

客户端不可能一台台手动填 DNS。如果内网用 DHCP 分 IP,在 DHCP 作用域选项里指定 DNS 服务器地址(Linux 常用 ISC DHCP 的话,是在 dhcpd.conf 的作用域段里加 option domain-name-servers 192.168.1.10;)。这样客户端拿到 IP 的同时自动获得 DNS 指向。

第四步:客户端配置与验证

没走 DHCP 的设备,手动在 IPv4 属性(或 Linux 的 /etc/resolv.conf / systemd-resolved)里把 DNS 指向上面这台服务器,然后:

bash 复制代码
ping fileserver.example.local        # 看是否解析出 192.168.1.50
nslookup printer.example.local       # 验证任意一条 A 记录

能解析出正确 IP、ping 有响应,这套内网 DNS 就算跑通了。

进阶优化与安全

  1. 限制访问范围 :区域里写 allow-query { 192.168.1.0/24; };,只让内网查询
  2. 启用 DNSSEC 校验options 中加 dnssec-validation auto;,防劫持
  3. 定期维护
    • 每日看日志 /var/log/syslog(Debian 系 BIND 日志通常进 syslog,而非独立的 /var/log/bind/,除非单独配置过 logging 通道)
    • 每次改区域文件记得递增序列号,否则从服务器不认你的新数据

常见问题解答

Q:客户端无法解析域名?

A:三步定位------① DNS 服务器上 dig @127.0.0.1 自己查得通吗?不通查区域文件;② 客户端 /etc/resolv.conf 是否指向这台 DNS;③ 中间防火墙是否拦了 UDP 53。

Q:防火墙拦截了 DNS 端口?

A:开放 53 端口(TCP + UDP 都要,区域传输走 TCP):

bash 复制代码
sudo ufw allow 53/tcp; sudo ufw allow 53/udp
# 或 firewalld:
sudo firewall-cmd --add-port=53/udp --permanent && sudo firewall-cmd --reload

Q:改了区域文件但解析还是旧结果?

A:十有八九忘了改序列号。BIND 靠 SOA 序列号判断区域是否更新,每次修改后把它 +1(惯例用日期式 YYYYMMDDnn),再重启服务。

参考链接

相关推荐
团子股股东峥哥1 小时前
day37-RHEL-管理基本存储
linux·运维·服务器
天远API1 小时前
零信任架构实战:基于天远全能消金报告构建自动化消费分期网关
运维·人工智能·架构·自动化
en.en..1 小时前
TCP/IP四层模型「数据包封装与拆包」| 网络传输
服务器·网络·php
君生我老1 小时前
Linux inode概念 &软硬连接
linux·服务器
Android系统攻城狮2 小时前
Linux Gstreamer深度解析之gst_audio_converter_reset调用流程与实战(二十一)
linux·运维·服务器·gstreamer音视频·音视频进阶
新时代牛马2 小时前
单机 docker run 管不住了?从编排需求、期望状态到调度/自愈闭环讲透
运维·docker·容器
youyou-06062 小时前
AUTOSAR‑COM 常见问题 QA (1)
java·linux·服务器·单片机·汽车
代码方舟2 小时前
零信任架构实战:基于天远全能消金报告构建自动化信用合规网关
运维·人工智能·架构·自动化
m0_743697592 小时前
grep 的引号、反斜杠与正则方言:一次讲清我踩过的坑
linux