# 主机名与 DNS 设置

URL: https://caijiao.org/rockylinux/hostname-and-dns
Source: docs/rockylinux/hostname-and-dns.md
Description: 详细介绍 Rocky Linux 中主机名配置和 DNS 设置的方法，包括永久主机名设置、DNS 解析配置和网络名称服务管理

在 Rocky Linux 系统中，主机名和 DNS 设置是网络配置的重要组成部分。正确配置主机名和 DNS 对于系统间的通信、服务识别以及网络资源访问至关重要。本教程将详细介绍如何在 Rocky Linux 中设置和管理主机名，以及如何配置 DNS 解析服务。

## 主机名概述

主机名是分配给计算机的标签，用于在网络中识别该计算机。在 Rocky Linux 中，主机名分为三种类型：

1. **静态主机名（Static hostname）**：由系统管理员设置的永久主机名
2. ** transient 主机名（Transient hostname）**：由 DHCP 或 mDNS 等服务动态分配的主机名
3. **pretty 主机名（Pretty hostname）**：用户友好的主机名，可以包含特殊字符和空格

静态主机名是最常用的，它在系统重启后仍然保持不变。

## 查看当前主机名

在 Rocky Linux 中，可以使用以下命令查看当前的主机名设置：

### 使用 hostnamectl 命令

`hostnamectl` 是 systemd 系统中管理主机名的主要工具：

```bash
# 查看完整的主机名信息
hostnamectl

# 仅查看静态主机名
hostnamectl status --static

# 仅查看 transient 主机名
hostnamectl status --transient

# 仅查看 pretty 主机名
hostnamectl status --pretty
```

### 使用 hostname 命令

`hostname` 命令是一个传统的工具，可以显示或临时设置主机名：

```bash
# 显示当前主机名
hostname

# 显示 FQDN（完全限定域名）
hostname -f
```

### 查看 /etc/hostname 文件

静态主机名也存储在 `/etc/hostname` 文件中：

```bash
cat /etc/hostname
```

## 设置永久主机名

### 使用 hostnamectl 设置主机名

在 Rocky Linux 中，推荐使用 `hostnamectl` 命令来设置永久主机名：

```bash
# 设置静态主机名
sudo hostnamectl set-hostname server.example.com

# 设置 pretty 主机名
sudo hostnamectl set-hostname "My Rocky Linux Server" --pretty

# 清除 transient 主机名
sudo hostnamectl set-hostname --transient ""
```

`hostnamectl` 命令会自动更新 `/etc/hostname` 文件，并且可以立即生效，无需重启系统。

### 手动编辑 /etc/hostname 文件

也可以直接编辑 `/etc/hostname` 文件来设置静态主机名：

```bash
sudo vim /etc/hostname
```

将文件内容替换为新的主机名，例如：

```
server.example.com
```

保存文件后，应用更改：

```bash
sudo hostname -F /etc/hostname
```

## 配置 /etc/hosts 文件

`/etc/hosts` 文件用于本地 DNS 解析，它允许系统在不查询外部 DNS 服务器的情况下解析主机名到 IP 地址。

### 查看当前 hosts 文件

```bash
cat /etc/hosts
```

### 编辑 hosts 文件

```bash
sudo vim /etc/hosts
```

典型的 hosts 文件包含以下内容：

```
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1   server.example.com server
```

建议将系统的静态主机名添加到 127.0.0.1 行，以便本地服务可以正确解析主机名。

## DNS 配置

DNS（域名系统）负责将域名解析为 IP 地址，是互联网和局域网通信的基础。在 Rocky Linux 中，DNS 配置主要通过以下几种方式管理：

### 1. NetworkManager DNS 配置

使用 NetworkManager 管理的网络连接，可以通过 nmcli 或 nmtui 设置 DNS 服务器。

#### 使用 nmcli 配置 DNS

```bash
# 查看当前网络连接
nmcli connection show

# 设置 DNS 服务器（将 "ens33" 替换为你的网络接口）
sudo nmcli connection modify ens33 ipv4.dns "8.8.8.8 8.8.4.4"

# 设置 DNS 搜索域
sudo nmcli connection modify ens33 ipv4.dns-search "example.com"

# 应用更改
sudo nmcli connection up ens33
```

#### 使用 nmtui 配置 DNS

nmtui 提供了一个文本用户界面来配置网络设置：

```bash
# 启动 nmtui
sudo nmtui
```

按照界面提示，选择 "Edit a connection"，然后编辑你的网络连接，在 DNS 服务器字段中输入 DNS 服务器地址。

### 2. /etc/resolv.conf 文件

`/etc/resolv.conf` 是传统的 DNS 配置文件，但在使用 NetworkManager 的系统中，这个文件通常是由 NetworkManager 自动生成和管理的。

