特别企划

网路名称伺服器


使用Linux建立DNS Server


为 了 因 应 大 型 网 路 上 主 机 名 称 与 网 路 位 址 对 映 的 需 求 , 就 有 所 谓 建 立 「 名 称 伺 服 器 」 来 负 责 以 「 主 机 名 称 」 查 询 「 网 路 位 址 」 的 工 作 , 依 据 建 立 的 架 构 方 式 大 致 分 两 种 --DNS 及 NIS 。 本 文 的 焦 点 是 摆 在 「 建 立 DNS 名 称 伺 服 器 」 上 。


王国泰

    “ TCP/IP” 的 网 路 世 界 里 , 每 部 电 脑 的 身 分 都 是 由 4 个 数 字 所 组 成 的 “ IP Address” 来 辨 识 ( 例 如 168.95.192.1 ) , 这 些 数 字 号 码 就 像 是 我 们 的 身 分 证 号 码 一 样 , 某 些 部 份 数 字 分 别 代 表 不 同 的 意 义 。 当 我 们 在 使 用 网 际 网 路 资 源 时 , 如 果 直 接 使 用 “ IP Address” 来 进 行 连 线 , 那 是 最 直 接 不 过 了 ! 但 是 , 全 部 数 字 化 的 位 址 在 使 用 上 真 的 有 些 不 够 友 善 , 光 是 记 一 堆 数 字 就 够 头 疼 的 了 !

网 路 位 址 vs. 主 机 名 称

   还 好 , 提 供 “ TCP/IP” 网 路 服 务 的 作 业 系 统 都 提 供 系 统 管 理 者 可 以 建 立 一 个 名 叫 “ HOSTS” 的 档 案 ( 例 如 Linux/UNIX中 的 /etc/hosts) , 在 这 个 系 统 档 案 档 案 里 , 系 统 管 理 者 可 以 将 已 知 的 网 路 机 器 分 别 赋 予 一 个 「 主 机 名 称 」 并 且 相 对 映 该 机 器 的 “ IP Address” 。 如 此 一 来 , 在 进 行 网 路 连 线 时 , 使 用 者 就 不 必 一 定 要 直 接 指 定 “ IP Address” 来 连 线 , 因 为 系 统 可 以 提 供 应 用 程 式 透 过 “ HOSTS” 中 所 提 供 的 「 主 机 名 称 与 位 址 对 照 资 料 」 取 得 该 「 主 机 名 称 」 的 「 网 路 位 址 」 。

   这 样 子 , 使 用 网 路 程 式 时 是 方 便 多 了 , 但 是 , 国 际 网 路 的 机 器 成 千 上 万 , 如 果 只 是 利 用 “ HOSTS” 的 方 式 来 处 理 「 主 机 名 称 」 与 「 网 路 位 址 」 的 对 映 工 作 , 那 实 在 是 件 很 没 效 率 又 几 乎 不 可 能 的 事 。 所 以 , 如 果 网 路 使 用 的 领 域 只 是 单 纯 的 内 部 网 路 , 因 为 机 器 数 目 不 多 的 情 形 , 那 麽 使 用 “ HOSTS” 就 可 以 应 付 网 路 连 线 上 的 需 求 了 。

   为 了 因 应 大 型 网 路 上 「 主 机 名 称 」 与 「 网 路 位 址 」 对 映 的 需 求 , 就 有 所 谓 建 立 「 名 称 伺 服 器 」 来 负 责 以 「 主 机 名 称 」 查 询 「 网 路 位 址 」 的 工 作 , 依 据 建 立 的 架 构 方 式 大 致 有 两 种 , “ Domain Name System” ( 简 称 : DNS) 、 “ NFS Network Information Service” ( 简 称 : NIS) 。 我 们 都 可 以 在 Linux系 统 中 架 设 这 两 种 服 务 程 式 。

   “ NIS” 较 早 是 由 Sun所 提 出 的 解 决 方 案 , 运 用 “ RPC” 的 功 能 来 提 供 解 决 「 主 机 名 称 与 位 址 」 的 查 询 , “ NIS” 的 伺 服 程 式 大 都 是 以 “ yp” 起 头 的 程 式 档 案 ( ypbind、 ypinit....) 。 笔 者 并 不 准 备 在 这 里 说 明 “ NIS” 伺 服 器 的 建 立 方 式 。 而 是 将 焦 点 摆 在 「 建 立 DNS名 称 伺 服 器 」 的 话 题 上 。

