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

Mark24 · 2021年11月25日 · 最后由 xinyifly 回复于 2021年11月25日 · 97 次阅读

我的博客地址

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 情况


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

使用 OpenWrt 默认的 DHCP 的话,可以直接使用设备 主机名.lan

需要 登录 后方可回复, 如果你还没有账号请 注册新账号