#### 查看 resolv.conf 文件

```bash
cat /etc/resolv.conf
```

#### 直接编辑 resolv.conf（不推荐）

在某些情况下，你可能需要直接编辑 `/etc/resolv.conf` 文件。但请注意，在使用 NetworkManager 的系统中，这些更改可能会在网络重启后丢失。

```bash
sudo vim /etc/resolv.conf
```

添加或修改以下行：

```
nameserver 8.8.8.8
nameserver 8.8.4.4
domain example.com
search example.com
```

### 3. 使 resolv.conf 持久化

要使 `/etc/resolv.conf` 的更改持久化，可以：

#### 禁用 NetworkManager 对 resolv.conf 的管理

```bash
# 编辑 NetworkManager 配置
sudo vim /etc/NetworkManager/NetworkManager.conf
```

在 [main] 部分添加：

```
dns=none
```

然后重启 NetworkManager：

```bash
sudo systemctl restart NetworkManager
```

#### 使用 resolvconf 工具

```bash
# 安装 resolvconf
sudo dnf install resolvconf -y

# 启用 resolvconf 服务
sudo systemctl enable --now resolvconf.service

# 编辑 resolv.conf.head 文件（会添加到生成的 resolv.conf 的开头）
sudo vim /etc/resolvconf/resolv.conf.d/head
```

添加你的 DNS 配置：

```
nameserver 8.8.8.8
nameserver 8.8.4.4
```

然后更新 resolv.conf：

```bash
sudo resolvconf -u
```

## DNS 解析测试

配置 DNS 后，可以使用以下命令测试 DNS 解析是否正常工作：

### 使用 dig 命令

```bash
# 安装 bind-utils 包以获取 dig 命令
sudo dnf install bind-utils -y

# 解析域名
dig www.google.com

# 使用特定的 DNS 服务器解析
dig @8.8.8.8 www.google.com

# 反向解析
dig -x 8.8.8.8
```

### 使用 nslookup 命令

```bash
# 解析域名
nslookup www.google.com

# 使用特定的 DNS 服务器解析
nslookup www.google.com 8.8.8.8
```

### 使用 host 命令

```bash
# 解析域名
host www.google.com

# 反向解析
host 8.8.8.8
```

## 配置自定义 DNS 服务

在某些情况下，你可能需要在 Rocky Linux 上设置自己的 DNS 服务器，例如 BIND（Berkeley Internet Name Domain）。

### 安装 BIND DNS 服务器

```bash
# 安装 BIND 服务器和工具
sudo dnf install bind bind-utils -y
```

### 配置 BIND 服务器

#### 编辑主配置文件

```bash
sudo vim /etc/named.conf
```

主要配置选项：

```
options {
    listen-on port 53 { 127.0.0.1; any; };
    directory   "/var/named";
    dump-file   "/var/named/data/cache_dump.db";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    secroots-file   "/var/named/data/named.secroots";
    recursing-file  "/var/named/data/named.recursing";
    allow-query     { localhost; any; };
    recursion yes;
};
```

#### 配置区域文件

1. 为正向解析创建区域文件：

```bash
sudo vim /var/named/example.com.zone
```

添加以下内容：

```
$TTL 86400
@   IN  SOA example.com. admin.example.com. (
            2023050101  ; Serial
            3600        ; Refresh
            1800        ; Retry
            604800      ; Expire
            86400       ; Minimum TTL
)

@       IN  NS      ns1.example.com.
ns1     IN  A       192.168.1.10
www     IN  A       192.168.1.100
mail    IN  A       192.168.1.101
```

2. 为反向解析创建区域文件：

```bash
sudo vim /var/named/192.168.1.rev
```

添加以下内容：

```
$TTL 86400
@   IN  SOA example.com. admin.example.com. (
            2023050101  ; Serial
            3600        ; Refresh
            1800        ; Retry
            604800      ; Expire
            86400       ; Minimum TTL
)

@       IN  NS      ns1.example.com.
10      IN  PTR     ns1.example.com.
100     IN  PTR     www.example.com.
101     IN  PTR     mail.example.com.
```

3. 设置正确的权限：

```bash
sudo chown named:named /var/named/example.com.zone /var/named/192.168.1.rev
sudo chmod 640 /var/named/example.com.zone /var/named/192.168.1.rev
```

4. 在 named.conf 中添加区域：

```bash
sudo vim /etc/named.conf
```

在文件末尾添加：

```
zones {
    example.com IN {
        type master;
        file "example.com.zone";
        allow-update { none; };
    };

    1.168.192.in-addr.arpa IN {
        type master;
        file "192.168.1.rev";
        allow-update { none; };
    };
};
```

### 检查 BIND 配置

