组建局域网 01_搭建 DNS 服务器给设备专属域名

我的博客地址

https://mark24code.github.io/%E5%88%86%E4%BA%AB%E4%B8%8E%E5%88%9B%E9%80%A0/2021/11/23/%E7%BB%84%E5%BB%BA%E5%B1%80%E5%9F%9F%E7%BD%9101_%E6%90%AD%E5%BB%BADNS%E6%9C%8D%E5%8A%A1%E5%99%A8.html


背景:

在家庭局域网中,我们有若干个设备连接在同一台路由其中。路由器和下属设备形成了一个小型局域网。

我们可以在局域网中通过ip互相访问。这是一般情况。

目标

我希望可以给局域网中的设备专门的域名。

方法

完成这个目标其实有很多方法。

1. 路由器功能

比较新的路由器也许有更改hosts的功能。小米路由器之前是有的。现在没了。

我要重点介绍的就是第二个方法

2. Dnsmasq

Dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以用于为局域网电脑分配内网ip地址和提供路由。DNS和DHCP两个功能可以同时或分别单独实现。dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个 PXE 服务器。

更详尽的功能可以查看Dnsmasq的wiki。

Dnsmasq具体操作

1. 安装Dnsmasq

各大发行版都有自己的安装方式,以Ubuntu为例

sudo apt install dnsmasq

2. 配置dnsmasq

先备份原始的 dnsmasq.conf 养成好习惯

sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak

编辑/etc/dnsmasq.conf

sudo vim /etc/dnsmasq.conf

文件最下方新增

# /etc/dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq.conf
strict-order
listen-address=127.0.0.1
listen-address=192.168.31.223

dnsmasq.conf 默认有很多设置,我们分别解读下我们设置的。

第一行,resolv-file... 主要是指向另一个文件 我们这里指向的是自定义/etc/resolv.dnsmasq.conf,如果这里不指定会自动生成一个默认的 resolv 配置,会导致解析问题。

#文件 /etc/resolv.dnsmasq.conf

# google的CDN
nameserver 8.8.8.8
nameserver 8.8.4.4

# 运营商的114
nameserver 114.114.114.114

# 阿里的
nameserver 223.5.5.5

# 腾讯的
nameserver 119.29.29.29

这里主要配置了一些DNS服务器,记住一定要配置。否则不论是本机还是未来在局域网中被指向都无法解析域名。

第二行

strict-order 是指按照制定顺序解析DNS

第三行、第四行分别是监听本机、局域网中本地地址(作为局域网中服务器)。

3. 启动dnsmasq服务

这里使用systemd的方式

# 启动服务
sudo systemctl start dnsmasq  

# 查看服务状态
sudo systemctl status dnsmasq

以本机为例,输出如下

➜  ~ sudo systemctl status dnsmasq    
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
   Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2021-11-24 23:41:46 CST; 3s ago
  Process: 2075 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUCCESS)
  Process: 2076 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=0/SUCCESS)
  Process: 2085 ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf (code=exited, status=0/SUCCESS)
 Main PID: 2084 (dnsmasq)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/dnsmasq.service
           └─2084 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -r /run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,20326,8,2,e06d44b80b8f1d39a95c0b0d7c65d08458e880409bbc6834571

11月 24 23:41:46 mark-pi400 dnsmasq[2084]: compile time options: IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify dumpfile
11月 24 23:41:46 mark-pi400 dnsmasq[2084]: reading /etc/resolv.dnsmasq.conf
11月 24 23:41:46 mark-pi400 dnsmasq[2084]: using nameserver 8.8.8.8#53
11月 24 23:41:46 mark-pi400 dnsmasq[2084]: using nameserver 8.8.4.4#53
11月 24 23:41:46 mark-pi400 dnsmasq[2084]: using nameserver 114.114.114.114#53
11月 24 23:41:46 mark-pi400 dnsmasq[2084]: using nameserver 223.5.5.5#53
11月 24 23:41:46 mark-pi400 dnsmasq[2084]: using nameserver 119.29.29.29#53
11月 24 23:41:46 mark-pi400 dnsmasq[2084]: read /etc/hosts - 10 addresses
11月 24 23:41:46 mark-pi400 dnsmasq[2085]: Too few arguments.
11月 24 23:41:46 mark-pi400 systemd[1]: Started dnsmasq - A lightweight DHCP and caching DNS server.


systemd的展示非常友好,可以看到成功了解析了我们设置的 DNS server并且也解析了 /etc/hosts

我们可以在 hosts文件中定义一些局域网的静态IP和我们想要赋予的域名,这样子可以在局域网通过域名访问设备

让我们开始编辑hosts

sudo vim /etc/hosts

比如我把 29地址 命名为 my-linux-server.home

127.0.0.1	localhost
::1		localhost ip6-localhost ip6-loopback
ff02::1		ip6-allnodes
ff02::2		ip6-allrouters

# custom LAN dns
192.168.31.29 my-linux-server.home

然后我们重启下 dnsmasq 服务

# 重启服务
sudo systemctl restart dnsmasq 


# 如果我们希望每次开启也启动服务
sudo systemctl enable dnsmasq 

# 顺带提议下关闭
# 关闭开启启动服务
sudo systemctl disable dnsmasq 

# 关闭服务
sudo systemctl stop dnsmasq 

设置你的路由器

我们已经设置好一个DNS服务器

接下来,进入你的路由器管理界面,使用你的设置,把你路由器的DNS服务器指向刚才机器在局域网的静态IP。

也可以配置你的电脑的DNS指向这个地址。

一个建议是,保留原始的DNS主机地址比如我这里

192.168.1.1

192.168.31.223

第一个是我的原始路由器的DNS地址

第二个是我设置的地址,这样子可以作为补充。

Tip

  1. 如果你dnsmasq设置没有继承 路由器主机的 DNS服务,可以设置第二个DNS服务器为路由器主机

这样保证了原来的状态。

小结

假设我们前面设置DNS的机器是A。我们通过路由器设置了DNS服务器指向A。

我们可以通过修改A的hosts文件和重启dnsmasq服务,让整个局域网读取我们的配置,完成一个ip和域名的映射。这样我们可以在局域网内使用域名命名设备然后访问。

检验

我们可以ping下设备域名

ping my-linux-server.home

也可以安装

 sudo apt install dnsutils

之后使用

dig my-linux-server.home

来查看DNS解析情况

补充说明

  1. 缓存

A做好设置,局域网内部 B电脑 ping不到定义的主机怎么办? 可能是DNS缓存。 参考如下:

https://ubuntututorials.org/flush-dns-cache-ubuntu-20-04/

基本上等待一会就生效了。

  1. net-tools

包含 ifconfig 可以查看ip

  1. dnsutils

包含 dig 可以查看dns情况


有更好的方法,也可以告诉我~dns_ip_setting.png