DNS服 务 型 态 的 种 类

   时 下 在 国 际 网 路 上 所 存 在 的 「 名 称 伺 服 器 」 一 般 都 是 属 於 DNS伺 服 器 , 因 此 笔 者 才 会 将 焦 点 放 在 “ DNS” 的 建 立 上 。 由 於 “ DNS” 已 经 有 个 相 当 标 准 的 规 定 , 因 此 虽 然 不 同 平 台 上 作 业 系 统 可 能 有 相 当 的 差 异 , 但 是 建 立 “ DNS Server” 的 方 式 可 能 都 非 常 类 似 。 而 对 於 使 用 “ DNS” 的 方 式 也 是 大 同 小 异 。 关 於 使 用 或 架 设 “ DNS” 的 部 份 , 可 以 大 致 归 为 下 面 几 类 :

● 使 用 远 端 名 称 伺 服 器 :
   如 果 自 己 主 机 上 并 没 有 架 设 “ DNS” , 可 以 设 定 一 台 已 知 的 「 名 称 伺 服 器 」 作 为 本 主 机 网 路 连 线 时 的 名 称 资 讯 的 提 供 者 。 在 Linux 系 统 中 , 我 们 可 以 藉 由 “ /etc/resolv.conf” 这 个 系 统 参 数 档 案 来 指 定 本 主 机 的 「 远 端 名 称 伺 服 器 」 。 例 如 :
simon:~# cat /etc/resolv.conf
#
#电 信 局 HINET的 名 称 伺 服 器 为 168.95.192.1
#下 面 就 设 定 该 主 机 为 本 主 机 的 「 名 称 伺 服 器 」
#
#
nameserver 168.95.192.1
#
#

一 般 使 用 者 环 境 大 都 是 属 於 这 一 类 的 使 用 型 态 。

● 所 谓 “ Cache-Only ” 的 名 称 伺 服 器 :
   一 个 「 名 称 伺 服 器 」 也 不 可 能 拥 有 国 际 网 路 上 所 有 的 主 机 资 讯 , 因 此 它 提 供 一 个 转 送 方 式 , 将 自 己 「 名 称 伺 服 器 」 无 法 处 理 的 「 查 询 要 求 」 转 送 至 上 一 层 的 「 名 称 伺 服 器 」 查 询 , 然 後 将 所 得 到 的 查 询 结 果 , 传 送 给 提 出 查 询 要 求 的 主 机 。

   而 “ Cache-Only” 的 “ DNS” 就 是 该 伺 服 器 的 主 机 资 讯 里 除 了 自 己 之 外 就 没 有 了 , 它 将 所 有 的 查 询 要 求 都 转 送 至 其 他 伺 服 器 去 查 询 。

● “ Primary” 名 称 伺 服 器 :
   一 个 完 整 功 能 的 「 名 称 伺 服 器 」 , 管 理 一 个 或 数 个 “ Domain” 的 机 器 资 讯 。 而 这 些 主 机 相 关 的 资 料 都 依 照 格 式 储 存 於 伺 服 器 的 档 案 目 录 中 , 然 後 会 在 伺 服 器 启 动 时 将 这 些 资 料 读 入 系 统 。

● “ Secondary” 名 称 伺 服 器 :
   基 本 上 它 也 是 一 个 完 整 功 能 的 「 名 称 伺 服 器 」 , 只 是 所 不 同 的 是 , 它 的 主 机 资 料 并 非 完 全 储 存 於 伺 服 器 所 在 的 档 案 目 录 , 而 由 某 个 “ Primary DNS” 来 提 供 。

