教程 rockylinux tutorial

主机名与 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
  1. 为反向解析创建区域文件:
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.
  1. 设置正确的权限:
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
  1. 在 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
  1. 手动设置临时主机名:
bash
   sudo hostname server.example.com
  1. 检查 /etc/hostname 文件权限:
bash
   ls -l /etc/hostname
   sudo chmod 644 /etc/hostname

DNS 解析失败

如果 DNS 解析不正常,可以按照以下步骤排查:

  1. 检查 /etc/resolv.conf 文件内容:
bash
   cat /etc/resolv.conf
  1. 测试基本网络连接:
bash
   ping 8.8.8.8
  1. 使用不同的 DNS 服务器测试:
bash
   dig @8.8.8.8 www.google.com
  1. 检查防火墙设置:
bash
   sudo firewall-cmd --list-all
  1. 检查 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 服务。

通过掌握这些知识和技能,您可以确保系统在网络环境中的正确识别和通信,为各种网络服务的正常运行提供保障。在实际应用中,应根据具体的网络环境和需求,选择合适的配置方法,并定期进行检查和维护。