介绍 DNS 在网络请求中扮演的角色及其搭建

当我们以域名请求某服务的时候

当我们从浏览器里敲入百度网址 www.baidu.com 并按下回车键(Enter/Return 键),浏览器在与百度的服务器建立连接之前,首先需要把 www.baidu.com 转换成为 IP,然后根据这个 IP 与百度的服务器建立连接,继而完成接下来的数据传输。

具体步骤

把整个过程简化后,如下图所示:

  1. 手机(或电脑)首先请求 DNS 服务器获取百度的 IP;
  2. DNS 服务器从 www.baidu.com 对应的表里按照一定的算法返回某个 IP(假设为 220.181.57.142);
  3. 手机或电脑拿到 220.181.57.142 后就发起与 baidu-server-2 的连接,形成一个 61.147.108.199 <=> 220.181.57.142 的连接;
  4. 连接建立起来后,此时才进行请求数据和响应数据的传输。

DNS 服务器

在上图中可以看到 DNS server做的主要事情就是简单地把 www.baidu.com 转换成为对应的 IP。那么这个 IP 是如何来的呢?

当我们在某个云平台(比如 jingwei.link 这个域名是在阿里云买的)购买了一个域名后,我们就可以给这个域名添加相应的解析。把我们服务器的 IP 绑定到这个域名下面后,信息同步到相应的 DNS 服务器上,我们就可以通过域名找到我们的服务器 IP 继而访问我们的服务了。

在 Ubuntu 上搭建 DNS 服务器

大多数情况下,我们的手机(或电脑)都会自动连接公共的 DNS 服务器,并使用这些公共的 DNS 服务器完成所有域名到 IP 的映射查询。不过,如果我们希望在某个区域(比如在公司或者大家庭里)搭建由特定人群访问的服务,这个时候就可以搭建自己的 DNS 服务器,从而自由地配置 DNS 服务器添加个性化解析的记录。

本文主要描述在 Ubuntu 的服务器上搭建一个 DNS 服务器的步骤(因为我给团队里拥有的几台服务器安装的都是这个系统),有的团队喜欢使用其他发行版本,比如 centOS 等,对于这些系统的配置可以根据本文的内容进一步探索。

安装 DNS server(bind9)

BIND 9 是一个开源的 DNS 服务器,在 Ubuntu-Server 版本里其实是包含这个服务的,可以在安装系统时选择性地安装它,也可以通过下面的命令后期安装:

# 更新软件源的数据
sudo apt-get update

# 安装 bind9 
sudo apt-get install bind9

配置 /etc/bind/named.conf.options 文件

named.conf.options 文件中包含一些基本的配置,比如定义 解析 文件的位置(directory)、DNS 上游服务器(forwarders)、以及一些安全性格的参数配置等。

// cat /etc/bind/named.conf.options
options {
        // 这个目录决定了我们域名解析数据配置的目录,记住这个目录,后面会用到
        directory "/var/cache/bind";
        // 配置 bind9 上游的 DNS 服务器
        // 如果 bind9 中找不到某个域名的解析,会把域名解析请求发送到上游 DNS 服务器
        // 192.168.8.1 这个是我家里的路由器的 IP,这个路由器提供了 DNS 服务能力
        forwarders {
                192.168.8.1;
        };
        allow-query {
                0.0.0.0/0;
        };
        // 因为 192.168.8.1 是本地路由器,安全性不是很高
        // 需要关闭下面这几个安全相关参数才可以使用
        dnssec-enable no;
        dnssec-validation no;
        dnssec-lookaside auto;

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

配置 /etc/bind/named.conf.local 文件

可以在 named.conf.local 文件中添加自定义的域名信息(zone)以及相应的解析文件(file)。

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

// 这里定义在 bind9 中添加 www.jingwei.link 解析
zone "www.jingwei.link"{
        type master;
        // 这里定义了在哪个文件中配置了 IP 信息
        file "jingwei.link";
};

/etc/bind/named.conf.options 中的 directory 和 ② /etc/bind/named.conf.local 中的 file 共同指定了 www.jingwei.link 的域名解析记录包含在 /var/cache/bind/jingwei.link 文件。

$TTL	604800
@	IN	SOA	localhost. root.localhost. (
			      2		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
; 假设在 192.168.8.12 中搭建了某个服务,并希望以 www.jingwei.link 暴露出去
@	IN	NS	localhost.
@	IN	A	192.168.8.12

重启 bind9

# 重新载入配置
sudo systemctl daemon-reload
# 重启 bind9
sudo systemctl restart bind9.service

小结

本文首先简单介绍了 DNS 服务器在网络请求中扮演的角色,接着介绍了在 Ubuntu 中安装并配置 DNS 服务器(bind9)的大体步骤。

参考