在 本 次 的 主 题 里 , 我 们 会 就 以 建 立 “ Cache-Only” 以 及 “ Primary” 的 名 称 伺 服 器 做 个 范 例 说 明 。

使 用 BIND-4.9.6建 立 DNS Server

   在 Linux系 统 里 , 我 们 使 用 “ BIND” ( Berkeley Internet Name Domain Name Server) 来 建 立 我 们 的 「 名 称 伺 服 器 」 。

   BIND” 这 个 软 体 每 个 Linux安 装 套 件 都 会 有 , 所 以 你 只 要 确 定 在 安 装 时 把 “ BIND” 软 体 安 装 至 Linux系 统 中 , 那 麽 就 已 经 具 备 建 立 “ DNS Server” 的 软 体 环 境 了 。 不 过 在 架 设 “ DNS” 之 前 , 笔 者 建 议 读 者 最 好 能 够 对 於 网 路 主 机 名 称 的 命 名 原 则 先 有 些 概 念 ( 不 妨 参 考 前 几 期 HOPE_NET月 刊 上 的 网 路 专 题 、 或 是 坊 间 网 路 相 关 的 书 籍 , 我 就 不 在 此 详 述 ) 。 接 下 来 我 们 以 一 个 假 设 环 境 来 配 合 说 明 架 设 「 DNS名 称 伺 服 器 」 的 步 骤 。 假 设 环 境 的 一 些 情 形 如 下 :

领 域 名 称 ( Domain) : simon.net
伺 服 器 主 机 名 称 ( Host) : simon
伺 服 器 网 路 位 址 ( IP) : 192.9.100.1
根 名 称 伺 服 器 ( Root DNS) : hinet.net ( 168.95.192.1)

● 建 立 “ /etc/named.boot” 启 动 设 定 档
   “ BIND” 伺 服 程 式 在 启 动 时 首 先 会 读 取 “ /etc/named.boot” 这 个 控 制 档 , 因 此 首 先 就 来 进 行 “ named.boot” 的 设 定 工 作 。

(A)“ directory” 是 用 来 指 定 「 主 机 相 关 资 讯 」 资 料 档 案 的 所 在 目 录 。

(B)“ named.boot” 一 般 常 用 到 的 资 料 格 式 为 「 格 式 、 领 域 、 来 源 主 机 或 档 案 、 备 份 档 案 名 称 」 , 除 了 设 定 “ Secondary DNS” 时 较 会 用 到 备 份 档 案 这 个 栏 位 外 , 其 馀 大 都 只 用 到 前 叁 个 栏 位 。 关 於 档 案 名 称 部 份 并 没 有 限 制 , 除 了 “ named.boot” 不 可 变 更 之 外 , 其 他 的 主 机 资 料 档 案 可 以 自 行 指 定 名 称 。 (图一)

(C)“ cache” 表 示 在 < root.cache> 这 个 档 案 设 定 着 本 伺 服 器 的 上 层 网 路 名 称 伺 服 器 。
   “ primary” 则 分 别 设 定 每 个 指 定 「 领 域 」 的 主 机 的 资 料 档 案 。

(D)在 「 领 域 」 这 个 栏 位 中 「 .」 代 表 “ OTHER” , 在 本 例 子 中 , 如 果 查 询 的 主 机 所 在 领 域 并 未 特 别 定 义 时 , 则 使 用 「 cache」 的 设 定 转 至 上 层 名 称 伺 服 器 查 询 。 而 对 於 我 们 自 己 管 理 的 「 领 域 」 则 可 以 使 用 “ primary” 、 “ secondary” 来 定 义 各 别 「 领 域 」 主 机 资 料 纪 录 所 在 。

   < simon.net> 是 一 般 主 机 名 称 的 形 式 , 有 些 时 候 使 用 者 会 以 “ IP Address” 来 查 询 主 机 资 讯 , 对 此 需 求 , 也 可 以 参 照 < 100.9.192.INADDR.ARPA> 的 格 式 来 定 义 < 192.9.100.x> 的 主 机 资 讯 。

