{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2025-10-05 17:41:38","updateBy":"admin","updateTime":"2025-10-05 17:41:38","remark":null,"id":123,"articleTitle":"Linux基础：DNS服务","articleUrl":"service_dns","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/ee03af4419724d50a127c34d6a588554.png","articleFlag":"0","draftStatus":"1","reprintStatement":"0","articleSummary":"域名系统是互联网的“电话簿”，它将人类可读的域名（如 www.google.com）转换为机器可读的 IP 地址（如 142.251.42.206）。在 Linux 生态系统中，理解和管理 DNS 是系统管理员和开发者的核心技能之一。","articleContent":"域名系统是互联网的“电话簿”，它将人类可读的域名（如 `www.google.com`）转换为机器可读的 IP 地址（如 `142.251.42.206`）。在 Linux 生态系统中，理解和管理 DNS 是系统管理员和开发者的核心技能之一。本文将深入探讨 Linux 下的 DNS 解析机制、客户端配置以及如何搭建自己的 DNS 服务器。\n\n## 一、DNS 解析基础与 Linux 客户端配置\n\n在深入了解服务器之前，我们必须先明白 Linux 主机如何作为一个客户端来解析域名。\n\n### **1.1 解析器**\n\nLinux 系统中的 DNS 客户端功能由一个名为 **解析器** 的库提供。解析器的配置决定了系统向哪些服务器查询、以什么顺序查询以及如何处理结果。\n\n### **1.2 核心配置文件：`/etc/resolv.conf`**\n\n这是最传统、最基础的 DNS 客户端配置文件。它定义了系统使用的 DNS 服务器和搜索域。\n\n* **语法示例：**\n\n  ```bash\n  # /etc/resolv.conf\n  nameserver 8.8.8.8       # 主 DNS 服务器（Google DNS）\n  nameserver 1.1.1.1       # 备 DNS 服务器（Cloudflare DNS）\n  search example.com local # 搜索域列表\n  ```\n\n  *   `nameserver`：指定 DNS 服务器的 IP 地址。最多可以配置三个，系统会按顺序查询。\n  *   `search`：当查询一个不完整的主机名（如 `web-server`）时，系统会自动尝试将其与搜索域组合（如 `web-server.example.com`、`web-server.local`）。\n\n**重要提示**：在现代 Linux 发行版（使用 systemd-resolved 或 NetworkManager）中，`/etc/resolv.conf` 通常是一个由网络管理服务自动生成和管理的符号链接，手动编辑它可能会被覆盖。\n\n### **1.3 现代解析管理：`systemd-resolved`**\n\n`systemd-resolved` 是 systemd 项目的一部分，它提供了一个更强大的 DNS 解析管理方案。\n\n* **核心功能：**\n\n  *   **DNS 缓存**：缓存之前的查询结果，加速后续请求。\n  *   **链路特定 DNS**：为不同的网络接口（如以太网、Wi-Fi、VPN）配置不同的 DNS 服务器。\n  *   **DNSSEC 验证**：在客户端验证 DNS 记录的真实性，防止欺骗攻击。\n\n* **查看状态：**\n\n  ```bash\n  systemd-resolve --status\n  ```\n\n* **管理配置**：主要通过 `NetworkManager` 或 `netplan` 进行配置，也可以编辑 `/etc/systemd/resolved.conf`。\n\n* **新的解析接口**：它提供了一个位于 `/run/systemd/resolve/stub-resolv.conf` 的存根文件，供应用程序使用。\n\n### **1.4 主机名静态映射：`/etc/hosts`**\n\n在向 DNS 服务器发起查询之前，系统会首先检查 `/etc/hosts` 文件。这个文件用于本地的主机名到 IP 地址的静态映射。\n\n* **语法示例：**\n\n  ```bash\n  # /etc/hosts\n  127.0.0.1   localhost\n  ::1         localhost ip6-localhost ip6-loopback\n  192.168.1.10 myserver.local myserver\n  ```\n\n* **用途**：\n\n  *   为没有正式 DNS 记录的内部服务器提供名称解析。\n  *   屏蔽某些网站（通过将恶意域名指向 `127.0.0.1`）。\n  *   开发测试。\n\n### **1.5 名称服务交换配置：`/etc/nsswitch.conf`**\n\n这个文件控制系统在解析各种信息（包括主机名）时使用的源及其顺序。关键的一行是：\n\n```bash\n# /etc/nsswitch.conf\nhosts: files dns myhostname\n```\n\n*   `files`：首先查询 `/etc/hosts` 文件。\n*   `dns`：如果 `files` 未找到，则使用 DNS 系统（即 `/etc/resolv.conf` 中配置的服务器）。\n*   `myhostname`：最后，使用系统自己的主机名。\n\n## 二、DNS服务安装与配置\n\n在 CentOS 7 上搭建 DNS 服务，主要有 **BIND** 和 **dnsmasq** 两个选择。BIND 功能全面，适合构建权威DNS服务器或缓存服务器；dnsmasq 则更轻量，适合小型网络或本地DNS转发。下面我将分别介绍这两种方式的安装和配置。\n\n为了让你能快速了解这两种方式的主要区别，这里有一个简单的对比表格：\n\n| 特性             | BIND (Berkeley Internet Name Domain)       | dnsmasq                                        |\n| :--------------- | :----------------------------------------- | :--------------------------------------------- |\n| **主要特点**     | 功能全面、稳定，**权威DNS服务器**首选      | 轻量级，配置简单，**DNS转发和DHCP**            |\n| **适用场景**     | 大型网络、自建域名解析、主从DNS同步        | 小型网络、局域网、开发测试环境、本地缓存       |\n| **配置复杂度**   | 相对复杂，需管理多个配置文件               | 简单，主要配置一个文件，或直接使用`/etc/hosts` |\n| **性能**         | 高性能，适合高负载                         | 轻量快速，适合小规模负载                       |\n| **本文介绍方向** | 配置为**缓存转发服务器**和**主域名服务器** | 配置为**本地DNS转发和缓存**                    |\n\n### 2.1 BIND 的安装与配置\n\nBIND 是 Linux 下最经典的 DNS 服务器软件。\n\n#### 安装 BIND\n\n1. 使用 `yum` 命令安装 BIND 及其工具包：\n\n   ```bash\n   sudo yum install bind bind-utils -y\n   ```\n\n#### 主要配置文件说明\n\n安装完成后，你需要关注以下几个核心配置文件：\n\n| 配置文件路径               | 说明                                                       |\n| :------------------------- | :--------------------------------------------------------- |\n| `/etc/named.conf`          | **主配置文件**，用于设置全局参数和定义区域。               |\n| `/etc/named.rfc1912.zones` | 预定义了一些区域，**通常我们在这里添加自定义的域名区域**。 |\n| `/var/named/`              | **区域文件目录**，存放具体域名解析记录。                   |\n\n#### 快速配置：作为缓存转发服务器\n\n这种配置让您的DNS服务器主要帮您转发和缓存DNS请求。\n\n1. **修改主配置**：编辑 `/etc/named.conf`。\n\n   ```bash\n   sudo vi /etc/named.conf\n   ```\n\n   找到 `options` 块，修改以下几项，允许其他设备查询并设置转发器：\n\n   ```conf\n   options {\n       listen-on port 53 { any; };  # 改为 any，监听所有接口\n       listen-on-v6 port 53 { ::1; };\n       allow-query     { any; };    # 改为 any，允许所有客户端查询\n       recursion yes;               # 允许递归查询，缓存服务器必须开启\n       forwarders     { 8.8.8.8; 114.114.114.114; }; # 设置上游DNS服务器\n       // 其他配置保持默认\n   };\n   ```\n\n2. **启动并启用服务**：\n\n   ```bash\n   sudo systemctl start named\n   sudo systemctl enable named\n   ```\n\n3. **配置防火墙**：如果系统防火墙开启，需要放行 DNS 服务的 53 端口。\n\n   ```bash\n   sudo firewall-cmd --permanent --add-service=dns\n   sudo firewall-cmd --reload\n   ```\n\n现在，你的 BIND 服务器已经可以作为缓存转发服务器工作了。你可以将其他机器的 DNS 服务器指向这台机器的 IP 地址来测试。\n\n#### 进阶配置：作为主域名服务器\n\n这种配置让你可以为特定域名（如 `example.com`）提供权威解析。\n\n1. **定义区域**：在 `/etc/named.rfc1912.zones` 文件末尾添加你的域名区域配置。\n\n   ```bash\n   sudo vi /etc/named.rfc1912.zones\n   ```\n\n   添加正向区域定义：\n\n   ```conf\n   zone \"example.com\" IN {        # 将 \"example.com\" 替换为你的域名\n       type master;               # 类型为主服务器\n       file \"example.com.zone\";   # 指定区域文件名，一般放在 /var/named/ 下\n       allow-update { none; };\n   };\n   ```\n\n2. **创建区域文件**：在 `/var/named/` 目录下创建上面指定的区域文件。\n\n   ```bash\n   sudo vi /var/named/example.com.zone\n   ```\n\n   写入以下内容，请务必根据你的实际情况修改 IP 地址和域名：\n\n   ```zone\n   $TTL 1D  ; 默认缓存时间\n   @       IN SOA  ns1.example.com. admin.example.com. (\n                       2024100501 ; Serial序列号，修改后需增加此值\n                       1H         ; Refresh刷新时间\n                       15M        ; Retry重试时间\n                       1W         ; Expire过期时间\n                       3H )       ; Negative Cache TTL\n           NS      ns1.example.com. ; 域名服务器记录\n   ns1     A       192.168.1.100    ; 将 ns1.example.com 解析为服务器IP\n   www     A       192.168.1.200    ; 将 www.example.com 解析为 192.168.1.200\n   @       A       192.168.1.100    ; 将根域名 example.com 解析为 192.168.1.100\n   ```\n\n   **注意**：创建区域文件时，**权限和属组很重要**，建议从模板复制并保持权限：\n\n   ```bash\n   cd /var/named/\n   sudo cp -p named.localhost example.com.zone\n   sudo chown named:named example.com.zone\n   ```\n\n3. **检查配置并重启服务**：\n\n   ```bash\n   # 检查主配置文件语法\n   sudo named-checkconf\n   # 检查区域文件语法\n   sudo named-checkzone example.com /var/named/example.com.zone\n   # 重启服务使配置生效\n   sudo systemctl restart named\n   ```\n\n### 2.2 dnsmasq 的安装与配置\n\ndnsmasq 是一个轻量级的工具，它提供了 DNS 转发和 DHCP 服务，配置起来非常简单。\n\n#### 安装 dnsmasq\n\n```bash\nsudo yum install dnsmasq -y\n```\n\n\n#### 配置 dnsmasq\n\n1. **主要配置文件**：编辑 `/etc/dnsmasq.conf`。\n\n   ```bash\n   sudo vi /etc/dnsmasq.conf\n   ```\n\n   根据你的需求修改或添加以下配置行（记得取消注释）：\n\n   ```conf\n   # 指定上游DNS服务器配置文件\n   resolv-file=/etc/resolv.dnsmasq.conf\n   # 严格按顺序使用上游DNS\n   strict-order\n   # 设置dnsmasq监听的IP地址（服务器本机IP），局域网服务\n   listen-address=127.0.0.1,192.168.1.100\n   # 自定义本地域名解析记录文件（类似hosts）\n   addn-hosts=/etc/dnsmasq.hosts\n   # 也可以直接读取本机hosts文件，通常默认开启\n   #no-hosts  # 如果不想用本机hosts，取消注释此项\n   ```\n\n2. **配置上游DNS**：创建并编辑 `resolv-file` 指定的上游DNS配置文件。\n\n   ```bash\n   sudo vi /etc/resolv.dnsmasq.conf\n   ```\n\n   写入可靠的上游DNS服务器，例如：\n\n   ```conf\n   nameserver 114.114.114.114\n   nameserver 8.8.8.8\n   ```\n\n3. **添加本地域名解析**：你可以直接编辑系统的 `/etc/hosts` 文件，或者在 `addn-hosts` 指定的文件中添加记录。\n\n   ```bash\n   sudo vi /etc/hosts\n   ```\n\n   添加格式如：\n\n   ```conf\n   192.168.1.10  server01.local\n   192.168.1.20  www.mywebsite.local\n   ```\n\n   或者使用自定义文件，如 `/etc/dnsmasq.hosts`，格式相同。\n\n4. **启动并启用服务**：\n\n   ```bash\n   sudo systemctl start dnsmasq\n   sudo systemctl enable dnsmasq\n   ```\n\n### 2.3 测试你的 DNS 服务\n\n配置完成后，务必进行测试。\n\n1. **配置测试客户端**：在另一台机器上，将其 DNS 服务器指向你刚搭建的 DNS 服务器 IP 地址。可以临时修改 `/etc/resolv.conf`：\n\n   ```bash\n   echo \"nameserver 192.168.1.100\" | sudo tee /etc/resolv.conf  # 替换为你的DNS服务器IP\n   ```\n\n2. **使用工具测试**：\n\n   - **`nslookup`**：\n\n     ```bash\n     nslookup www.example.com  # 测试正向解析\n     ```\n\n   - **`dig`**（需要安装 `bind-utils`）：\n\n     ```bash\n     dig @192.168.1.100 www.example.com  # 指定向你的DNS服务器查询\n     ```\n\n   - **`ping`**：\n\n     ```bash\n     ping server01.local  # 如果配置了本地解析，应该能ping通\n     ```\n\n## 三、常用DNS相关命令\n\n### DNS 诊断和测试命令\n\n#### 1. 基本 DNS 查询命令\n\n```bash\n# 使用 nslookup 查询（交互式）\nnslookup www.google.com\nnslookup\n> server 8.8.8.8      # 指定 DNS 服务器\n> set type=MX         # 查询 MX 记录\n> google.com\n> exit\n\n# 使用 nslookup 查询（非交互式）\nnslookup www.google.com 8.8.8.8\nnslookup -type=MX google.com\n```\n\n#### 2. 使用 dig 命令（功能最强大）\n\n```bash\n# 基本查询\ndig www.google.com\ndig @8.8.8.8 www.google.com    # 指定 DNS 服务器\n\n# 查询特定记录类型\ndig google.com A        # A 记录（默认）\ndig google.com MX       # 邮件交换记录\ndig google.com NS       # 名称服务器记录\ndig google.com TXT      # 文本记录\ndig -x 8.8.8.8          # 反向 DNS 查询（PTR记录）\n\n# 精简输出\ndig +short www.google.com\ndig +noall +answer www.google.com\n\n# 跟踪 DNS 解析过程\ndig +trace www.google.com\n\n# 检查域名的所有记录\ndig google.com ANY\n```\n\n#### 3. 使用 host 命令（简单快捷）\n\n```bash\n# 基本查询\nhost www.google.com\nhost 8.8.8.8\n\n# 查询特定记录类型\nhost -t MX google.com\nhost -t NS google.com\nhost -t A www.google.com\n\n# 指定 DNS 服务器\nhost www.google.com 8.8.8.8\n```\n\n#### 4. 网络连通性测试\n\n```bash\n# 测试网络连通性（不依赖DNS）\nping 8.8.8.8\nping www.google.com     # 依赖DNS解析\n\n# 跟踪路由\ntraceroute www.google.com\nmtr www.google.com\n\n# 测试特定端口\ntelnet 8.8.8.8 53       # 测试DNS端口连通性\nnc -zv 8.8.8.8 53       # 使用netcat测试\n```\n\n### BIND 专用管理命令\n\n#### 1. 配置检查和验证\n\n```bash\n# 检查主配置文件语法\nnamed-checkconf\n\n# 检查区域文件语法\nnamed-checkzone example.com /var/named/example.com.zone\n\n# 检查所有区域文件\nnamed-checkconf -z\n```\n\n#### 2. rndc 管理工具\n\n```bash\n# 查看状态\nrndc status\n\n# 重新加载配置和区域\nrndc reload\nrndc reload example.com    # 重新加载特定区域\n\n# 清除缓存\nrndc flush\nrndc flushname www.google.com  # 清除特定域名缓存\n\n# 查看统计信息\nrndc stats\n\n# 停止服务\nrndc stop\n```\n\n#### 3. 查看 BIND 运行信息\n\n```bash\n# 查看BIND版本\nnamed -v\n\n# 测试配置文件\nnamed-checkconf /etc/named.conf\n\n# 查看区域传输状态\nrndc zonestatus example.com\n```\n\n### DNS 缓存管理命令\n\n#### 1. 清除系统 DNS 缓存\n\n```bash\n# 如果使用 nscd (Name Service Cache Daemon)\nsystemctl restart nscd\n\n# 如果使用 systemd-resolved (CentOS 7 默认没有，但可以安装)\nsystemctl restart systemd-resolved\n\n# 最直接的方式 - 重启网络服务\nsystemctl restart network\n\n# 或者重启 NetworkManager\nsystemctl restart NetworkManager\n```\n\n#### 2. 测试本地 DNS 服务器\n\n```bash\n# 测试本地 DNS 服务器是否响应\ndig @localhost www.google.com\nnslookup www.google.com localhost\n\n# 测试特定端口\ndig @127.0.0.1 -p 53 www.google.com\n\n# 检查 DNS 服务器监听状态\nnetstat -tulpn | grep :53\nss -tulpn | grep :53\n```","categoryId":1,"viewCount":97,"categoryName":"Linux","author":"球接子","authorAvatar":null,"tagIds":[10],"tagNames":["Linux基础"]}}