```bash
# 检查 named.conf 语法
sudo named-checkconf

# 检查区域文件语法
sudo named-checkzone example.com /var/named/example.com.zone
sudo named-checkzone 1.168.192.in-addr.arpa /var/named/192.168.1.rev
```

### 启动 BIND 服务

```bash
# 启动 named 服务
sudo systemctl start named

# 设置 named 服务开机自启
sudo systemctl enable named

# 检查 named 服务状态
sudo systemctl status named
```

### 配置防火墙

```bash
# 允许 DNS 服务通过防火墙
sudo firewall-cmd --permanent --add-service=dns

# 重新加载防火墙规则
sudo firewall-cmd --reload
```

## 使用本地缓存 DNS（dnsmasq）

对于不需要完整 DNS 服务器功能的场景，可以使用 dnsmasq 提供轻量级的 DNS 缓存服务。

### 安装 dnsmasq

```bash
sudo dnf install dnsmasq -y
```

### 配置 dnsmasq

```bash
sudo vim /etc/dnsmasq.conf
```

主要配置选项：

```
# 监听所有网络接口
listen-address=0.0.0.0

# 不读取 /etc/resolv.conf
no-resolv

# 设置上游 DNS 服务器
server=8.8.8.8
server=8.8.4.4

# 缓存大小
cache-size=1000

# 本地域名解析
address=/example.local/192.168.1.10
```

### 启动 dnsmasq 服务

```bash
# 启动 dnsmasq 服务
sudo systemctl start dnsmasq

# 设置 dnsmasq 服务开机自启
sudo systemctl enable dnsmasq

# 检查 dnsmasq 服务状态
sudo systemctl status dnsmasq
```

### 配置防火墙

```bash
# 允许 DNS 服务通过防火墙
sudo firewall-cmd --permanent --add-service=dns

# 重新加载防火墙规则
sudo firewall-cmd --reload
```

## 常见问题与故障排除

### 主机名设置后不生效

如果设置主机名后不立即生效，可以尝试以下方法：

1. 重启网络服务：

   ```bash
   sudo systemctl restart NetworkManager
   ```

2. 手动设置临时主机名：

   ```bash
   sudo hostname server.example.com
   ```

3. 检查 `/etc/hostname` 文件权限：
   ```bash
   ls -l /etc/hostname
   sudo chmod 644 /etc/hostname
   ```

### DNS 解析失败

如果 DNS 解析不正常，可以按照以下步骤排查：

1. 检查 `/etc/resolv.conf` 文件内容：

   ```bash
   cat /etc/resolv.conf
   ```

2. 测试基本网络连接：

   ```bash
   ping 8.8.8.8
   ```

3. 使用不同的 DNS 服务器测试：

   ```bash
   dig @8.8.8.8 www.google.com
   ```

4. 检查防火墙设置：

   ```bash
   sudo firewall-cmd --list-all
   ```

5. 检查 NetworkManager 配置：
   ```bash
   nmcli connection show --active
   nmcli connection show <connection-name> | grep dns
   ```

### nslookup 与 ping 解析结果不一致

如果 nslookup 和 ping 显示不同的解析结果，可能是因为：

1. `/etc/hosts` 文件中的条目覆盖了 DNS 解析
2. NSS（Name Service Switch）配置问题

检查 `/etc/nsswitch.conf` 文件中的 hosts 行：

```bash
cat /etc/nsswitch.conf | grep hosts
```

正常的配置应该是：

```
hosts:      files dns myhostname
```

这表示系统会先查询 `/etc/hosts` 文件，然后查询 DNS，最后是 myhostname。

## 最佳实践

1. **使用有意义的主机名**：选择能够反映服务器角色或功能的主机名，便于管理和识别

2. **采用一致的命名约定**：在多服务器环境中，建立并遵循一致的主机名命名约定

3. **配置适当的 DNS 服务器**：使用可靠的 DNS 服务器，考虑使用主备 DNS 配置

4. **定期测试 DNS 解析**：定期测试 DNS 解析是否正常工作，确保网络服务的可用性

5. **使用 DNS 缓存**：在大型网络中，考虑使用 DNS 缓存服务提高解析效率

6. **监控 DNS 查询性能**：监控 DNS 查询响应时间，及时发现并解决 DNS 相关问题

7. **保持 DNS 记录更新**：当服务器 IP 地址变更时，及时更新 DNS 记录

## 总结

正确配置主机名和 DNS 是 Rocky Linux 系统网络管理的基础。本教程详细介绍了如何查看和设置主机名、配置 DNS 解析、测试 DNS 功能以及部署自定义 DNS 服务。

通过掌握这些知识和技能，您可以确保系统在网络环境中的正确识别和通信，为各种网络服务的正常运行提供保障。在实际应用中，应根据具体的网络环境和需求，选择合适的配置方法，并定期进行检查和维护。