● 建 立 “ /etc/named.hosts” 主 机 资 料 (图二)

   在 本 例 中 “ named.hosts” 被 指 定 为 储 存 < simon.net> 这 个 网 路 上 主 机 资 料 , 因 此 我 们 就 必 须 将 本 网 路 上 的 主 机 资 料 全 部 建 立 在 这 个 资 料 档 案 中 。

(A)“ SOA” 这 个 栏 位 在 每 个 「 领 域 」 资 料 档 中 只 能 有 一 个 。
(B)指 定 < postmaster@simon.simon.net > 是 本 名 称 伺 服 器 的 联 络 人 邮 件 信 箱 。
(C)< simon IN A 192.9.100.1> 表 示 “ simon.simon.net” 这 台 主 机 的 「 位 址 」 是 < 192.9.100.1> , 接 下 来 的 另 一 行 并 未 指 定 哪 台 主 机 名 称 则 表 示 该 设 定 仍 是 针 对 < simon> 这 台 主 机 。 由 於 可 设 定 的 资 料 项 目 不 少 , 我 们 在 此 挑 选 常 见 的 项 目 在 此 简 要 说 明 。

< A> --指 定 网 路 位 址

< CNAME> --设 定 主 机 的 别 名 , 例 如 < simon.simon.net> 的 别 名 是 <gopher.simon.net>

< HINFO> --可 以 使 用 一 段 文 字 描 述 主 机 环 境 。

< MX> --用 来 设 定 E-Mail传 递 交 换 的 优 先 路 径 , 例 如 范 例 中 的 < simon5> 的 设 定 , < simon5.simon.net> 的 信 件 都 先 往 < simon5.simon.net > 这 台 主 机 传 送 , 如 果 无 法 与 该 主 机 连 线 时 那 就 会 往 < simon.simon.net> 传 送 。

< NS> --用 来 指 定 子 网 路 的 名 称 伺 服 器 所 在 。

< PTR> --与 < A> 有 点 相 对 的 功 能 , 它 可 以 指 定 某 个 “ IP” 是 指 向 某 个 主 机 名 称 , 这 样 就 可 以 以 “ IP” 来 查 询 主 机 的 其 他 资 讯 。

● 建 立 “ /etc/named.rev”
   前 面 “ named.hosts” 是 当 网 路 的 使 用 者 以 “ xxx.simon.net” 的 方 式 查 询 主 机 资 讯 时 所 参 考 的 资 料 档 , 而 这 个 “ named.rev” 功 能 则 是 提 供 使 用 者 以 「 192.9.100.x」 查 询 主 机 资 讯 时 参 考 。 请 参 考 范 例 内 容 (图叁图四) 来 设 定 。

;--------------------------
;/etc/root.cache
;--------------------------
. 99999999 IN NS HINET.NET
. HINET.NET 99999999 A 168.95.192.1
;------------------------- End of File

● 建 立 “ /etc/root.cache” 启 动 设 定 档
   完 成 前 面 本 地 网 路 的 主 机 资 料 的 建 立 工 作 後 , 再 来 就 是 设 定 本 伺 服 器 的 「 根 伺 服 器 」 ( Root Name Server) 。 下 列 应 该 是 最 简 单 的 设 定 内 容 了 , 读 者 不 妨 参 照 此 设 定 。

● 启 动 “ BIND” 伺 服 程 式
   完 成 这 些 主 机 资 讯 的 建 立 工 作 後 , 最 重 要 的 工 作 就 是 启 动 “ BIND” 的 伺 服 程 式 < Named> , 你 可 以 直 接 以 系 统 使 用 者 的 身 分 执 行 此 程 式 , 在 执 行 後 , 建 议 您 最 好 执 行 < Ps> 指 令 检 查 一 下 < Named> 是 否 成 功 执 行 。 如 果 执 行 < Ps> 有 见 到 < Named> 那 表 示 主 要 的 控 制 档 内 容 无 误 。

   然 後 , 你 最 好 将 启 动 「 名 称 伺 服 程 式 」 的 工 作 加 入 Linux系 统 启 动 程 序 中 。 以 “ Slackware Linux” 为 例 , 请 修 改 “ /etc/rc.d/rc.inet2” 这 个 档 案 中 关 於 < Named> 的 设 定 , 如 下 的 内 容 。

