如何在 Ubuntu 16.04 服务器上配置内网 DNS 服务

DNS

1. 简介

  本文使用 BIND9,用尽量少的步骤,搭建出一个可用的内网 DNS 服务。另外要说明的一点是,本文不仅适用于 Ubuntu 16.04,也使用其后的 Ubuntu 系统(截止到目前位置,最新的 Ubuntu server 版本是 18.04,之后的版本无法保证)。

2. 配置极简内网 DNS 服务

2.1 安装 BIND9

  先更新 APT,之后再安装 BIND9 相关的软件包:

$ sudo apt update
$ sudo apt install bind9 bind9utils bind9-doc

2.2 配置 BIND9 的 IPv4 模式

  这步是要将 BIND9 设置为只支持 IPv4 地址,如果需要用到 IPv6 地址的话,可以跳过这步。
  我们需要修改 BIND9 的 systemd unit file:

$ sudo systemctl edit --full bind9

  当然我们也可以直接用文件编辑器修改文件:

$ sudo vim /etc/systemd/system/multi-user.target.wants/bind9.service

  文件内容如下,在 ExecStart 这行的最后加上 -4 就可以了。

...
[Service]
...
ExecStart=/usr/sbin/named -f $OPTIONS -4
...

  修改配置后,需要重启 BIND9,因为 systemd 的 unit file 也变了,所以需要重新载入:

$ sudo systemctl daemon-reload
$ sudo systemctl restart bind9

2.3 修改配置文件 named.conf.options

  该文件(/etc/bind/named.conf.options)需要修改三处:

  • acl 部分:acl 是控制哪些客户端可以连接到这个 DNS 上的,支持子网掩码方式,例子中我把 10.19.250.0/24 网段中的所有 IP 都设为了可访问。
  • recursion 字段:设置成 yes,表示允许递归 DNS 查询。
  • allow-recursion 字段:允许递归查询的客户端范围,这里设置成了之前在 acl 中声明的 trusted。
  • listen-on 字段:表示 DNS 服务监听在哪个地址上,填写本地 IP 即可。
  • allow-transfer 字段:设置成 none 表示不允许其他 DNS 服务器从本 DNS 服务器中查询。
  • forwarders 字段:原因是我们的内网 DNS 服务只提供了很有限的几条 DNS 记录,如果不做点什么的话,APT 源的地址都解析不了。BIND9 提供 DNS 查询的转发机制,当本地 DNS 查询不到,将查询转发到 forwarders 上,并把查询结果缓存到本地 DNS 上,这样问题就解决了。本文使用的是国内公网 DNS:114.114.114.114,大家可以根据自己的需求进行修改。
$ cat /etc/bind/named.conf.options
acl "trusted" {
        10.19.250.0/24;
};
...
options {
        recursion yes;
        allow-recursion { trusted; };
        listen-on { 10.19.250.56; };
        allow-transfer { none; };
        ...
        forwarders {
                114.114.114.114;
        };
        ...
}
...

2.4 修改配置文件 named.conf.local

  假设搭建的内网 DNS 要解析的域名为 example.com,那么 /etc/bind/named.conf.local 内容应改为:

$ cat /etc/bind/named.conf.local

zone "example.com" {
        type master;
        file "/etc/bind/zones/db.example.com";
};

2.5 修改 zone 文件

  zone 文件在 2.4 里已经出现过了,file "/etc/bind/zones/db.example.com";,需要在对应的目录下建立该文件。

$ cat /etc/bind/zones/db.example.com 
$TTL    604800
@   IN  SOA testing.example.com. admin.example.com. (
                  2     ; Serial
             604800     ; Refresh
              86400     ; Retry
            2419200     ; Expire
             604800 )   ; Negative Cache TTL
;

; A records
@       IN      NS      epc.example.com.
example.com.    IN      NS      epc.example.com.
epc.example.com.        IN    A    10.19.250.201
testing.example.com.    IN    A    10.19.250.201

  需要注意的几点是:

  • 不要漏掉域名后面的点,例如:testing.example.com.
  • 我们需要的 A 类型的记录,但是 NS 类型的记录也不要漏掉,不然会报错的。
named-checkconf[39493]: zone example.com/IN: has no NS records
named-checkconf[39493]: zone example.com/IN: not loaded due to errors.
named-checkconf[39493]: _default/example.com/IN: bad zone
  • SOA 类型的记录目前我还不能确定是不是必须,待验证过后再做更新,在这之前,大家还是也把这部分加上吧。

2.6 检查 DNS 配置

  bind9 自带了检查配置文件语法正确性的工具,这可以降低排查错误的难度,所以在进一步测试 DNS 功能之前,我们先来好好利用这些工具检查一下前几步配置是否正确吧。

  先来检查 named.conf.* 文件,如果运行该命令没有任何输出的话,就说明配置一切 OK,如果有的话,根据提示修改,如果遇到问题不知道怎么解决,欢迎留言。

$ sudo named-checkconf

  接下来用命令 named-checkzone 检查 zone 文件,命令格式如下:sudo named-checkzone <domain-name> <zone-file>,第一个参数 <domain-name> 是域名,参考 2.4 中配置的域名,第二参数 <zone-file> 是 zone 文件,参考 2.5 中配置的 zone 文件。

$ sudo named-checkzone example.com /etc/bind/zones/db.example.com
zone example.com/IN: loaded serial 2
OK

  如果输出结果如上,恭喜,配置正确,如果有问题的话,还是要根据提示具体问题具体分析。

2.7 验证

  经过这些配置,终于可以验证一下 DNS 是否能正常工作了,先重启 bind9。

$ sudo systemctl restart bind9.service

  接下来要用 nslookup 检查刚刚配置的域名能否正常解析,如果系统里没有这个命令,输入一下命令安装:

sudo apt install -y dnsutils

  输入以下命令,可以看到 testing.example.com 正确的解析成了 10.19.250.201。恭喜,你成功的配置了 DNS!

$ nslookup testing.example.com
Server:     10.19.250.56
Address:    10.19.250.56#53

Name:   testing.example.com
Address: 10.19.250.201

3. 参考资料

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 1. 概述 在网络环境中一般用户只需要在浏览器中输入url如www.sunny.com就可以到对应服务器获取相应的...
    ghbsunny阅读 2,890评论 0 7
  • DNS简介DNS解析关键概念BIND 一、DNS简介: (一)DNS服务 DNS:Domain Name Serv...
    哈喽别样阅读 1,798评论 0 2
  • DNS工作原理 DNS 查询的过程 DNS( Domain Name System)是“域名系统”的英文缩写,是一...
    ghbsunny阅读 8,906评论 0 0
  • 什么是DNS及功能: DNS(Domain name server),是将IP地址转换为域名地址。当在互联网访问外...
    魏镇坪阅读 7,638评论 0 8
  • 网上看到篇好文章,解决了我多年的困惑,国内太需要这种不仅“知其然”还要“知其所以然”的文章了。于是我无耻的...
    GaojinHsu阅读 395评论 0 1