#/etc/rc.d/rc.inet2
. . . . . # Start the NAMED/BIND name server.
if [ -f ${NET}/named ]; then
echo -n “ named”
${NET}/named
fi
. . . . . .
. . . . . . .

   这 样 子 , 在 下 次 启 动 系 统 时 就 会 自 动 执 行 “ BIND” 伺 服 程 式 , 而 您 的 Linux也 就 具 有 “ DNS Server” 的 功 能 了 。

测 试 查 询 「 名 称 伺 服 器 」 的 运 作

   为 了 确 定 「 名 称 伺 服 器 」 的 运 作 正 常 , 因 此 在 此 提 供 一 些 测 试 的 方 式 供 做 参 考 。

●使 用 < Ping >
   直 接 使 用 < Ping主 机 名 称 > 的 方 式 来 测 试 是 否 可 以 成 功 , 这 是 最 简 单 的 方 式 , 而 在 测 试 过 程 除 了 与 自 己 网 路 上 主 机 连 线 之 外 , 最 好 也 要 对 外 连 线 , 以 便 测 试 < Cache> 的 设 定 是 否 正 确 。 使 用 < FTP> < Telnet> 等 网 路 程 式 进 行 连 线 也 可 以 达 到 同 样 的 目 的 。 (图五)

● 使 用 < Nslookup>(图六图七)
   使 用 < Ping> 可 能 只 参 考 到 主 机 的 “ IP” 位 址 而 已 , 而 如 要 查 询 主 机 资 讯 , 那 就 得 透 过 < Nslookup> 这 个 程 式 来 进 行 。 < Nsl -ookup> 会 与 系 统 指 定 的 「 名 称 伺 服 器 」 连 线 并 根 据 使 用 者 提 出 的 查 询 条 件 由 「 名 称 伺 服 器 」 取 得 查 询 结 果 。 以 下 是 一 些 使 用 例 子 。

重 新 读 取 「 主 机 资 料 」

   因 为 伺 服 程 式 是 在 启 动 时 就 将 读 取 「 主 机 资 料 」 , 因 此 即 使 你 在 执 行 阶 段 更 改 了 主 机 资 料 的 内 容 , 仍 然 不 会 生 效 。 必 须 重 新 启 动 < Named> 才 会 使 你 更 新 过 的 资 料 生 效 。 如 果 遇 上 此 情 形 , 你 可 以 用 下 列 之 一 种 来 处 理 :

< kill -9 named的 PID> 先 杀 伺 服 程 式 , 再 重 新 执 行 乙 次 。
< kill -HUP named的 PID> 让 伺 服 程 式 进 行 重 置 的 行 为 。
执 行 〈 named.restart〉 让 重 新 伺 服 程 式 执 行 。

结 语

   在 95’ 年 11月 号 “ Linux Journal” 有 篇 「 Linux实 际 应 用 案 例 」 , 提 到 “ IKEA” ( 一 个 具 有 相 当 规 模 的 家 具 连 锁 店 , 世 界 各 地 有 数 百 家 连 锁 ) 正 使 用 数 套 Linux系 统 建 立 起 「 名 称 伺 服 器 」 , 负 责 与 世 界 各 地 的 主 机 、 工 作 站 的 主 机 名 称 与 网 路 位 址 的 对 映 工 作 , 目 前 已 经 纳 入 管 理 的 已 经 超 过 700台 以 上 的 机 器 , 而 且 尚 未 出 过 什 麽 差 错 。 因 此 , 使 用 Linux来 作 为 “ DNS Server” 应 该 是 相 当 符 合 经 济 效 益 的 选 择 。